Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Edit.OnChange-Event für eine bestimmte Zeit verhindern (https://www.delphipraxis.net/164113-edit-onchange-event-fuer-eine-bestimmte-zeit-verhindern.html)

juergen 28. Okt 2011 21:13

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!

stahli 28. Okt 2011 21:19

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.)

Bummi 28. Okt 2011 21:26

AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
 
wenn Du #13 im Keypress auswertest, also nur bei Enter suchst?

Sir Rufo 28. Okt 2011 21:26

AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
 
Timer?

WM_CLOSE 28. Okt 2011 21:28

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:
procedure TForm1.Edit1Change(...)
begin
  Timer1.Enabled:=false;
  Timer1.Enabled:=true;//Timer zurücksetzen
end;
procedure TForm1.Timer1Timer(...)
begin
  //Suche in der StringList
end;
Den Timer noch auf 1/4 Sekunde einstellen.
EDIT: Lieber spät als nie
Edit2: Von mir aus auch ne 1/4 Sekunde...

Sir Rufo 28. Okt 2011 21:30

AW: Edit.OnChange-Event für eine bestimmte Zeit verhindern
 
Auf 1/4 Sekunde ;)
Zitat:

Zitat von WM_CLOSE (Beitrag 1133289)
Edit2: Von mir aus auch ne 1/4 Sekunde...

Nein, von ihm aus ;)

juergen 28. Okt 2011 23:05

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.

Sir Rufo 28. Okt 2011 23:13

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;

stahli 28. Okt 2011 23:24

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;

juergen 28. Okt 2011 23:43

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.
Seite 1 von 2  1 2      

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