Keresés listából előválasztással

 

            Ha egy programban hosszú stringlistából (például névsorból) kell elemet kiválasztanunk, akkor sem a TListBox, sem TComboBox típusú vezérlők nem adnak erre maximális segítséget. Kívánatos lenne, hogy a kereső input mezőbe való beírás közben, a listából már csak azokat az elemeket lássuk a vezérlőben, amelyek eleje a beírt szöveggel megegyezik. Így várhatóan egyre rövidebb a megjelenített lista, megkönnyítve ezzel keresést, majd kiválasztást. Oldjuk meg ezt az egyszerű feladatot egy formon.

 

            A feladat megnevezését hordozó címke mellett a következő elemeket fogjuk használni: egy TEdit mező a keresendő szöveg fogadására, egy TList elem a szűrt lista megjelenítésére, egy nem látható TList elemet a teljes lista tárolására. A listát string-tömbben fogjuk tárolni, és az egyszerűség végett véletlen választással fogjuk feltölteni. Szükség lesz még egy Új lista létrehozására és a programból való Kilépés-re alkalmas nyomógombokra. Két TLabel elemen jelenítjük meg a lista aktuális hosszát, valamint kiválasztás után az elem eredeti indexét.

 

            Lássunk néhány futtatási képet. Futtatás után először ezt láthatjuk:

 

 

            Ha elkezdjük beírni a keresendő stringet, minden újabb karakterre a lista szűkül:

 

 

            Végül a megjelenők közül a keresettre kattintva megkapjuk, hogy a teljes listában hányadik elemet kerestük:

 

 

A programból való kilépés nélkül új listát kérhetünk. Valós környezetben természetesen a tömbben kell elhelyezni a böngészendő stringlistát.

 

A program listája:

 

unit UListSel;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses

  GraphicsControlsForms, DialogsStdCtrls;

type
  TfmListSel = class(TForm)
    lbListSelTLabel;
    edListSelTEdit;
    ldListSelTListBox;
    btUjListTButton;
    btKilepesTButton;
    lbIndexTLabel;
    ldShadowTListBox;
    lbListHTLabel;
    Procedure UjLista;
    procedure FormCreate(SenderTObject);
    procedure edListSelChange(SenderTObject);
    procedure btKilepesClick(SenderTObject);
    procedure btUjListClick(SenderTObject);
    procedure ldListSelClick(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;


Const Max=10000;

var
  fmListSelTfmListSel;
  Lista: Array[1..Max] Of String;

implementation

{$R *.dfm}

procedure TfmListSel.btKilepesClick(SenderTObject);
begin
  Close;
end;

Procedure TfmListSel.UjLista;
Var I, J: Word;
Begin
  edListSel.Text:= ''; lbIndex.Caption:= '0'; ldShadow.Clear;
  With ldListSel Do
  Begin
    Clear;
    For I:= 1 To Max Do
    Begin
      Lista[I]:= '';
      For J:= 1 To Random(24)+6 Do Lista[I]:= Lista[I]+Chr(97+Random(26));
      Items.Add(Lista[I]);
      ldShadow.Items.Add(Lista[I]);
    End;
    lbListH.Caption:= IntToStr(Items.Count);
  End;
End;

procedure TfmListSel.FormCreate(SenderTObject);
begin
  UjLista;
end;

procedure TfmListSel.edListSelChange(SenderTObject);
Var I: Word;
begin
  With edListSel Do With ldListSel Do
  Begin
    Clear;
    For I:= 1 To Max Do If Text<>'' Then
    Begin If Pos(Text,Lista[I])=1 Then Items.Add(Lista[I]) End
    Else Items.Add(Lista[I]);
    lbListH.Caption:= IntToStr(Items.Count);
  End;
  lbIndex.Caption:= '0';
end;

procedure TfmListSel.btUjListClick(SenderTObject);
begin
  UjListaedListSel.SetFocus;
end;

procedure TfmListSel.ldListSelClick(SenderTObject);
begin
  With ldListSel Do With edListSel Do
  Begin
    Text:= Items[ItemIndex];
    lbIndex.Caption:= IntToStr(ldShadow.Items.IndexOf(Text));
  End;
end;

end.