Как избежать звука дин при нажатии Escape, когда TEdit сфокусирован? - PullRequest
4 голосов
/ 21 апреля 2009

В коде, который я разработал несколько лет назад, я много раз использовал это, чтобы закрыть текущую форму при нажатии клавиши 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. Ничего не происходит, но звук воспроизводится.

Ответы [ 3 ]

21 голосов
/ 21 апреля 2009

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

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

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

0 голосов
/ 18 июня 2018

Начиная с ответа Джима (спасибо Джиму), я должен был заставить его работать на меня. Мне нужно было сделать выпадающий выпадающий список, удерживая выбранный элемент, и перейти к следующему / предыдущему элементу управления, когда были нажаты клавиши TAB / Shift + TAB. Каждый раз, когда я нажимал TAB, раздражающий звук заполнил комнату. Мой рабочий массив использовал событие onKeyDown для перехвата состояния сдвига, объявив 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;
0 голосов
/ 14 июня 2017

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

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

Надеюсь, что это может помочь! И если у вас есть что-то более элегантное, пожалуйста, сообщите.

...