Ich habe das mit der Adressen-Sucherei folgendermassen gelöst:
Delphi-Quellcode:
KeySuchStr:
string;
//allg. als globale Variable in der Unit
procedure TAdressen.DBGrid1KeyPress(Sender: TObject;
var Key: Char);
begin
if Datasource1.state=dsbrowse
then
begin
TimerEingabe.Enabled:=False;
if ord(Key)=27
then //bei ESC Sucheingabe löschen
begin
KeySuchStr:='
';
end else
begin
if ord(Key)<>8
then //bei BackSpace letzes Zeichen löschen
begin
KeySuchStr:=KeySuchStr+Key;
end
else begin
Delete(KeySuchStr,length(KeySuchStr), 1);
end;
end;
TimerEingabe.Enabled:=True;
end;
end;
procedure TAdressen.TimerEingabeTimer(Sender: TObject);
begin
PvQuery1.DisableControls;
TimerEingabe.Enabled:=False;
// PvQuery1.Locate('Name', KeySuchStr, [loCaseInsensitive,loPartialKey]);
//alternativ, besser
PvQuery1.Params.CreateParam(ftString, '
pName', ptInput);
PvQuery1.Close;
PvQuery1.SQL.Clear;
PvQuery1.SQL.Add('
select * FROM Adressen a WHERE name like :pName order by Name');
PvQuery1.Params.ParamByName('
pName').AsString:=KeySuchStr+'
%';
PvQuery1.Open;
PvQuery1.Params.Clear;
//
PvQuery1.EnableControls;
TimerEingabe2.Enabled:=True;
end;
procedure TAdressen.TimerEingabe2Timer(Sender: TObject);
begin
TimerEingabe2.Enabled:=False;
KeySuchStr:='
':
end;
Läuft prima und ist die Luxus-Lösung.
Der eine Timer fasst die Eingaben zusammmen, so dass nicht bei jedem Buchstaben innert kürzester Zeit eine
SQL Abfräge rausgeht, der andere Timer löscht nach einer gewissen Zeit den Suchstring.
Mit ESC ist wieder die vollständige Tabelle sichtbar.
Gruss
Beni