为什么OnUpdate不会触发不可见的组件

时间:2011-12-09 14:44:09

标签: delphi tcheckbox tactionlist

当我通过将连接的TAction设置为不可见而使组件不可见时,onupdate事件将不再触发。要重新创建,请执行以下操作。

  1. 创建新的VCL表单应用程序
  2. 在表单上删除一个按钮,一个复选框和一个动作列表。
  3. 创建一个新动作,然后将按钮连接到该动作。
  4. 为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;
    
  5. 运行该应用程序。该按钮可见,并且工作正常。选中复选框,按钮消失。取消选中该复选框。该按钮不会出现。事实上,如果你在Action1Update中放置一个断点,你将永远不会得到它。为什么会这样,我该如何解决?

4 个答案:

答案 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事件对每个操作一样。