Delphi 如何在不关闭非模态窗体的情况下将值从非模态窗体传回主窗体

Delphi 如何在不关闭非模态窗体的情况下将值从非模态窗体传回主窗体,delphi,callback,procedure,Delphi,Callback,Procedure,我的Delphi应用程序有两种形式: 带有网格和“修改”按钮的主视图。我在网格中选择一行,然后单击“修改”。这会打开一个非模式窗口,在该窗口中我可以修改从网格的选定行提取的一些值。如果单击“确定”,我希望将修改传递回主窗体(和网格),但不关闭非模态窗体。这就是为什么我不想使用模态。 我该怎么做?我想我需要回调过程,但我不知道如何继续 向其参数包含修改的主窗体添加方法 在无模式表单上按钮的OnClick处理程序中,调用您在步骤1中添加的方法 向其参数包含修改的主窗体添加方法 在无模式表单上按钮的O

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

  • 向其参数包含修改的主窗体添加方法
  • 在无模式表单上按钮的
    OnClick
    处理程序中,调用您在步骤1中添加的方法
  • 向其参数包含修改的主窗体添加方法
  • 在无模式表单上按钮的
    OnClick
    处理程序中,调用您在步骤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;
    
    procedure THelperForm.OnbtnOKClick(Sender: TObject);
    begin
      if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
    end;
    
    在助手窗体的OK按钮的OnClick处理程序中,调用分配给属性的方法:

    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;
    
    procedure THelperForm.OnbtnOKClick(Sender: TObject);
    begin
      if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
    end;
    

    我不想让助手表单(您的“非模态表单”)意识到主表单,因为这会降低它们的可重用性。另一方面,主窗体了解助手窗体的详细信息是可以的。所以我的回答和大卫的略有不同

    声明回调的方法类型,并为窗体提供该类型的属性:

    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;
    
    procedure THelperForm.OnbtnOKClick(Sender: TObject);
    begin
      if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
    end;
    
    在助手窗体的OK按钮的OnClick处理程序中,调用分配给属性的方法:

    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;
    
    procedure THelperForm.OnbtnOKClick(Sender: TObject);
    begin
      if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
    end;