2016-12-03 5 views
0

A. Создайте приложение VCL Forms.Управление ключами с KeyPreview в TForm.OnKeyDown не работает с TListBox

B. Поместите TListBox на форму и заполнить некоторые предметы в режиме разработки, например:

enter image description here

C. установить форму в KeyPreview собственности на True:

enter image description here

D. В форме OnKeyDown обработчик события написать этот код:

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. Запустите программу и выберите Item5, нажав на нее:

enter image description here

Теперь ListBox1 имеет фокус.

F. Теперь нажмите клавишу BACKSPACE. Предположительно, установка Key := 0; в обработчике событий формы OnKeyDown должна блокировать ключ BACKSPACE от обработки элементом управления ListBox1. Но это не работает, как вы можете увидеть: Ключ BACKSPACE причиненный изменить выбор из Item5 в ITEM1:

enter image description here

Так как я могу предотвратить ключ BACKSPACE из обработки в сфокусированного управления ListBox и изменить выбор ListBox?

Delphi 10,1 Berlin Update 2
Windows 7 x64 SP1

+0

Подробнее о WM_GETDLGCODE –

+1

@DavidHeffernan: И какое значение вы бы предложили вернуться из этого сообщения? Нет знака, который говорит, чтобы игнорировать нажатия клавиш в обратном направлении. Вы думаете об отключении флагов 'DLGC_WANTALLKEYS' и/или' DLGC_WANTCHARS' или включении флага 'DLGC_WANTMESSAGE'? Вы должны быть более конкретными. –

+1

TranslateMessage вызывается до DispatchMessage в цикле сообщений, поэтому вы не помешали WM_CHAR (который был переведен из WM_KEYDOWN), чтобы его можно было отправить в список. Отсюда ответ Реми .... –

ответ

2

Используйте OnKeyPress событие вместо:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = #8 then 
    begin 
    if ListBox1.Focused then 
    begin 
     Key := #0; 
     CodeSite.Send('ListBox1 is focused!'); 
    end; 
    end; 
end; 

Вы не можете всегда заблокировать все в OnKeyDown.

+0

Спасибо, он работает. Но это потрясающе, так как «OnKeyDown» встречается ** ПЕРЕД ** «OnKeyPress», и ALTHOUGH «Key' ist явно установлен в ноль в« OnKeyDown », событие« OnKeyPress »по-прежнему называется! Я всегда был убежден, что такие клавиши, как 'BACKSPACE', не вызывают' OnKeyPress'. – user1580348

+0

Обычно 'OnKeyPress' не вызывается, если' OnKeyDown' отклоняет ключ. Обратите внимание, что мой ответ сказал использовать 'OnKeyPress' ** вместо **' OnKeyDown', а не с ним. В любом случае 'Key' в' OnKeyDown/Up' является * кодом виртуальной клавиши *, но 'Key' в' OnKeyPress' является * переводимым символом *, поэтому они не всегда одинаковы (в этом случае они находятся). –

+0

Странно, блокируя ключ 'HOME' и ключ' END' с 'Key: = 0;' в 'OnKeyDown', работают, и с этими ключами не запускается событие OnKeyPress'. Зачем? Почему эта разная обработка этих ключей? – user1580348

 Смежные вопросы

  • Нет связанных вопросов^_^