Я пытаюсь остановить элемент 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
?