A. Erstellen Sie eine VCL-Formularanwendung.Schlüsselhandling mit KeyPreview in TForm.OnKeyDown funktioniert nicht mit TListBox
B. Setzen Sie ein TListBox auf dem Formular und füllen Sie einige Elemente zur Entwurfszeit, zum Beispiel:
C. Stellen Sie die KeyPreview
Formblatt Eigenschaft True
:
D. Schreiben Sie im Ereignishandler des Formulars OnKeyDown
diesen Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_BACK then
begin
if ListBox1.Focused then
begin
Key := 0;
CodeSite.Send('ListBox1 is focused!');
end;
end;
end;
E. Führen Sie das Programm und wählen Sie Item5 durch Anklicken aus:
Jetzt hat ListBox1 den Fokus.
F. Drücken Sie nun die RÜCKTASTE. Angeblich sollte die Einstellung Key := 0;
im Ereignishandler OnKeyDown
des Formulars die BACKSPACE-Taste von der ListBox1-Steuerelement verarbeitet werden. Aber das funktioniert nicht, wie man sehen kann: die Rücktaste verursacht die Auswahl von Item5 zu element1 ändern:
So wie kann ich die RÜCK Schlüssel verhindern, in dem fokussierten Steuerelement List-Box verarbeitet und um die Auswahl der ListBox zu ändern?
Delphi 10.1 Berlin Update 2
Windows 7 x64 SP1
Lesen Sie über WM_GETDLGCODE –
@DavidHeffernan: Und welchen Wert würden Sie vorschlagen, von dieser Nachricht zurückzukehren? Es gibt kein Flag, das besagt, dass Rücktaste-Tastenanschläge ignoriert werden sollen. Denken Sie daran, die Flags "DLGC_WANTALLKEYS" und/oder "DLGC_WANTCHARS" zu deaktivieren oder das Flag "DLGC_WANTMESSAGE" zu aktivieren? Sie müssen genauer sein. –
TranslateMessage wird vor DispatchMessage in der Nachrichtenschleife aufgerufen. Daher haben Sie nicht verhindert, dass WM_CHAR (das aus dem WM_KEYDOWN übersetzt wird) in das Listenfeld gestellt wird. Daher Remys Antwort .... –