【问题标题】:How can I change the behavior of an event handler based on which TAction triggered it?如何根据触发的 TAction 更改事件处理程序的行为?
【发布时间】:2011-09-15 12:49:42
【问题描述】:

我有一些菜单项的操作是这样的:

procedure TMISMainFrm.ActiSalesInvoiceExecute(Sender: TObject);
begin
  if CheckMdiList('Sales Invoice') then
    BEGIN
      SalesInvFrm := tSalesInvFrm.Create(Self,0,UserIdNo,1,1);
      SalesInvFrm.Show;
    END;
end;

上述动作可以从多个位置调用,但第二个参数(0)可能会改变。如何传递所需的参数,这样我就不必重新编码例程?

【问题讨论】:

    标签: delphi parameters event-handling taction


    【解决方案1】:

    一种常用的简单方法是设置操作的Tag 属性。显然,每个动作都应该不同。然后你像这样改变你的执行处理程序:

    procedure TMISMainFrm.ActiSalesInvoiceExecute(Sender: TObject);
    begin
      if CheckMdiList('Sales Invoice') then
        BEGIN
          SalesInvFrm := tSalesInvFrm.Create(Self,(Sender as TAction).Tag,UserIdNo,1,1);
          SalesInvFrm.Show;
        END;
    end;
    

    【讨论】:

    • 如果您将相同的操作连接到不同的组件(按钮、菜单项等)并且必须根据触发的组件做出反应,这也将起作用。在这种情况下,使用动作“ActionComponent”属性来识别执行动作的单个组件。
    • 不要忘记确保发送者是一个 TAction,然后再将其转换为 TAction。 if Sender is TAction then SalesInvFrm := ... (Sender As TAction).Tag ...
    • @Jerry 不,不要那样做。 as 是一种类型安全转换,如果对象不是 TAction,则会引发异常。这就是你想要的,因为它就像一个断言。这意味着该方法只能由框架调用以响应操作。
    • @DavidHeffernan 如果我需要使用收集数据所需的字符串参数怎么办。我有一个名为“doSave”的动作,在这个动作中我处理了很多事情和一些功能。 TAction可以设置一些参数吗?
    • 你需要派生一个带有字符串属性的子类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2013-05-30
    • 1970-01-01
    • 2019-01-05
    • 2015-10-01
    相关资源
    最近更新 更多