2

当我通过将连接的 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;
    

运行应用程序。该按钮是可见的,并且可以正常工作。选中复选框,按钮消失。取消选中复选框。按钮不出现。事实上,如果您在 Action1Update 中放置断点,您将永远无法到达它。为什么会这样,我该如何解决?

4

4 回答 4

2

无需解决此问题,它按设计工作。只有可见控件需要更新其状态,因此只有链接控件可见的操作才会更新。当您隐藏按钮时,没有更多理由更新操作。

于 2011-12-09T14:53:49.033 回答
1

让 OnUpdate调用一个单独的例程来执行所需的操作。然后,您可以从其他地方调用该例程。行动清单就是为此而设计的。

于 2011-12-09T15:36:23.053 回答
1

您可以覆盖表单上的 InitiateAction 方法。这将在应用程序空闲时发生,就像 OnUpdate 事件对每个操作所做的那样。

于 2013-03-06T00:32:08.877 回答
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;

对我来说,这仍然合乎逻辑。您将能够在一个地方查看所有控件,其可见性取决于所设置的复选框。

于 2011-12-09T20:00:15.247 回答