[gelöst] OnChange erst nach Verzögerung abfeuern
[gelöst] OnChange erst nach Verzögerung abfeuern
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.
Re: OnChange erst nach Verzögerung abfeuern
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:
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.Edit1Change(Sender: TObject);
begin
Timer1.Enabled := true;
end;
Code: Alles auswählen
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
// Webservice aufrufen
end;
Re: OnChange erst nach Verzögerung abfeuern
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?
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?
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: [gelöst] OnChange erst nach Verzögerung abfeuern
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 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: OnChange erst nach Verzögerung abfeuern
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: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?
Code: Alles auswählen
procedure TForm1.Edit1Change(Sender: TObject);
begin
// Den Timer neu triggern.
Timer1.Enabled := false;
Timer1.Enabled := true;
end;