Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Blockierung eines KeyDown Events durch Komponenten


HenryHux - Sa 16.04.11 15:50
Titel: Blockierung eines KeyDown Events durch Komponenten
Hi,

in einem Programm habe ich auf der Form ein KeyDown Event. (KeyPreview ist true).
Auf die Pfeiltasten sind Aktionen gelegt, was auch an sich klappt.
Doch habe ich auf der Form noch ein RichEdit, welches Probleme macht.
Und zwar wenn ich jetzt die linke oder rechte Pfeiltaste drücke, geht der Cursor ersteinmal durch das gesamte RichEdit, bevor dann das KeyDown Event ausgelöst wird.
Habe schon vieles versucht - die Box disabled, beim OnEnter den Focus wieder abgegeben oder ihr ein eigenes KeyDown Event gegeben, was dann aber gelegentlich doppelt ausgelöst wird(zusammen mit dem FormEvent).

Weiß jemand Rat?

Liebe Grüße


jaenicke - Sa 16.04.11 16:00

Du musst nur zusätzlich die Verarbeitung im RichEdit unterdrücken:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TYourForm.YourRichEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key in [VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN] then
    Key := 0;
end;
Das FormKeyDown-Event wird aber bei KeyPreview auf True immer sofort ausgelöst. :gruebel:


HenryHux - Sa 16.04.11 16:14

Vielen Dank, das hab ich gesucht.
Klappt jetzt so wie es soll.

lg


HenryHux - So 17.04.11 13:46

Hi,

leider habe ich das Problem immer noch bzw. schon wieder.
Um das mal zu veranschaulichen habe ich schnell was zusammengeklickt -> Siehe Anhang.
Und zwar wenn man in das Edit Feld klickt, reagiert die Form auf einen Key-Anschlag.
Doch wenn man auf einen Button klickt, und danach einen der Pfeiltasten drückt, werden nur die Buttons durchgeschaltet.
Trotz KeyPreview. Zwar könnte ich für jeden Button ein eigenes Event anlegen, aber in meinem Projekt habe ich mehr als nur 3 Buttons =)
Mit "normalen" Tasten klappt es zwar, mir geht es aber um die Pfeiltasten.


Lg

Beispiel (zip, 83.95 KB)


jaenicke - So 17.04.11 13:52

Wenn du Controls drin hast, musst du auch noch auf WM_GETDLGCODE [http://msdn.microsoft.com/en-us/library/ms645425(v=vs.85).aspx] reagieren und Windows mit DLGC_WANTARROWS mitteilen, dass du diese Tastendrücke selbst behandeln möchtest.


HenryHux - So 17.04.11 14:16

Ok, das klappt für alle Controls, bis auf die, die in GroupBoxen oder Panels sind.
Kann ich das auch regeln ohne mir eine eigene Komponente abzuleiten?