Delphi 如何根据触发事件处理程序的TAction更改事件处理程序的行为?

Delphi 如何根据触发事件处理程序的TAction更改事件处理程序的行为?,delphi,parameters,event-handling,taction,Delphi,Parameters,Event Handling,Taction,我有一些菜单项,其中的操作如下: procedure TMISMainFrm.ActiSalesInvoiceExecute(Sender: TObject); begin if CheckMdiList('Sales Invoice') then BEGIN SalesInvFrm := tSalesInvFrm.Create(Self,0,UserIdNo,1,1); SalesInvFrm.Show; END; end; 可以从多个位置调用上述

我有一些菜单项,其中的操作如下:

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)可能会更改。如何传递所需的参数,以便不必重新编码例程?

一种常用的简单方法是设置操作的属性。显然,每个动作都应该不同。然后更改执行处理程序,如下所示:

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;

如果您将同一动作连接到不同的组件(按钮、菜单等),并且必须根据触发的组件做出反应,则此操作也会起作用。在这种情况下,请使用actions'ActionComponent'属性来标识执行该操作的单个组件。在将其转换为TAction之前,不要忘记确保发送者是TAction<代码>如果发件人是TAction,则SalesInvFrm:=。。。(发件人为TAction)。标记…@Jerry No不要这样做。
as
是一种类型安全强制转换,当对象不是
TAction
时会引发异常。这就是你想要的,因为它就像一个断言。这意味着框架只能在响应某个操作时调用此方法。@DavidHeffernan如果需要使用收集数据所需的字符串参数,该怎么办。我有一个名为“doSave”的动作,在这个动作中,我处理很多事情和一些函数。可以为TAction设置一些参数吗?您需要派生一个具有string属性的子类。