2017-01-18 86 views

回答

3

我会使用共享相同的OnExecute事件处理程序的两个操作。使用该事件处理程序的Sender参数来区分:

procedure TMainForm.acShowFormExecute(Sender: TAction); 
begin 
    if Sender=acShowForm1 then 
    Form1.Show 
    else if Sender=acShowForm2 then 
    Form2.Show 
    else 
    raise ESomeInternalExceptionClass.Create('Unexpected action'); 
end; 

你需要用两个动作,因为,例如,你的两个按键也会有不同的字幕。

对于这个特殊的例子,共享OnExecute事件处理程序是否值得它是有点没有意义的。如果你有不同的事件处理程序看起来像:

procedure TMainForm.acShowForm1Execute(Sender: TAction); 
begin 
    Form1.Show; 
end; 

procedure TMainForm.acShowForm2Execute(Sender: TAction); 
begin 
    Form2.Show; 
end; 

话又说回来,如果你需要做额外的工作在你的事件处理程序,天平提示备份的其他方式:

procedure TMainForm.acShowFormExecute(Sender: TAction); 
var 
    FormClass: TMyChildFormClass; 
    Form: TTMyChildForm; 
begin 
    if Sender=acShowForm1 then 
    FormClass := TForm1 
    else if Sender=acShowForm2 then 
    FormClass := TForm2 
    else 
    raise ESomeInternalExceptionClass.Create('Unexpected action'); 

    Form := FormClass.Create(GetParam1, GetParam2); 
    try 
    Form.ShowModal; 
    finally 
    Form.Free; 
    end;  
end; 

差不多只要事件处理程序的主体由多个单独的班轮组成,那么我认为值得分享代码。

+0

谢谢你的回答。如果您将操作标题属性保留为空并仅修改按钮标题,则可以为按钮设置1个操作和2个不同的标题。 –

+0

这很有趣,我不知道。当然,那你就不能歧视! –

+1

设置操作后,您可以修改按钮标题,而不管标题是否为空白。但是这违背了行动的追求。它有更重要的属性。 – kobik