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/)
-   -   TEdit, Tastaturpuffer gefüllt? (https://www.delphipraxis.net/164668-tedit-tastaturpuffer-gefuellt.html)

FrankJ28 24. Nov 2011 09:33

TEdit, Tastaturpuffer gefüllt?
 
Hallo,
ich habe ein TEdit in das ein Suchbegriff eingegeben werden kann. Im Event OnChange wird dann die gewünschte Suche ausgeführt. Da das natürlich bei jedem Zeichen erfolgt würde ich gerne im Event prüfen, ob der Anwender noch munter tippt, also der Tastaturpuffer/Event noch etwas hergibt. In dem Fall würde ich den Suchvorgang nicht durchführen wollen. Bin über jeden Tip dankbar.

Ciao
Frank

wicht 24. Nov 2011 09:41

AW: TEdit, Tastaturpuffer gefüllt?
 
Hi,

Das würde nur gehen, wenn du in die Zukunft blicken könntest, wenn ich dich richtig verstehe. Ich würde mir einfach die Zeit der letzten Eingabe ins Textfeld merken und dann einen Timer aktivieren. Wenn der Timer zuschlägt und seit der gemerkten Zeit 1-2 Sekunden vergangen sind, könnte man die Suche ausführen.

HTH

Sir Rufo 24. Nov 2011 09:42

AW: TEdit, Tastaturpuffer gefüllt?
 
Über einen Timer die Suchanfrage starten. Wegen des Intervalls musst du einfach mal schauen, was am effektivsten ist.

Ein hektischer Schnelltipper = 250ms
Ein entspannter Ein-Finger-Schreiber = 2000ms

Delphi-Quellcode:
procedure TForm1.EditSearchOnChange( Sender : TObject );
begin
  // Such-Timer zurücksetzen
  TimerSearch.Enabled := False;
  TimerSearchEnabled := True;
end;

procedure TForm1.TimerSearchOnTimer( Sender : TObject );
begin
  TimerSearch.Enabled := False;
  // Suche starten
  DoSearch( EditSearch.Text );
end;

FrankJ28 25. Nov 2011 07:17

AW: TEdit, Tastaturpuffer gefüllt?
 
Hallo,
danke euch beiden für eure Zeit. Die Timerlösung hatte ich auch schon, hegte aber die Hoffnung, dass es irgend einen Systemcall gibt, der den Status des Tastaturpuffers zurückliefern könnte (schlagt mich, aber: so schön wie zu DOS-Zeiten).
Ciao
Frank

ASM 25. Nov 2011 11:39

AW: TEdit, Tastaturpuffer gefüllt?
 
Zitat:

Zitat von FrankJ28 (Beitrag 1137783)
Hallo,
...hegte aber die Hoffnung, dass es irgend einen Systemcall gibt, der den Status des Tastaturpuffers zurückliefern könnte (schlagt mich, aber: so schön wie zu DOS-Zeiten).
Frank

Gibt's natürlich auch unter Windows. Aber woher soll der Tastaturpuffer denn eigentlich wissen, ob der Benutzer bereits fertig ist mit seiner Eingabe oder ob da vielleicht noch was kommt ?
Einzige Lösung ist also, wie bereits vorgeschlagen, ein Timer oder aber ein "Fertig"- Button für den Benutzer als Auslöser der Suche.

shmia 25. Nov 2011 12:39

AW: TEdit, Tastaturpuffer gefüllt?
 
Versuch' mal das:
Delphi-Quellcode:
function IsKeyboardBufferEmpty:boolean;
var
   Msg: TMsg;
begin
   Result := not PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);
end;

FrankJ28 25. Nov 2011 13:01

AW: TEdit, Tastaturpuffer gefüllt?
 
Hallo,
@ASM: Die Suche erfolgt "on the fly", während der Eingabe. Unnötige Suchanfragen sollen aber unterdrückt werden. Unnötig heißt, der Anwender tippt noch.

@Andreas: Das macht auf den ersten Blick einen guten Eindruck. Ich teste mal und gebe Feedback.

Danke
Frank

ASM 25. Nov 2011 13:28

AW: TEdit, Tastaturpuffer gefüllt?
 
Zitat:

Zitat von shmia (Beitrag 1137827)
Versuch' mal das: ...

Mit Verlaub, wie soll denn dies das beschriebene, konkrete Problem lösen können ?
So schnell, wie unter Windows der Tastaturpuffer verarbeitet, also wieder geleert wird, kann keiner eintippen. Da kann man de facto keine sinnvollen Fragmente der Eingaben in das Editfeld "on the fly" abfangen. Und was sollte dann der leere Tastaturpuffer aussagen ?

Wenn man absolut keinen Timer (on the fly!) verwenden will, könnte man eigentlich nur die fertige Eingabe im Editfeld abwarten, die ja entweder (implizit) durch ein abschließendes RETURN oder (explizit) durch ein Verlassen des Editfeldes signalisiert wird:

Code:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if Key = VK_RETURN then Edit1Exit(Sender);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
 DoSearch(StrToInt(Edit1.text)); // oder welche Aufgabe sonst
end;

shmia 25. Nov 2011 14:18

AW: TEdit, Tastaturpuffer gefüllt?
 
Zitat:

Zitat von ASM (Beitrag 1137839)
Mit Verlaub, wie soll denn dies das beschriebene, konkrete Problem lösen können ?
So schnell, wie unter Windows der Tastaturpuffer verarbeitet, also wieder geleert wird, kann keiner eintippen.

Die Geschwindigkeit, mit der Tastenevents aus der Message Queue entnommen werden, hängt allein von der Anwendung ab.
Beispiel:
* Benutzer tippt Buchstabe "D" und macht ein kleine Pause
* 300ms später fängt die Anwendung an zu suchen und benötigt dazu 0,5s
* in der Zwischenzeit hat der Benutzer "elphi" eingetippt
* das nächste Zeichen, dass die Anwendung sieht, ist das "e"
Jetzt wäre es durchaus interessant zu wissen, dass "lphi" auch noch in der Message Queue liegt.

Für die Suchfunktion selbst wäre es ebenfalls von Nutzen zu wissen ob neue Tasteneingaben vorhanden sind.
Sobald neue Tasteneingaben vorliegen sollte die Suchfunktion sofort beendet werden.

Bjoerk 25. Nov 2011 14:34

AW: TEdit, Tastaturpuffer gefüllt?
 
Meistens mache ich es wie ASM, manchmal aber auch so.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FEditChangeFlag:= false;
end;

procedure TForm1.EditChange(Sender: TObject);
begin
  if FEditChangeFlag then Exit;
  FEditChangeFlag:= true;
  // .. Code
  FEditChangeFlag:= false;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz