Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.227.21.21] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. Из xls файла загружаю в ListBox некий (достаточно большой) список. Далее в Edit ввожу подстроку. Можно ли организовать некий поиск в ListBox по подстроке. Использовать ListBox не обязательно, можно что-то другое, лишь бы данные отображались и их можно было выделить. Переводить данные в нормальную БД не стоит, т.к. в целом задача не большая.
|
Сообщ.
#2
,
|
|
|
Подстрока - с начала строки? Тогда можно SendMessage(LBHandle, LB_FINDSTRING, -1, (LPARAM)substring)
Иначе - только тупым перебором и strstr() или подобной |
Сообщ.
#3
,
|
|
|
ListBox->Items->Strings - ищи че хочешь.
|
Сообщ.
#4
,
|
|
|
Цитата shm @ ListBox->Items->Strings Получается все строки перебрать надо? |
Сообщ.
#5
,
|
|
|
Цитата AnsiString::AnsiPos AnsiString See also Returns the index at which the specified substring begins. int __fastcall AnsiPos(const AnsiString& subStr) const; Description Returns the index in the AnsiString at which the substring subStr begins, where 1 is the first character in the string, 2 is the second character, and so on. If the substring is not contained in the AnsiString, Pos returns 0. This member function is the same as Pos but supports multibyte character strings. Note: See ByteType for more information about multibyte characters. Добавлено Цитата sten_11 @ Получается все строки перебрать надо? Да. Но если загнать в Мемо то весь текст. А не проще при загрузке из xls фильтровать нужное? |
Сообщ.
#6
,
|
|
|
Цитата Bas @ А не проще при загрузке из xls фильтровать нужное? Нет. Я хотел реализовать что-то типа: void __fastcall TForm1::Edit1Change(TObject *Sender) { POISK = Edit1->Text.Trim(); ... select *from table where param like(%POISK %); } |
Сообщ.
#7
,
|
|
|
Создаем второй ListBox2
void __fastcall TForm1::Edit1Change(TObject *Sender) { int i=0; ListBox *LName; LFind= new ListBox(); while (i<ListBox1->Items->Count) { if (ListBox1->Items->Strings.AnsiPos( Edit1->Text.Trim())>=0) LFind->Items->Add(ListBox1->Items->Strings[i]) i++; } //select *from table where param like(%POISK %); } Что то типа? Не забудем удалить после new. |
Сообщ.
#8
,
|
|
|
Цитата sten_11 @ select *from table where param like(%POISK %); Такое средствами ListBox не сделать. Однако, можно поробовать открыть твою таблицу через ADO, а там есть и SQL и DBListBox. |
Сообщ.
#9
,
|
|
|
select *from table where param like(%POISK %); Я так понимаю это вообще команда к SQL, причем тут ListBox ???? |
Сообщ.
#10
,
|
|
|
void __fastcall TForm1::Edit1Change(TObject *Sender) { for(int i = 0; i < ListBox1->Items->Count; i++) { if (ListBox1->Items->Strings.AnsiPos(Edit1->Text.Trim())>=0) { ListBox1->ItemIndex = i; break; } } } |
Сообщ.
#11
,
|
|
|
Цитата Dem_max @ Я так понимаю это вообще команда к SQL, причем тут ListBox ???? Дело в том, что я не хочу в рамках этой задачи связываться с БД. Просто на БД я бы использовал скрипт, а тут мне надо реализовать его аналог. |
Сообщ.
#12
,
|
|
|
ListBox1-исходные данные, невидимый
ListBox2-результат выборки, видимый void __fastcall TForm1::Edit1Change(TObject *Sender) { int i=0; ListBox2->Items->Clear(); while (i<ListBox1->Items->Count) { if (ListBox1->Items->Strings.AnsiPos( Edit1->Text.Trim())>=0) ListBox2->Items->Add(ListBox1->Items->Strings[i]) i++; } |
Сообщ.
#13
,
|
|
|
Цитата Bas @ Создаем второй ListBox2 Это идея. Попробовал так, но не вышло. void __fastcall TForm1::Edit1Change(TObject *Sender) { ListBox2->Clear(); int i=0; while (i<ListBox1->Items->Count) { if (ListBox1->Items->Strings[i].AnsiPos( Edit1->Text.Trim())>=0) ListBox2->Items->Add(ListBox1->Items->Strings[i]); i++; } } Создается второй список полностью аналогичный первому. |
Сообщ.
#14
,
|
|
|
а слона-то никто и не заметил. AnsiPos возвращает > 0, если находит
|
Сообщ.
#15
,
|
|
|
Цитата Relaxander @ а слона-то никто и не заметил да ни кто и не смотрел... вроде автора перебор не устраивал, а теперь вроде поменял мнение. |
Сообщ.
#16
,
|
|
|
А все получилось, надо было к регистру общему привести
|
Сообщ.
#17
,
|
|
|
Цитата sten_11 @ Дело в том, что я не хочу в рамках этой задачи связываться с БД на билдере это нск. строк кода. |
Сообщ.
#18
,
|
|
|
Цитата shm @ вроде автора перебор не устраивал, а теперь вроде поменял мнение. А что делать )) Добавлено Итого получилось void __fastcall TForm1::Edit1Change(TObject *Sender) { ListBox2->Clear(); int i=0; bool compre = false; while (i<ListBox1->Items->Count) { compre = ListBox1->Items->Strings[i].Pos(Edit1->Text.Trim()); if (compre) { ListBox2->Items->Add(ListBox1->Items->Strings[i]); } compre = false; i++; } } Принимаю более оптимальные коды. Добавлено В догонку. Как в Мемо вывести строку из ListBox на которой активный курсор. Можно по двойному клику на ListBox . |
Сообщ.
#19
,
|
|
|
Цитата sten_11 @ более оптимальные коды а почему compre - bool и зачем compre = false? |
Сообщ.
#20
,
|
|
|
Цитата Relaxander @ а почему compre - bool и зачем compre = false? Справедливо if (ListBox1->Items->Strings[i].Pos(Edit1->Text.Trim())) |
Сообщ.
#21
,
|
|
|
Цитата Relaxander @ а слона-то никто и не заметил. AnsiPos возвращает > 0, если находит По памяти писал, спутал наверное с -1. |
Сообщ.
#22
,
|
|
|
Народ, простите что тему старую поднимаю. Мне пригодилась эта ветка. Но появился вопрос. Есть ли возможность из этого кода убрать чувствительность к регистру?
У меня получилось только привести всё к нижнему регистру. Но некоторые люди и грамотно пишут и будут писать первую букву большую. Тогда фильтрация уже не срабатывает. ListBox2->Clear(); int i=0; bool compre = false; while (i<ListBox1->Items->Count) { compre = ListBox1->Items->Strings[i].LowerCase().Pos(Edit1->Text.Trim()); if (compre) { ListBox2->Items->Add(ListBox1->Items->Strings[i]); } compre = false; i++; } |
Сообщ.
#23
,
|
|
|
Убрать чувствительность, это так:
ListBox2->Clear(); int i = 0; while( i<ListBox1->Items->Count ) { int compre = ListBox1->Items->Strings[i].LowerCase().Pos( Edit1->Text.LowerCase().Trim() ); if( compre ) ListBox2->Items->Add( ListBox1->Items->Strings[i] ); i++; } |
Сообщ.
#24
,
|
|
|
И как я сам не додумался Спасибо. Отлично работает.
|