Помощь - Поиск - Пользователи - Календарь
Полная версия: Поиск в Listbox
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Kodov
Такой вопрос: как организовать поиск в ListBox? Нужно также, как и в Блокноте - Найти и Найти далее. На форме кнопка Найти, Edit1, в котором я ввожу, то что надо найти, и сам ListBox1. И когда я жму Найти, должна выделиться строка, в которой присутствуют слова, введенные Edit1. Мне нужно частичное совпадение.
Мне подсказали вот что:
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;

Но если в ListBox более 300 элементов, программа просто зависает, при попытке найти, к примеру - последний элемент.
Как с этим бороться?
И какие еще у вас есть идеи по поводу поиска в ListBox?
Заранее спасибо.

Теги используй...
volvo
Цитата(DRKB)
Как осуществить быстрый поиск в Listbox?

Очень просто, смотри пример....
считаем, что есть поле Edit1, в котором набираем текст, и ListBox, в котором ищем нужную строку, (как в Нelp).

procedure TForm1.Edit1Change(Sender: TObject); 
begin 
  ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text))); 
end;


И мой тебе совет, скачай все-таки DRKB... Огромное количество информации... yes2.gif
Kodov
Цитата(volvo @ 18.02.2006 13:43) *

И мой тебе совет, скачай все-таки DRKB... Огромное количество информации... yes2.gif

Я использовал этот метод, но он ищет по первым символам, а мне нужно частичное совпадение.
Romikgy
Цитата(Kodov @ 19.02.2006 18:29) *

Я использовал этот метод, но он ищет по первым символам, а мне нужно частичное совпадение.

Что такое частично совпадение?
Kodov
Это значит, что если, к примеру, у тебя есть элемент с названием "Rambler", то ты можешь ввести в строке
поиска "ler" и программа выделит этот элемент.
Romikgy
Цитата(Kodov @ 23.02.2006 11:09) *

Это значит, что если, к примеру, у тебя есть элемент с названием "Rambler", то ты можешь ввести в строке
поиска "ler" и программа выделит этот элемент.

Тогда для этого надо юзать AnsiStrPos, StrPos, и перебирать все пункты листбокса по очереди то нахождения нужного.
volvo
kodov,
не знаю уж чего у тебя там
Цитата
просто зависает
, вот этот фрагмент:
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  flag: boolean;
  dnCase: string;
begin
  i := n; flag := false;
  dnCase := LowerCase(Edit1.Text); // Сокращаем работу - не делать же ЭТО в цикле
  repeat
    if Pos(dnCase, LowerCase(ListBox1.Items.Strings[i])) > 0 then begin
      Listbox1.Selected[i] := true;
      n := i;
      flag := true;
    end
    else inc(i);

  // Заметь, НЕ до (Count - 1), иначе ты просто никогда последний элемент не найдешь
  until (i = ListBox1.Count) or flag; 
end;

отрабатывает меньше чем за полсекунды на списке из 1000 элементов...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.