![]() |
Edit.OnChange-Event für eine bestimmte Zeit verhindern
Hallo zusammen,
ich suche eine Möglichkeit das OnChange-Event eines Edits für eine gewisse Zeit zu "blockieren". Hintergrund: In einem Edit wird ein Suchtext eingegeben und über das OnChange-Event wird "live" in einer StringList gesucht. Somit wird ja nach jeder Tastenbetätigung die Suche ausgelöst. Und das kann schon mal etwas dauern. Wenn man 250ms(?) im Edit nichts eingegeben hat, dann soll erst das OnChange angewendet werden. Hat hierzu jemand einen Vorschlag wie sowas umzusetzen wäre? Danke schon mal vorab für Hilfestellungen! |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Da gibt es sicher Wege (Enabled := False oder den Mauszeiger zumindest auf die Sanduhr einstellen).
Der richtige Weg wäre aber m.E., die Suche zu unterbrechen und neu zu starten. Das kann rel. aufwendig werden, aber eine solche Lösung ist aus meiner Sicht notwendig. (Wenn die Suche über ein SQL-Statement erfolgen würde, wäre eine solche Unterbrechung jedoch wohl nicht zu erreichen.) |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
wenn Du #13 im Keypress auswertest, also nur bei Enter suchst?
|
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Timer?
|
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Es wäre doch möglich, das ganze in einem Timer ablaufen zu Lassen:
Delphi-Quellcode:
Den Timer noch auf 1/4 Sekunde einstellen.
procedure TForm1.Edit1Change(...)
begin Timer1.Enabled:=false; Timer1.Enabled:=true;//Timer zurücksetzen end; procedure TForm1.Timer1Timer(...) begin //Suche in der StringList end; EDIT: Lieber spät als nie Edit2: Von mir aus auch ne 1/4 Sekunde... |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Auf 1/4 Sekunde ;)
Zitat:
|
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Erst einmal Danke für die Unterstützung!
@stahli, Dein Ansatz hört sich interesaant an, ich wüßte nur leider nicht wie ich sowas umsetzen könnte. @Bummi, das habe ich schon :wink:, da man optional die Live-Suche auch abschalten kann und ich dann auf Enter reagiere. Das ist auch richtig schnell. @Sir Rufo, WM_CLOSE naja mit Timer da tue ich mich etwas schwer, da ich hier schon gelesen hatte, wo Timer "verteufelt" wurden. Den Ansatz von WM_Close vertehe ich so aber auch nicht. Der Timer ist auf einen Intervall von 250 eingestellt und Enabled := False... Dann wird im OnChange der Timer auf "False" gesetzt und anschließend auf true....:?: Im OnTimer-Event dann das Suchen ausführen. Meinem Verständnis nach würde die Suche doch in einer Endlosschleife ausgeführt werden, oder nicht? Vllt. habe ich mich auch nicht so deutlich ausgedrückt. Angenommen ich tippe 8 Zeichen in 2 Sekunden in das Edit ein. Dann wird 8x meine Suche angeschmissen, weil diese im OnChange des Edits hinterlegt ist. Ich hätte gern, dass nur dann die Suche ausgeführt wird wenn nach einer Eingabe im Edit mindestens 250ms(?) vergangen sind. Edit: Die Live-Suche startet erst dann, wenn mindestens 3 Zeichen eingegeben wurden. |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Delphi-Quellcode:
procedure TForm1.Edit1Change(...)
begin Timer1.Enabled := false; Timer1.Enabled := ( Length( Edit1.Text ) >= 3 ); end; procedure TForm1.Timer1Timer(...) begin Timer1.Enabled := False; DoSuche( Edit1.Text ); end; |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Also "Timer ist böse" würde ich so auch nicht so gelten lassen.
Ich klaue gleich mal beim Sir. Als ungefährerer Ansatz:
Delphi-Quellcode:
procedure TForm1.Edit1Change(...)
begin BreakFlag := True; Timer1.Enabled := False; // Timer wird neu gestartet, keine Suche bei schneller Eingabe Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(...) begin Timer1.Enabled := False; BreakFlag := False; DoSuche( Edit1.Text ); end; procedure DoSuche; begin for I := 0 to Items.Count - 1 do begin ... Application.ProcessMessages; if BreakFlag then Break; end; BreakFlag := False; end; |
AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
Supi, so funktioniert es!
Da hätte ich auch selbst drauf kommen müssen, dass ich im OnTimer zuerst Timer1.Enabled := False setzen muss! :oops: Vielen Dank und eine Gute N8! :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz