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

时间:2017-01-18 09:20:29

标签: delphi

以DRY原则为主导,这是在Delphi中使用一个动作显示两个子表单的最佳方式。 我的父表单有两个子表单的两个按钮。我有TActionList,其中TAction与OnExecute事件一起添加。子窗体的这两个按钮使用一个动作打开它们的最佳方法是什么。

1 个答案:

答案 0 :(得分: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;

几乎只要事件处理程序的主体包含多个内容,那么我就说有必要共享代码。