Обработка ключей с помощью KeyPreview в TForm.OnKeyDown не работает с TListBox

А. Создайте приложение VCL Forms.

Б. Поместите TListBox в форму и заполните некоторые элементы во время разработки, например:

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

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, нажав на нее:

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

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

Итак, как я могу предотвратить обработку клавиши BACKSPACE в выделенном элементе управления ListBox и изменить выбор ListBox?

Delphi 10.1 Berlin Обновление 2
Windows 7 x64 SP1

1 ответ

Решение

Использовать 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,

Другие вопросы по тегам