【问题标题】:How to pass back values from non modal form to main form without closing the non modal one如何在不关闭非模态表单的情况下将值从非模态表单传递回主表单
【发布时间】:2018-05-22 15:38:35
【问题描述】:

我的 Delphi 应用程序有两种形式: 主要的有一个网格和一个按钮修改。我在网格中选择一行,然后单击修改。这可以打开一个非模态窗口,我可以在其中修改从选定的网格行中提取的一些值。如果单击“确定”,我想将修改传递回主窗体(和网格),但不关闭非模态窗体。这就是为什么我不想使用模态的。 我怎样才能做到这一点?我想我需要回调程序,但我不知道如何进行

【问题讨论】:

    标签: delphi callback procedure


    【解决方案1】:

    我不喜欢让辅助表单(您的“非模态表单”)知道主表单,因为这会降低它们的可重用性。另一方面,主窗体知道有关辅助窗体的详细信息是可以的。所以我的做法与大卫的回答略有不同。

    为回调声明方法类型并为表单提供该类型的属性:

    type
      TDataChangedEvent = procedure(const aText: string) of object;
    
      THelperForm = class(TForm)
      public
        OnDataChanged: TDataChangedEvent;
      ...
      end;
    

    在主窗体上,有一个该类型的方法,当您单击Modify 时将其分配给辅助窗体的属性:

    procedure TMainForm.OnDataCallback(const aText: string);
    begin
      ShowMessage(aText);
    end;
    
    procedure TMainForm.OnModifyClick(Sender: TObject);
    var HelperWnd: THelperWnd;
    begin
      HelperWnd := THelperWnd.Create(Self);
      HelperWnd.OnDataChanged := Self.OnDataCallback;
      HelperWnd.Show;
    end;
    

    在帮助表单的 OK 按钮的 OnClick 处理程序中,您调用分配给属性的方法:

    procedure THelperForm.OnbtnOKClick(Sender: TObject);
    begin
      if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
    end;
    

    【讨论】:

      【解决方案2】:
      1. 向主窗体添加一个方法,其参数包含修改。
      2. 在无模式窗体上按钮的OnClick 处理程序中,调用您在步骤 1 中添加的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-23
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 2011-12-27
        相关资源
        最近更新 更多