Delphi FAQ

Jak zrobić program na zasadzie helpa - wyszukuje żądaną pozycję

Adam Boduch

Oto jedna najważniejsza procedura:

procedure TMainForm.edtSearchKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i, Found : Integer;
begin
  for I := 0 to lbSearchStrings.Items.Count -1 do  // analizuj wszystkie pozycje
  begin
    Found := Pos(edtSearch.Text, lbSearchStrings.Items[i]); // szukaj ciagu znakow
    if (Found > 0) and (lbSearchStrings.Items[i][1] = edtSearch.Text[1]) then
    begin
      lbSearchStrings.ItemIndex := i; // jezeli znaleziono to zaznacz
      Break; // i przerwij dzialanie petli
    end;
  end;
end;
FAQ

2 komentarzy

Wprowadziłem kilka ulepszeń:

  1. wprowadzając znaki do edtSearch.Text nie trzeba się martwić już o ich wielkość
  2. gdy nie znajdzie pasującego elementu usuwa zaznaczenie
  3. wyświetla znaleziony element zawsze na początku listy (bardzo przydatne dla dużych list)
 
procedure TBaza.edtSearchKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  i, Found : Integer;
  sSearch, sText : String;
begin
  sSearch := AnsiLowerCase(edtSearch.Text); {zmieniam na małe znaki szukany tekst }
  if (sSearch = '') then Exit; {wychodze bo gdy pusty edtSearch.Text to po co szukać }
  for I := 0 to lbSearchStrings.Items.Count -1 do
  begin
    sText := AnsiLowerCase(lbSearchStrings.Items[i]); {dla prawidłowego szukania POS() również trzeba zmienić wielkość znaków elementu z listy }
    Found := Pos(sSearch, sText);
    if (Found = 1) then { zapewnia zaznaczanie zawsze prawidłowego pola, które rozpoczyna się od szukanego tekstu }
    begin
      lbSearchStrings.ItemIndex := i;
      lbSearchStrings.TopIndex := i;  { ustaw znaleziony element jako pierwszy w liście, bardzo przydatne np przy wieloelementowej liście }
      Break;
    end
    else
      lbSearchStrings.ItemIndex := -1; { gdy nie znajduje żadnego pasującego to usuwam zaznaczenie w liście }
  end;
end;

A co to to "klikacając tu"?
jakoś nie widze linka :)