![]() |
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 |
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 |
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; |
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 |
AW: TEdit, Tastaturpuffer gefüllt?
Zitat:
Einzige Lösung ist also, wie bereits vorgeschlagen, ein Timer oder aber ein "Fertig"- Button für den Benutzer als Auslöser der Suche. |
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; |
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 |
AW: TEdit, Tastaturpuffer gefüllt?
Zitat:
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; |
AW: TEdit, Tastaturpuffer gefüllt?
Zitat:
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. |
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; |
AW: TEdit, Tastaturpuffer gefüllt?
Hallo,
willst Du so ein Art Lookup implementieren? Diese schauen aber direkt nach der Zeicheneingabe ob ein Begriff bekannt ist welcher die bereits getippten Buchstaben am Anfang enthält. Um das zu optimieren, kann man die Suche vielleicht erst nach dem 3 oder 4 getippten Buchstaben starten. Grüße Klaus |
AW: TEdit, Tastaturpuffer gefüllt?
Für's Warten gibt es
![]()
Delphi-Quellcode:
function LastInput: DWord;
var LInput: TLastInputInfo; begin LInput.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(LInput); Result := GetTickCount - LInput.dwTime; end; |
AW: TEdit, Tastaturpuffer gefüllt?
Hallo,
Andreas hat das/mein Problem korrekt beschrieben. Der Anwender gibt im TEdit seinen Suchbegriff ein, der aus ein bis n Zeichen bestehen kann. Während der Eingabe wird (onChange) bereits ein TDataSet.Locate abgesetzt um den nächst passenden Datensatz vorzuschlagen. Bei sehr großen Datenmengen und lahmen Rechner (ADO, SQLServer) dauert so ein Locate schon einmal 0,5 Sec. Nun soll eben im OnChange geprüft werden, ob der Anwender sich seines Suchbegriffs schon so sicher ist, das es munter tippt. Dann erspare ich mir das Locate (was auch die Zeichenanzeige entsprechend verzögert und den Anwender verunsichert, habe ich schon getippt oder warte ich noch ;-))). Ciao Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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