如何将值从非模态形式传递回主窗体而不关闭非模态窗体

时间:2018-05-22 15:38:36

标签: delphi callback procedure

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

1 个答案:

答案 0 :(得分:4)

我不喜欢让帮助形式(你的“非模态形式”)知道主要形式,因为这使它们不那么可重复使用。另一方面,主表单知道帮助表单的详细信息是可以的。所以我的做法与大卫的回答略有不同。

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

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;