У меня есть форма с рихедитом и правкой.
Я определяю действие с помощью сочетания клавиш Ctrl B, которое должно вызывать его.
Я хочу, чтобы только действие было запущено в richedit, при редактировании я хочу обработку по умолчанию. Поэтому я решил назначить и отменить назначение обработчика действий соответственно в обработчиках richedit onEnter и onExit.
Когда я впервые нажимаю Ctrl B в ричедите, действие срабатывает, хорошо.
Затем я переключаюсь на редактирование и нажимаю Ctrl B, получаю звуковой сигнал, хорошо.
Когда я снова переключаюсь на richedit и нажимаю Ctrl B, действие больше не запускается, ой.
Я отладил код VCL, но не смог понять, является ли это ошибкой или я что-то не так делаю (Delphi 2007 и Delphi 10.2).
unit Unit5;
interface uses ActnList,Classes,ComCtrls,Controls,Forms,StdCtrls,Windows;
type TForm5 = class(TForm)
RichEdit1 : TRichEdit;
Edit1 : TEdit;
ActionList1 : TActionList;
Action1 : TAction;
procedure Action1Execute(Sender: TObject);
procedure RichEdit1Enter(Sender: TObject);
procedure RichEdit1Exit(Sender: TObject);
end;
var Form5: TForm5;
implementation
{$R *.dfm}
procedure TForm5.Action1Execute(Sender: TObject);
begin
richedit1.selText := '{Ctrl B}';
end;
procedure TForm5.RichEdit1Enter(Sender: TObject);
begin
action1.OnExecute := Action1Execute;
end;
procedure TForm5.RichEdit1Exit(Sender: TObject);
begin
action1.OnExecute := NIL;
end;
end.
Я знаю, что, поскольку я хочу, чтобы действие выполнялось только в richedit, простой обходной путь состоит в использовании вместо действия обработчика OnKeyDown Richedit.
Но я хотел бы понять, почему текущий код не работает. Ошибка Delphi или злоупотребление действием "модель"?