Welche Taste wurde gedrückt
hi!
mal wieder eine (hoffentlich einfache) frage: gibts sowas wie keydown für die gesamte anwendung, so dass man alle Tastendrücke gemeldet kriegt, die in der anwendung gemacht werden??? Ach ja: Wenn ja, dann sagt auch was es da gibt :wink: |
Moin Kalle,
wenn Du Dich mit formularweit begnügen kannst: Ein Formular hat die Eigenschaft KeyPreview. Wenn Du die im Objekt Inspektor auf true stellst, kannst Du das OnKeyDown Ereignis des Formulares verwenden. |
ja, kann ich!
danke für die hilfe. klappt wunderbar! |
noch eine frage: kann man den tastendruck auch irgendwie verschlucken? so dass nur die form den tastendruck mitkriegt, das aktive control aber nicht?
|
Hätte da ne Idee, hab zwar noch nie sowas gemacht aber:
Störend ist es doch nur bei bestimmten Controls, oder? Also z.B. bei einem Edit-Feld willst du zum Beispiel was eingeben ohne das deine Form darauf reagiert. Wenn solche Controls aktiv sind, kannst du ja dann Preview auf false setzen und wenn du das Control verlässt wieder auf true. Oder hab ich was falsch verstanden? :roll: Oder du lässt im Control abfragen, welche Tasten gedrückt werden, und die die nur für die Form bestimmt sind, da schreibst du dann entsprechenden Code. Gruß Minz |
Moin Minz,
ich würde mal sagen: umgekehrt. Als erstes bekommt das Formular die Taste und kann dann "entscheiden" ob es diese selber verarbeiten muss, oder ignorieren kann. I.d.R. wird man KeyPreview wohl für Sondertasten verwenden. Ich hab' beispielsweise in meinen Formularen standardmässig KeyPreview auf true, und dann eine Routine, die auf ESC das Formular schliesst. |
chris hat recht, aber was machst du, wenn du zb bei "leertaste" was machen willst, aber dein focus auf einem button ist. dann wird erst das richtige getan und dann noch der button gedrückt. oder bei einem edit und einer buchstabentaste...
|
Moin Nailor,
ein Zeichen, dass eine Anwendung empfängt, wird "ganz normal" zugeschickt und landet in der MessageQueue des ensprechenden Fensters. Wenn Du ein bestimmtes Zeichen nur in der Formularroutine verarbeiten willst, und nicht in einem anderen Control könntest Du es, statt es einfach weiterzureichen auch aus der MessageQueue löschen. Das hab' ich jetzt zwar nicht ausprobiert, aber es müsste der entsprechende Weg sein. Für ein Beispiel kannst Du mal hier im Forum nach PeekMessage suchen. |
Guten Abend!
Ich werd mir mal die ganzen Artikel durchschaun, und hoffe, das sich mein Problem damit erledigt! Nailor |
Hallo Nailor,
hier ein Beispiel, das Dein Problem m.E. löst. 1. KeyPreview für das Formular auf true stellen 2. das Ereignis OnKeyPress auswerten
Delphi-Quellcode:
RETURN (#13) wird über die Zuweisung key:= #0 unterdrückt.
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if key=#13 then key:= #0 else if not (key in [#8, #46, #48 .. #57]) then key:= #0; end; Es werden nur die Zeichen Backspace, Punkt und die Ziffern 0...9 durchgelassen. Mit einer anderen Zuweisung als #0 kann man Zeichen auf ein anderes umbiegen. Statt einer Zeichenzuweisung kann man auch eine beliebige Funktion/Prozedur aufrufen.
Delphi-Quellcode:
Wird das gesendete Zeichen nicht gebraucht,
if key=#13 then TuWas;
muss zusätzlich wieder die Zuweisung auf #0 erfolgen.
Delphi-Quellcode:
Ich hoffe, das hilft Dir weiter.
if key=#13 then
begin TuWas; key:= #0; end; Werner |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr. |
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