A. Créez une application Fiches VCL.La gestion des clés avec KeyPreview dans TForm.OnKeyDown ne fonctionne pas avec TListBox
B. Mettez un TListBox sur la forme et remplir quelques articles à temps de conception, par exemple:
C. Définir la propriété KeyPreview
de formulaire à True
:
D. Dans le gestionnaire d'événements OnKeyDown
du formulaire, écrivez le code suivant:
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. Exécutez le programme et sélectionnez item5 en cliquant dessus:
Maintenant ListBox1 a le focus.
F. Appuyez maintenant sur la touche RETOUR ARRIÈRE. Supposément, définissant Key := 0;
dans le gestionnaire d'événements OnKeyDown
du formulaire doit empêcher la clé BACKSPACE d'être traitée par le contrôle ListBox1. Mais cela ne fonctionne pas, comme vous pouvez le voir: la touche Retour arrière fait pour changer la sélection de item5 à Item1:
Alors, comment puis-je empêcher BACKSPACE d'être traitées dans le contrôle ListBox ciblé et changer la sélection de la ListBox?
Delphi 10.1 Update Berlin 2
Windows 7 x64 SP1
En savoir plus sur WM_GETDLGCODE –
@DavidHeffernan: Et quelle valeur proposeriez-vous de renvoyer de ce message? Il n'y a pas de drapeau qui dit d'ignorer les frappes de retour arrière. Envisagez-vous de désactiver les drapeaux 'DLGC_WANTALLKEYS' et/ou' DLGC_WANTCHARS' ou d'activer le drapeau 'DLGC_WANTMESSAGE'? Vous allez devoir être plus précis. –
TranslateMessage est appelé avant DispatchMessage dans la boucle de message, par conséquent vous n'avez pas empêché WM_CHAR (qui est traduit de WM_KEYDOWN) d'être publié dans la zone de liste. D'où la réponse de Remy .... –