Как избежать звука дина при нажатии Escape, когда TEdit находится в фокусе?

В коде, который я разработал несколько лет назад, я часто использовал это, чтобы закрыть текущую форму при нажатии клавиши Escape в любой момент:

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then close;
end;

Это поведение определено для TForm. Для свойства KeyPreview формы установлено значение True, чтобы форма реагировала на нажатия клавиш раньше любых других компонентов. Все это работает отлично в большей части программы, однако, когда клавиша Escape нажата, когда компонент TEdit сфокусирован, раздается звук (звук ding, используемый Windows для обозначения недопустимой операции). . Он по-прежнему работает нормально, но мне так и не удалось полностью избавиться от звука.

Что с этим не так?


Шаги по воссозданию:

  • новое приложение VCL Forms, установите для KeyPreview формы значение true
  • на вкладке «События» дважды щелкните событие onKeyPress и введите фиктивный код:

    если ключ = # 27, то;

  • добавить в форму TListBox, TCheckBox, TEdit и запустить приложение

  • в приложении попробуйте нажать Esc, и НИЧЕГО не произойдет, как указано в фиктивном коде
  • сфокусируйте TEdit и нажмите Esc. Ничего не происходит, но звук воспроизводится.

person Peter Perháč    schedule 20.04.2009    source источник


Ответы (3)


Вы получаете звон, потому что оставили ESC на входе. Посмотрите, как Key - это var? Установите его на # 0, и вы устраните звон. Это исключает его из дальнейшей обработки.

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then 
    begin
      key := #0;
      close;
    end;
end;

KeyPreview - это всего лишь предварительный просмотр того, что будет передано элементам управления, если вы его не остановите.

person Jim McKeeth    schedule 20.04.2009
comment
Это лишает меня дара речи ... Я давал орешки покрепче, но это ... ааааххх. Спасибо за совет. Весьма признателен. - person Peter Perháč; 21.04.2009
comment
Это случается со всеми нами. Каждый раз, когда я борюсь с ошибкой дольше, чем немного, я знаю, что это будет что-то ослепляюще простое. Так оно и работает. - person Jim McKeeth; 21.04.2009

Начиная с ответа Джима (спасибо, Джим), я должен был заставить его работать для меня. Мне нужно было закрыть выпадающее поле со списком, сохранив выбранный элемент, и перейти к следующему / предыдущему элементу управления при нажатии TAB / shift + TAB. Каждый раз, когда я нажимал клавишу TAB, комнату наполнял раздражающий звук. В моей работе arroud использовал событие onKeyDown, чтобы поймать shiftstate, объявляя var aShift: boolean; в интерфейсе формы и используя следующий код:

procedure TForm2.StComboKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if ssShift in Shift then aShift := true else aShift := false;
end;

procedure TForm2.StComboKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=char(VK_TAB) then
   begin
     Key := #0;
     StCombo.DroppedDown := false;
     if aShift
       then previousControl.SetFocus
       else nextControl.SetFocus;
   end;
end;
person user3268424    schedule 18.06.2018

Это старая ветка ... но в любом случае вот гораздо лучшая тема: поймать Alt-C!

В отличие от ESC, Alt-C не обслуживается KeyPress, поэтому установка Key на # 0 в KeyPress не работает, и возникает ужасный «звон!» выдается каждый раз. После нескольких часов попыток я нашел обходной путь: - создайте параметр главного меню для обслуживания запроса - установите его ShortCut на Alt + C - да, действительно, это НЕ один из доступных вариантов ShortCut ( !!) ... но все равно работает! - выполните обработку в OnClick этой опции меню - вы можете даже сделать это «в фоновом режиме»: вы можете установить для параметра меню Visible значение false - пока его Enabled остается истинным, он будет активирован с помощью Alt-C, даже если он не будет отображаться в меню.

Надеюсь, это поможет! А если есть что-то наряднее, посоветуйте, пожалуйста.

person user1920453    schedule 14.06.2017
comment
Вы пробовали использовать TAction вместо меню? - person dummzeuch; 14.06.2017