Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в ListBox, Как найти строку в ListBox 
:(
    Опции темы
ekodov
Дата 26.10.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такой вопрос: как организовать поиск в ListBox? Нужно также, как и в Блокноте - Найти и Найти далее. На форме кнопка Найти, Edit1, в котором я ввожу, то что надо найти, и сам ListBox1. И когда я жму Найти, должна выделиться строка, в которой присутствуют слова, введенные Edit1. Заранее спасибо. smile
PM MAIL   Вверх
Bose
Дата 26.10.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



если тебе нужно полное совпадение (т.е. поиск по полной строке), то воспользуйся методом IndexOf
"Номер Нужной строки":=ListBox1.Items.IndexOf('текст для поиска'). Если нужно частичное совпадение, то перебирай все Items у ListBoxa и проверяй, входит ли твоя подстрока в какой-либо из Items'ов smile
PM MAIL WWW Skype   Вверх
Satana
Дата 26.10.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вот примерно так (это будет искаться первый из всех)
Код

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
  for i := 0 to ListBox1.Items.Count-1 do
    begin
      if ListBox1.Items.Strings[i]=Edit1.Text then ListBox1.Selected[i]:=true;

    end;

end;

Для того чтобы дальше искалось тебе нужно будет продолжать поиск с того i на котором остановился.


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
ekodov
Дата 26.10.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Bose @ 26.10.2005, 12:07)
если тебе нужно полное совпадение (т.е. поиск по полной строке), то воспользуйся методом IndexOf
"Номер Нужной строки":=ListBox1.Items.IndexOf('текст для поиска'). Если нужно частичное совпадение, то перебирай все Items у ListBoxa и проверяй, входит ли твоя подстрока в какой-либо из Items'ов smile

Мне нужно частичное совпадение. Я знаю, что нужно проверять входит ли моя подстрока в какой-либо из Items'ов, но не знаю как это осуществить.
PM MAIL   Вверх
MFSham
Дата 26.10.2005, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ekodov @ 26.10.2005, 19:54)
Мне нужно частичное совпадение. Я знаю, что нужно проверять входит ли моя подстрока в какой-либо из Items'ов, но не знаю как это осуществить.

Попробуй так :
Код

var
  Form1: TForm1;
  n : byte;
...............
procedure TForm1.BtnFindClick(Sender: TObject);
var
    i: byte;
    flag: boolean;
begin
    i:=0;
    flag:=false;
    repeat
       if Pos(LowerCase(Edit1.Text),LowerCase(ListBox1.Items.Strings[i]))<>0 then
         begin
            Listbox1.Selected[i]:=true;
            n:=i;
            flag:=true;
         end;
       inc(i);
    until (i=ListBox1.Count-1) or (flag=true);
end;

procedure TForm1.BtnFindNextClick(Sender: TObject);
var
    i : byte;
begin
    for i:=n+1 to ListBox1.Count-1 do
      begin
          if Pos(LowerCase(Edit1.Text),LowerCase(ListBox1.Items.Strings[i]))<>0 then
          begin
            Listbox1.Selected[i]:=true;
            n:=i;
            break;
          end;
      end;
end;


--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
_hunter
Дата 27.10.2005, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



ekodov, как итем получить по индексу знаеш?
( ListBox1.Items[i] )
как число их получить? ( ListBox1.Count )
соответственно запускаем цикл и для всех итемов делаем
if ( ListBox1.Items[i].Pos(строка) > 0 )
входит

все.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ekodov
Дата 29.10.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем. В особенности MFSham'у.
PM MAIL   Вверх
ekodov
Дата 2.11.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to MFSham
Прошу прощения. Еще один вопрос. Нужно, чтобы, если ничего не найдено, выводилось 'Ничего не найдено'. Я пытался и так, и сяк внедрить это в ваш код, но не получалось.
PM MAIL   Вверх
Albinos_x
Дата 2.11.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Код

...
   inc(i);
    until (i=ListBox1.Count-1) or (flag=true);
if not flag then MessageDlg('Строка не найдена',mtInformation,[mbOk],0);
end;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
ekodov
Дата 18.1.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Но если в ListBox более 300 элементов, программа просто зависает, при попытке найти, к примеру - последний элемент.
Как с этим бороться?
PM MAIL   Вверх
_hunter
Дата 18.1.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



не хранить там 300 элементов.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 18.1.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ускорить поик можно только если есть некоторая информация об элементах.
Добавлено @ 14:16
например сортировать их по каким то признакам.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
darkart
Дата 18.1.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Во-первых
Цитата

  inc(i);
    until (i=ListBox1.Count-1) or (flag=true);{здесь не учитывается последний эл-т}
if not flag then MessageDlg('Строка не найдена',mtInformation,[mbOk],0);
end;

исправь на
Код

   inc(i);
    until (i>ListBox1.Count-1) or (flag=true);{i=ListBox1.Count}
if not flag then MessageDlg('Строка не найдена',mtInformation,[mbOk],0);
end;

Во-вторых
см. пост alexeis1
к примеру, если надо вести поиск по первым символам, то лучше отсортировать информацию и воспользоваться (к примеру) бинарным поиском
PM MAIL WWW ICQ Skype GTalk   Вверх
Alexeis
Дата 18.1.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата

until (i>ListBox1.Count-1) or (flag=true);

зачем две проверки красивее будет
Код

until (i>ListBox1.Count-1) or flag;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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