Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в ListBox, без точного названия искомого 
V
    Опции темы
Kirgston
Дата 10.4.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Всем доброго времени суток! Вот пишу программку... сделать простой поиск с точным поиском , скажем я ввел в едит "Привет" и найти это в ЛистБоксе (ЛБ) , я могу... но вышла проблемка. Хочеться круче =) а именно... чтобы скажем я ввел букву "П" и оно мне выдало первый вариант с буквой "П" , ввел "Пр" и выдало первый вариант с буквами "Пр" . Но скажем слово в ЛБ может быть и полностью "Привет", но чтобы поиск искал по запросу букв что в едите но показывал первый возможный вариант.

Дело в том что я как то представляю как это сделать... а вот как перебрать строки в ЛБ не понимаю...
PM MAIL   Вверх
Anikmar
Дата 10.4.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Kirgston @  10.4.2009,  23:05 Найти цитируемый пост)
а вот как перебрать строки в ЛБ не понимаю... 

Так там свойство Items по-моему обычный TStrings. В чем трудность с перебором, я не понимаю.
PM MAIL ICQ   Вверх
Данкинг
Дата 10.4.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Код

for (int i = 0; i <= ListBox.Items.Count-1; i++) 

 smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
THandle
Дата 11.4.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Вот так прям себе представил: большой списочек в ListBox, а при вводе буквы в Edit начинается поиск...

ИМХО, просто перебор даст очень не слабую тормознутость. Тут, мне кажется, надо разделять работу на потоки, иначе может получится не очень приятно для пользователя.
PM   Вверх
artsb
Дата 11.4.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



THandle прав: будет жёстко виснуть. Так что, без потока не обойтись.

Кстати, как вариант, можно заюзать ComboBox с Style = csSimple. По-моему, как раз то, что вам нужно.  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(THandle @  11.4.2009,  09:04 Найти цитируемый пост)
Вот так прям себе представил: большой списочек в ListBox, а при вводе буквы в Edit начинается поиск...

ИМХО, просто перебор даст очень не слабую тормознутость.
На паре тысяч позиций будет еще сносно, а больше - что это за списочек такой? Тут менять подход надо.

Цитата(artsb @  11.4.2009,  09:43 Найти цитируемый пост)
THandle прав: будет жёстко виснуть. Так что, без потока не обойтись.
Пример: 1С без тормознутости работает с достаточно большими списками, так что наворачивать отдельный поток на мой взгляд излишне.


PM MAIL ICQ   Вверх
Kirgston
Дата 11.4.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ребята... да я уже прикинул как но! ... да я понимаю что там простой стрингс... но как к нему обращаться? Если скажем

for (ListBox1->Items->Strings[i] ; ListBox1->Items->Count-1; i++ )

Так мне что обращаться к нему

ListBox1->Items->Strings[i][i] ? Ну первый отвечает за строчку... за строчку в ЛБ. Но и в переменной AnsiString string элемент string[i] отвечает за номер буквы . Так что мне тогда писать? оО

ListBox1->Items->Strings[i][i]? Или ListBox1->Items->Strings[i[i]] ? 
PM MAIL   Вверх
THandle
Дата 11.4.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Цитата(Kirgston @  11.4.2009,  12:44 Найти цитируемый пост)

for (ListBox1->Items->Strings[i] ; ListBox1->Items->Count-1; i++ )


Это что вообще за бред? Strings[i] - это строка!!!

Обращаться так к символу...:

Цитата(Kirgston @  11.4.2009,  12:44 Найти цитируемый пост)
ListBox1->Items->Strings[i][i]



Kirgston, все таки настоятельно советую поучить язык.

Цитата(Anikmar @  11.4.2009,  11:42 Найти цитируемый пост)
сносно


А надо чтобы не сносно, а очень даже нормально. Например ситуация. Список в 2-3 тысячи строк и быстро вводить буквы - тормозить будет.
PM   Вверх
_Dimon_
Дата 11.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 1



