TAction.OnExecute 未执行

TAction.OnExecute is not executed

我想稍微简化一下将表单状态保存到磁盘的过程。我使用从 TIniFile 派生的自己的 INI 文件 class 来读取表单中存在的 "all" 控件的状态。像这样:

procedure TMyIniFile.Read(Comp: TComponent);
begin
  if ValueExists(Section, Comp.Name) then
   begin
     if Comp.InheritsFrom(TAction)
     then TAction(Comp).Checked:= ReadBool(Section, Comp.Name, FALSE)              
     else
        if Comp.InheritsFrom(TCheckBox) etc 
  end;
end;

我这样使用 class:

TYPE
 TformTester = class(TForm)
   MyAction: TAction;
   procedure actMyActionExecute(Sender: TObject);

...

procedure TformTester.FormDestroy(Sender: TObject);
VAR
   MyIniFile: TMyIniFile;
begin
 MyAction.Checked:= true;
 MyIniFile:= TMyIniFile.Create('Main Form');
 MyIniFile.write(MyAction);  // <------ This saves the 'Checked' property of MyAction.
 ...
end;

我验证了 INI 文件并根据 属性 关闭时的状态正确保存了状态 (true/false)。

procedure TformTester.FormStartUp;
VAR MyIniFile: TMyIniFile;
begin
 MyIniFile:= TMyIniFile.Create('Main Form');
 MyIniFile.read(MyAction);     // <------ This reads the 'Checked' property of MyAction. It should execute the actMyActionExecute but it doesn't. 
 assert(MyAction.Checked);     //  <---- Yes, it is checked 
 ...
end;


procedure TformTester.MyActionExecute(Sender: TObject);
begin
 if MyAction.Checked
 then Caption:= 'Action checked'
 else Caption:= 'Action is un-checked!';
end;

问题:为什么在执行MyIniFile.read(MyAction)时没有调用actMyActionExecute?

PS: MyIniFile.read(MyCheckbox) 如果我传递的不是 TAction 而不是其他任何东西,例如复选框,它就可以工作。我是说 MyCheckbox.OnClick 被执行了!

操作 OnExecute 在调用链接控件时触发。例如按下按钮或选择菜单项。或者,如果您在事件上显式调用 Execute,它就会被触发。

OnExecute 事件不会在您修改其任何属性时触发。这是设计使然,非常合理。当用户执行某项操作时会触发此事件。不是在程序员设置动作时。