BMW 5 Series 2016-2024 Training Manual.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ListBox и поиск в нем, Срочно нужна помощь !!!
Aptem
  Отправлено: 19.03.2004, 04:36


Мастер участка

Группа: Участник
Сообщений: 349



Привет, народ!

У меня такая проблема:

На форме есть ListBox, в нем предположим строк 300, например, названия фильмов ( все отсортировано ). Под ListBox'ом находится Edit. Если я пишу в Edit букву 'Б', то в ListBox'е курсор ( синяя полоска ) устанавливается на первом фильме, начинающейся с буквы 'Б'. Если я продолжаю вводить буквы и ввожу букву 'У' ( то есть получается 'БУ' ), то в курсор устанавливается уже на фильмах, где первая и вторая буква соответсвенно 'Б' и 'У', то есть 'БУ'. И так далее... Вообщем, как в любом help'е.

Надеюсь все понятно...

А теперь вопрос: КАК ЭТО ВСЕ СДЕЛАТЬ ????

Огромное всем спасибо за внимание. Надеюсь на помощь!

Отредактировано Aptem — 19/03/2004, 05:41
Gedeon
Отправлено: 19.03.2004, 14:34


Ветеран

Группа: Модератор
Сообщений: 1742



А каким образом заносятся данные в ListBox?
th1nG
Отправлено: 19.03.2004, 20:26


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE (Gedeon @ 19/03/2004, 15:36)
А каким образом заносятся данные в ListBox?

ListBox1->Items->Add("Какойто текст");

Артём, пробуй так:
CODE

//--------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
       if(ListBox1->Items->Count > 0)
       {//если в списке чото есть
       for(int i=0;i<ListBox1->Items->Count;i++)//начинаем перебирать список
       {
               if(ListBox1->Items->Strings[i].SubString(0,Edit1->Text.Length()) == Edit1->Text)//если первые буквы элемента списка и строки ввода совпадают:
               {
                                  ListBox1->Selected[i] = true;///выделяем этот элемент
               }
               else                      //иначе(если нет таких)
               {
                       ListBox1->Selected[i] = false;//не выделено.   =))

               }
       }
       }

}
//----------------------------
th1nG
Отправлено: 19.03.2004, 20:27


Дежурный стрелочник

Группа: Участник
Сообщений: 31



забыл сказать.. поставь MultySelect = true
th1nG
Отправлено: 19.03.2004, 20:29


Дежурный стрелочник

Группа: Участник
Сообщений: 31



будет выглядеть так..

Присоединить изображение

Присоединить изображение

Aptem
Отправлено: 22.03.2004, 04:15


Мастер участка

Группа: Участник
Сообщений: 349



Все просто супер, то что надо... ОГРОМНОЕ СПАСИБО th1nG ! Работает как часы !!!
darek
Отправлено: 25.03.2004, 20:39


Не зарегистрирован







Спасибо всем большое кто помог. Но есть ещё одна проблема: Как имитировать нажатие крысой на выделенные поиском объекты в ListBox'e ?
th1nG
Отправлено: 25.03.2004, 22:44


Дежурный стрелочник

Группа: Участник
Сообщений: 31



хм.. не много не догнал..
т.е. как тока часть текста элемента листбокса совпадает с текстом строки ввода??
если так то просто обрабатывай это событие..
т.е. делай не Items->Selected[int] == true; а любой обработчик..
>> в тваём случае ListBox1->Click(); или както так..
опишы подробнее чо именно ты хочеш реализовать.
** Darek
Отправлено: 26.03.2004, 21:32


Не зарегистрирован







с тем я уже разобрался. Но есть ещё одна небольшая проблема: ну написал я в поиксе то, что мне надо, он нашёл. Но ведь можно вводить и не полное слово а только часть. И что надо написать чтобы когда написал не полное слово, он в Edit'e написал полное, т.е. как на самом деле написано в ListBox'e. Спасибо!
th1nG
Отправлено: 28.03.2004, 08:06


Дежурный стрелочник

Группа: Участник
Сообщений: 31



CODE

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
      if(ListBox1->Items->Count > 0)
      {//если в списке чото есть
      for(int i=0;i<ListBox1->Items->Count;i++)//начинаем перебирать список
      {
              if(ListBox1->Items->Strings[i].SubString(0,Edit1->Text.Length()) == Edit1->Text)//если первые буквы элемента списка и строки ввода совпадают:
              {
                                 ListBox1->Selected[i] = true;///выделяем этот элемент

   
//если нашлось явно то что нада :)
if(ListBox1->SelCount == 1)
    {
         Edit1->Text = ListBox1->Items->Strings[i];   // вроде всё.
    }
 
              }
              else                      //иначе(если нет таких)
              {
                      ListBox1->Selected[i] = false;//не выделено.   =))

              }
      }
      }

}
//----------------------------


Отредактировано th1nG — 28/03/2004, 09:13

Вернуться в Вопросы программирования в C++Builder