Hej Udviklere!
Her et lille delphi problem, som jeg håber der er nogen, der har tid og lyst til at hjælpe mig med.
Det drejer sig om at lave en søgefunktion, der frasorterer ikke-matchende strings fra en Listbox.
Når brugeren indtaster (i en Edit) fx 'ost', skal de værdier hvori 'ost' indgår blive tilbage i listboxen, mens alle andre skal forsvinde. De tilbageværende kunne fx være 'kost' og 'ost', mens værdier som 'hest' og 'mus' forsvinder fra listen. Akkurat ligesom søgefunktionen i WinAmp.
Hvis det har noget at sige, hentes listboxens værdier fra en ini-fil.
Mvh
Søren Jensen
Hej Søren.
Jeg har lavet en funktion (GetList) som kan fra-sortere i en TStringList.
Funktionen finder de strenge som indeholder det ord der søges efter.
Her er en unit som kan teste funktionaliteten. Husk der skal oprettes en listbox(navn=Listbox1) og et edit felt (navn=Edit2). Den gør det at hver gang du trykker en tast så finder den de strenge som passer til det du har indtastet i edit-feltet.
God fornøjelse.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, DateUtils, Registry;
type
TForm1 = class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1Change(Sender: TObject);
private
FTotal : TStringList;
function GetList(AWord : String; ATotalList : TStringList; var AResult : TStringList) : Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FTotal := TStringList.Create;
// tilføj dine elementer fra ini filen her.
FTotal.Add('ost');
FTotal.Add('knast');
FTotal.Add('mælk');
FTotal.Add('kost');
FTotal.Add('ko');
FTotal.Add('silke');
FTotal.Add('kælk');
ListBox1.Items.AddStrings(FTotal);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FTotal.Free;
end;
function TForm1.GetList(AWord : String; ATotalList : TStringList; var AResult : TStringList) : Boolean;
var
I : Integer;
begin
if (AResult = nil) then
AResult := TStringList.Create;
AResult.Clear;
if AWord = '' then // tilføj alle elementer hvis søge strengen er tom.
AResult.AddStrings(ATotalList)
else
begin
AWord := UpperCase(AWord); // Brug store bogstaver til at sammenligne.
for I := 0 to ATotalList.Count-1 do
begin
if Pos(AWord, UpperCase(ATotalList.Strings[I])) > 0 then
AResult.Add(ATotalList.Strings[I]); // okay denne streng indeholder hvores søge ord.
end;
end;
Result := (AResult.Count > 0);
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
Lst : TStringList;
begin
Lst := nil;
if GetList(Edit1.Text, FTotal, Lst) then
begin
ListBox1.Items.BeginUpdate;
try
ListBox1.Items.Clear;
ListBox1.Items.AddStrings(Lst);
Lst.Free;
finally
ListBox1.Items.EndUpdate;
end;
end;
end;
end.
Michael.