Einzelnen Beitrag anzeigen

bisenegger

Registriert seit: 25. Okt 2006
Ort: Kriens
14 Beiträge
 
#7

Re: Navigation in DBGrid + Anfangsbuchstabe

  Alt 28. Jan 2008, 20:07
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
  Mit Zitat antworten Zitat