Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem mit OnKeypress


hRb - Mo 30.08.21 18:13
Titel: Problem mit OnKeypress
Problem: mit OnKeyPress-Ereignes bei TEdit
(arbeite mit Delphi 10.3 Community-Edition)
Ich habe erwartet, dass alle Tasten, die Einfluss auf den Text nehmen, das OnKeyPress-Ereignis auslösen. Das gilt offenbar nicht für die Taste "Entf", obwohl es den String verändern kann.
Wie kann ich denn verhindern, dass "Entf" (Clear) ausgelöst wird bzw. zur Wirkung kommt? Ist doch normaler Tastencode (#C). War dies schon immer so?
Danke für Tipps


jaenicke - Mo 30.08.21 18:54

Probiere es einmal mit OnKeyDown / OnKeyUp.


hRb - Mo 30.08.21 22:31

Hallo Jaenicke,
danke für Hinweis. War mir die Reihenfolge in der Abarbeitung nicht bekannt. Glaubte Keypress kommt zuerst. Tatsächlich kommt OnKeyDown früher und reagiert auf <Entf>. Werde meine ganzen Prüfungen in dieses Ereignis verlegen.
Dennoch: ist bekannt warum Keypress bei der Taste <Entf> nicht anspricht?
hRb


jaenicke - Mo 30.08.21 22:46

Wenn du einfach mal einen Haltepunkt auf die Ereignisse setzt, kannst du dir den Stacktrace anschauen. Dann findest du die Ursache ganz einfach:

StacktracesKeyEvents

Wenn eine Taste gedrückt wird, schickt Windows dir WM_KEYDOWN und WM_KEYUP. Zusätzlich wird noch WM_CHAR geschickt, aber wie der Name schon sagt nur für Zeichen. Da Entf kein Zeichen ist, wird WM_CHAR auch nicht geschickt und entsprechend OnKeyPress auch nicht ausgelöst.


hRb - Mo 30.08.21 23:06

Ok, verstanden
Allerdings fällt mir jetzt wieder ein, dass ich Keydown schon einmal getestet habe.
Meine Prüfungen ins Keydown zu verlegen, funktioniert nicht. D.h. ich muss sowohl Keydown auswerten (für Taste <Entf>) UND Keypress (für Alphazeichen). Man lernt immer wieder zu.
Danke hRb


jaenicke - Di 31.08.21 09:38

Das ist richtig:
Im OnKeyDown kann man den Tastendruck z.B. nicht ignorieren, damit das Zeichen nicht ankommt.