[gelöst] OnChange erst nach Verzögerung abfeuern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
joesky
Beiträge: 21
Registriert: Fr 12. Feb 2021, 16:38

[gelöst] OnChange erst nach Verzögerung abfeuern

Beitrag von joesky »

Ich möchte in einer Textbox einen Suchbegriff eingeben und diesen nach der Eingabe per Webservice suchen lassen. Problem ist, dass bei OnChange jede Tastatureingabe die Suche per Webservice anstößt. Hier würde ich gerne eine Verzögerung einbauen, so dass nach der Tasteneingabe erst kurz gewartet wird, ob noch eine Taste gedrückt wurde und erst dann OnChange ausgeführt wird. Hat jemand so etwas schon gemacht? Ich hab ehrlich gesagt nicht mal eine Idee, wie ich das angehen könnte.
Zuletzt geändert von joesky am Mo 27. Sep 2021, 13:50, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4320
Registriert: Fr 8. Apr 2011, 09:01

Re: OnChange erst nach Verzögerung abfeuern

Beitrag von wp_xyz »

Setze einen TTimer aufs Formular, stelle sein Enabled auf false und gib unter Interval die Verzögerungszeit in Millisekunden ein. Im OnChange-Ereignis des TEdit startest du den Timer:

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Timer1.Enabled := true;
end; 
Wenn der Timer abgelaufen ist, d.h. nach der Interval-Zeit, feuert er sein OnTimer-Ereignis und dort kannst du den Webservice suchen lassen. Aber nicht vergessen, zu Beginn den Timer wieder auszuschalten, sonst kommt der Webservice immer wieder dran...

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  // Webservice aufrufen
end; 

joesky
Beiträge: 21
Registriert: Fr 12. Feb 2021, 16:38

Re: OnChange erst nach Verzögerung abfeuern

Beitrag von joesky »

Vielen Dank, das war ja einfach!

Sehe ich das richtig, dass bei jedem Tastendruck der Timer neu/von vorne gestartet wird und dadurch der Webservice erst ausgeführt wird, wenn der Timer die Verzögerung "durchgestanden" hat?

sstvmaster
Beiträge: 521
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.2
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [gelöst] OnChange erst nach Verzögerung abfeuern

Beitrag von sstvmaster »

Eventuell auch erst die Suche starten über KeyDown mit Enter Taste?

Code: Alles auswählen

uses
  ,LCLType;

implementation 
  
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if KEY = VK_RETURN then
  begin
    // ... Websuche
  end;
end;    
LG Maik

Windows 10,
- Lazarus 2.2.2 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.3 (fixes) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 4320
Registriert: Fr 8. Apr 2011, 09:01

Re: OnChange erst nach Verzögerung abfeuern

Beitrag von wp_xyz »

joesky hat geschrieben:
Mo 27. Sep 2021, 13:49
Sehe ich das richtig, dass bei jedem Tastendruck der Timer neu/von vorne gestartet wird und dadurch der Webservice erst ausgeführt wird, wenn der Timer die Verzögerung "durchgestanden" hat?
Guter Punkt. Es ist anzunehmen, dass der Timer nicht neu startet, wenn Enabled = true gesetzt wird, obwohl es das schon ist. Daher solltest du zur Sicherheit vorher den Timer nochmals stoppen:

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
begin
  // Den Timer neu triggern.
  Timer1.Enabled := false;
  Timer1.Enabled := true;
 end; 

Antworten