在Delphi中用一个动作显示两个表单的最佳方法

在Delphi中用一个动作显示两个表单的最佳方法,delphi,Delphi,以DRY原则为指导,这是在Delphi中用一个动作显示两个子窗体的最佳方式。 我的父窗体有两个用于两个子窗体的按钮。我有一个TActionList,其中TAction添加了OneExecute事件。这两个按钮对于子窗体使用一个操作打开它们的最佳方式是什么。我将使用共享相同的OnExecute事件处理程序的两个操作。使用该事件处理程序的Sender参数来区分: procedure TMainForm.acShowFormExecute(Sender: TAction); begin if Se

以DRY原则为指导,这是在Delphi中用一个动作显示两个子窗体的最佳方式。
我的父窗体有两个用于两个子窗体的按钮。我有一个TActionList,其中TAction添加了OneExecute事件。这两个按钮对于子窗体使用一个操作打开它们的最佳方式是什么。

我将使用共享相同的
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;

只要事件处理程序的主体由多个线性程序组成,那么我就认为值得分享代码。

谢谢您的回答。它可以有1个动作和2个不同的按钮标题,如果你把动作标题属性留空,只修改按钮标题。这很有趣,我不知道。当然,那你就不能歧视了!设置操作后,无论其标题是否为空,都可以修改按钮标题。但这违背了行动的追求。它具有更重要的性质。