【问题标题】:Best way to show two forms with one action in Delphi在 Delphi 中用一个动作显示两种形式的最佳方法
【发布时间】:2017-01-18 09:20:28
【问题描述】:

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

    我将使用共享相同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 个不同的标题。
    • 这很有趣,我不知道。当然,那你就不能歧视了!
    • 你可以在设置动作后修改按钮标题,不管它的标题是否为空白。但这违背了行动的目的。它有更重要的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多