当我通过将连接的TAction设置为不可见而使组件不可见时,onupdate事件将不再触发。要重新创建,请执行以下操作。
为OnExecute和OnUpdate事件编写以下代码:
procedure TForm1.Action1Execute(Sender: TObject);
begin
ShowMessage('Test');
end;
procedure TForm1.Action1Update(Sender: TObject);
begin
TAction(Sender).Enabled := not CheckBox1.Checked;
TAction(Sender).Visible := TAction(Sender).Enabled;
end;
运行该应用程序。该按钮可见,并且工作正常。选中复选框,按钮消失。取消选中该复选框。该按钮不会出现。事实上,如果你在Action1Update中放置一个断点,你将永远不会得到它。为什么会这样,我该如何解决?
答案 0 :(得分:2)
无需解决此问题,它按设计工作。只有可见控件需要更新其状态,因此只更新其链接控件可见的操作。当您隐藏按钮时,没有理由更新操作。
答案 1 :(得分:1)
让OnUpdate 仅调用一个单独的例程来执行所需的操作。然后你可以从其他地方调用该例程。行动清单就是为此而设计的。
答案 2 :(得分:1)
我理解你正在尝试做什么,并且你希望它以这种方式工作是有道理的。但是,这是一种解决方法,它的工作方式。
您也可以更新OnUpdate
中的其他控件。您不仅限于更新接收通知的控件。因此,在确定可见性的控件的操作中,您可以设置其他控件的可见性。在您的情况下,这是复选框:
创建一个新动作(Action2)并将其分配给Checkbox1。
然后在复选框操作的OnUpdate:
中procedure TForm1.Action2Update(Sender: TObject);
begin
Button1.Visible := TAction(Sender).Checked;
end;
请务必同时为复选框指定OnExecute。像这样简单的东西很好:
procedure TForm1.Action2Execute(Sender: TObject);
begin
TAction(Sender).Checked := not TAction(Sender).Checked;
end;
对我而言,这仍然具有逻辑意义。您将能够在一个位置查看所有可见性依赖于所设置复选框的控件。
答案 3 :(得分:1)
您可以覆盖表单上的InitiateAction方法。只要应用程序进入空闲状态,就会发生这种情况,就像OnUpdate事件对每个操作一样。