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
事件不会在您修改其任何属性时触发。这是设计使然,非常合理。当用户执行某项操作时会触发此事件。不是在程序员设置动作时。
我想稍微简化一下将表单状态保存到磁盘的过程。我使用从 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
事件不会在您修改其任何属性时触发。这是设计使然,非常合理。当用户执行某项操作时会触发此事件。不是在程序员设置动作时。