Может стоит заюзать БД для таких целей. У меня база на несколько сотен тисяч записей, контекстный поиск почти моментальный.
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(THandle @  11.4.2009,  11:50 Найти цитируемый пост)
Это что вообще за бред? Strings[i] - это строка!!!

Это не бред - это перебор строк  smile 
Нужно пробежаться по строкам, а в каждой строке по буквам.

Цитата(THandle @  11.4.2009,  11:50 Найти цитируемый пост)
А надо чтобы не сносно, а очень даже нормально. Например ситуация. Список в 2-3 тысячи строк и быстро вводить буквы - тормозить будет.

Я задачи-то не знаю. Не будет тормозить, если список разумного размера. А если несколько тысяч строк, то тормозить будет даже когда его заполняешь.

PM MAIL ICQ   Вверх
artsb
Дата 11.4.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Kirgston, похоже, вы мой пост не читали...
Повторюсь:
Цитата(artsb @  11.4.2009,  09:43 Найти цитируемый пост)
можно заюзать ComboBox с Style = csSimple.

(не забудьте растянуть ComboBox по высоте).

Там как раз реализовано то, что вам нужно. Единственно, вас может не устроить то, что поле для ввода находится прямо над списком. Хотя, кто знает...

Добавлено через 3 минуты и 47 секунд
Кстати, первая тема из списка ниже. Там решали подобную задачу.
В итоге, остановились на этом:
Код

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    int l = Edit1->Text.Length();
    for(int i = 0; i < ListBox1->Count; ++i)
    {
        if(ListBox1->Items->Strings[i].SubString(1,l)==Edit1->Text)
        {
            //ListBox1->SetFocus();
            ListBox1->ItemIndex=i;
            break;
        }
    }
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Кстати все это будет нормально работать только на отсортированных списках.

PM MAIL ICQ   Вверх
Kirgston
Дата 11.4.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



[яуоте=ТХандле, 11.4.2009,  11:50, пост1839604]Это что вообще за бред? Стрингс[и] - это строка!!![/яуоте]
Да я знаю что это строка =) это я привел кусок видимо не тот =)

Списочек будет из 200-300 максимум. Да нет если надо будет оптимизировать это скажем я уже сделаю. Просто был вопрос как работать. Потому что просто не понимал как писать
ListBox1->Items->Strings[i][i]? Или ListBox1->Items->Strings[i[i]] ? 

Язык тут не при чем =) тут больше сама среда. 

З.Ы. а я книги постоянно читаю =)


Цитата(artsb @  11.4.2009,  13:37 Найти цитируемый пост)
(не забудьте растянуть ComboBox по высоте).Там как раз реализовано то, что вам нужно. Единственно, вас может не устроить то, что поле для ввода находится прямо над списком. Хотя, кто знает...

хм... щас попробую =) надеюсь подойдет. Какой бы нибыл мой цыкл (аля ф-ция) но разработчикам больше доверяю =)
Цитата(Anikmar @  11.4.2009,  12:35 Найти цитируемый пост)
Я задачи-то не знаю. Не будет тормозить, если список разумного размера. А если несколько тысяч строк, то тормозить будет даже когда его заполняешь.

Да если до тысячи дойдет то это уже будет фантастика =) всё в разумных пределах =)
PM MAIL   Вверх
Anikmar
Дата 11.4.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Kirgston @  11.4.2009,  13:51 Найти цитируемый пост)
 Или ListBox1->Items->Strings[i[i]]

Ну точно не так  smile 
PM MAIL ICQ   Вверх
Kirgston
Дата 12.4.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ребята помогите пожалуйста ещё с одной проблемкой... 
Надо чтобы свич проверял что написано в ЛБ и в соответствии с этим делал "Н" команду... застрял на:

switch (PList->Items->Strings[PList->ItemIndex])
пишет: 
[BCC32 Error] Unit1.cpp(138): E2383 Switch selection expression must be of integral type
[BCC32 Error] Unit1.cpp(248): E2096 Illegal structure operation

как я понимаю свич работает нормально с чаром, с стрингом уже не хочет. Или что тут не так? Заранее очень благодарен!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.