2

我想稍微简化将表单状态保存到磁盘的过程。我使用我自己的从 TINiFile 派生的 INI 文件类来读取表单中“所有”控件的状态。像这样的东西:

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;

我像这样使用我的课程:

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 文件,并根据关闭时的属性状态正确保存了状态(真/假)。

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 被执行了!

4

1 回答 1

4

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

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

于 2017-09-16T12:39:40.523 回答