Я пытаюсь остановить элемент TMemo (а также TRichEdit) от еды Escape.
Если пользователь сфокусирован на TEdit, нажатие Escape вызовет форму, чтобы сделать то, что делает форма, когда пользователь нажимает кнопку escape. Если пользователь сфокусирован на TMemo, нажатие кнопки escape происходит через TMemo.
Конечно, я мог бы взломать:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
begin
//figure out how to send a key to the form
end;
end;
Но это не идеально (я должен обрабатывать ключ-побег, а не позволять форме обрабатывать его).
Конечно, я мог бы взломать:
Form1.KeyPreview := True;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
begin
//Figure out how to invoke what the form was going to do when the user presses escape
end;
end;
Но это не идеально (я должен обрабатывать ключ-побег, а не позволять форме обрабатывать его).
Итак, мы ответим на вопрос, а не на проблему
Вместо этого мы воспользуемся возможностью, чтобы что-то узнать. Каким образом TMemo даже получает событие keyPress, связанное с ключом эвакуации, когда TEdit не работает:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
begin
//never happens
end;
end;
TEdit и TMemo - это тот же общий EDIT общий контроль Windows.
Почему escape обходит форму KeyPreview
Если я включу форму KeyPreview, и пользователь нажимает Escape, когда он сфокусирован в поле TEdit, и свойство кнопки Cancel установлено, форма закрывается и:
- Событие
Edit1.KeyPressне запускается - событие
Form1.KeyPressне запускается
Если создано действие, чей Shortcut - Esc, то не возникает событие KeyPress, независимо от того, какой контроль он использует.
tl; dr: Где свойство TMemo.WantEscape?