Wyszukiwanie przyrostowe

0

Mam problem z wyszukiwaniem w listbox przy jego ustawionym stylu lbVirtual. Chodzi o to, że nie zaznacza się pozycja podczas wyszukiwania.

var
MojaLista : TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Mojalista := TStringlist.Create;
 MojaLista.LoadFromFile(ExtractFilePath(Application.ExeName)+'cos.txt');
 ListBox1.Style := lbVirtual;
 ListBox1.Count := MojaLista.Count;
end;

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
  var Data: String);
begin
 Data := MojaLista[Index];
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Mojalista.Free;
end;

Poniższy kod nie działa

s - zmienna szukana

ListBox1.ItemIndex := SendMessage(ListBox1.Handle,LB_FINDSTRING, -1,Longint(PChar(s)));

albo

ListBox1.ItemIndex := ListBox1.Items.IndexOf(s);
0

Najpierw by wypadało sprawdzić co zwraca SendMessage z takimi parametrami; Jeśli zwraca wartość indeksu, pod którym faktycznie znajduje się szukany ciąg to znaczy, że działa; A z kolei jeśli indeks się zgadza, to spróbuj zaznaczyć tą pozycję ręcznie:

ListBox1.Selected[ListBox1.ItemIndex] := True;

Może to coś pomoże, może nie; Sprawdź przynajmniej czy indeks się zgadza;

0

Wskazuje wciąż index -1 tak jakby wyszukana pozycja nie znajdowała się w listbox :(

0

Jeżeli chodzi o samo wyszukiwanie z takimi parametrami i ustawienie Msg jako LB_FINDSTRING - dostaniesz indeks pozycji tylko wtedy, gdy cały ciąg będzie pasował do wzorca (lParam); Funkcja wtedy nie rozróżnia wielkości znaków (CaseSensitive = False), ale sprawdza tylko całe ciągi (WholeWordsOnly = True); Nie znajdziesz słowa, które jest umiejscowione wewnątrz danego łańcucha; To tak, jakby sprawdzanie odbywało się taką komendą:

{...}

if UpperCase(ListBox1.Items.Strings[I]) = UpperCase(lParam) then
  begin
    Result := I;
    Break;
  end;

{...}

Jeśli dalej nie będzie Ci wychodziło to napisz własną funkcję, która będzie realizować to zadanie; Przy okazji będziesz mógł wyposażyć ją w dodatkowe opcje;

0

To są same liczby, więc upercase niepotrzebne. Zresztą na stylu standardowym wyszukuje Od razu. Problem pojawia się przy lbvirtual.

0

Nie chce mi się aż tak googlować jak wyszukiwac przy stylu virtual. Jednak jeżeli używasz TStringList do wczytania to Rozwiązanie widzę takie.

  ListBox1.ItemIndex := MojaLista.IndexOf('tekst');

I zwalnianie MojaLista w OnClose na przykład.

  1. Napisanie własnej funkcji, która jako parametry przyjmuje TListBox oraz tekst do wyszukania, a zwracającej na początek -1, zaś w pętli od 0 do ListBox.Count - 1 ...przeszukujących Itemy ListBox, po znalezieniu Itema robisz Result := Zmienna_Iteracyjna_Petli; oraz Break;. Tak podobnie działa funkcja wyszukiwania po IndexOf dla TStringList. Więc żaden to chyba problem takie coś napisać, bo to banał, a rozwiązanie będzie według mnie skuteczne, a chyba o to chodzi lub powinno chodzić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1