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, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmListSel = class(TForm)
lbListSel: TLabel;
edListSel: TEdit;
ldListSel: TListBox;
btUjList: TButton;
btKilepes: TButton;
lbIndex: TLabel;
ldShadow: TListBox;
lbListH: TLabel;
Procedure UjLista;
procedure FormCreate(Sender: TObject);
procedure edListSelChange(Sender: TObject);
procedure btKilepesClick(Sender: TObject);
procedure btUjListClick(Sender: TObject);
procedure ldListSelClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const Max=10000;
var
fmListSel: TfmListSel;
Lista: Array[1..Max] Of String;
implementation
{$R *.dfm}
procedure TfmListSel.btKilepesClick(Sender: TObject);
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(Sender: TObject);
begin
UjLista;
end;
procedure TfmListSel.edListSelChange(Sender: TObject);
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(Sender: TObject);
begin
UjLista; edListSel.SetFocus;
end;
procedure TfmListSel.ldListSelClick(Sender: TObject);
begin
With ldListSel Do With edListSel Do
Begin
Text:= Items[ItemIndex];
lbIndex.Caption:= IntToStr(ldShadow.Items.IndexOf(Text));
End;
end;
end.