Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск в ListBox


Автор: ekodov 26.10.2005, 12:00
Такой вопрос: как организовать поиск в ListBox? Нужно также, как и в Блокноте - Найти и Найти далее. На форме кнопка Найти, Edit1, в котором я ввожу, то что надо найти, и сам ListBox1. И когда я жму Найти, должна выделиться строка, в которой присутствуют слова, введенные Edit1. Заранее спасибо. smile

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

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

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 на котором остановился.

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

Мне нужно частичное совпадение. Я знаю, что нужно проверять входит ли моя подстрока в какой-либо из Items'ов, но не знаю как это осуществить.

Автор: MFSham 26.10.2005, 20:56
Цитата(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;


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

все.

Автор: ekodov 29.10.2005, 10:59
Спасибо всем. В особенности MFSham'у.

Автор: ekodov 2.11.2005, 18:39
to MFSham
Прошу прощения. Еще один вопрос. Нужно, чтобы, если ничего не найдено, выводилось 'Ничего не найдено'. Я пытался и так, и сяк внедрить это в ваш код, но не получалось.

Автор: Albinos_x 2.11.2005, 20:11
Код

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

Автор: ekodov 18.1.2006, 13:46
Но если в ListBox более 300 элементов, программа просто зависает, при попытке найти, к примеру - последний элемент.
Как с этим бороться?

Автор: _hunter 18.1.2006, 14:03
не хранить там 300 элементов.

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

Автор: darkart 18.1.2006, 14:32
Во-первых
Цитата

  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
к примеру, если надо вести поиск по первым символам, то лучше отсортировать информацию и воспользоваться (к примеру) бинарным поиском

Автор: Alexeis 18.1.2006, 14:36
Цитата

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)