如何在不关闭非模态窗体的情况下将值从非模态窗体传回主窗体
How to pass back values from non modal form to main form without closing the non modal one
我的Delphi申请有两种形式:
主要的带有网格和修改按钮。我在select格子里加一行然后点修改。这会打开一个非模态 windows,我可以在其中修改从网格的 selected 行中提取的一些值。如果单击“确定”,我想将修改传回主窗体(和网格)但不关闭非模态窗体。这就是为什么我不想使用模态的原因。
我怎样才能做到这一点?我想我需要回调程序,但我不知道如何进行
- 在参数包含修改的主窗体中添加一个方法。
- 在无模式窗体按钮的
OnClick
处理程序中,调用您在步骤 1 中添加的方法。
我不喜欢让辅助表单(您的 "non modal form")知道主表单,因为这会降低它们的可重用性。另一方面,主窗体了解辅助窗体的详细信息是可以的。所以我的做法与大卫的回答略有不同。
声明回调的方法类型并为表单提供该类型的 属性:
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;
然后在辅助表单的确定按钮的 OnClick 处理程序中调用分配给 属性 的方法:
procedure THelperForm.OnbtnOKClick(Sender: TObject);
begin
if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
end;
我的Delphi申请有两种形式: 主要的带有网格和修改按钮。我在select格子里加一行然后点修改。这会打开一个非模态 windows,我可以在其中修改从网格的 selected 行中提取的一些值。如果单击“确定”,我想将修改传回主窗体(和网格)但不关闭非模态窗体。这就是为什么我不想使用模态的原因。 我怎样才能做到这一点?我想我需要回调程序,但我不知道如何进行
- 在参数包含修改的主窗体中添加一个方法。
- 在无模式窗体按钮的
OnClick
处理程序中,调用您在步骤 1 中添加的方法。
我不喜欢让辅助表单(您的 "non modal form")知道主表单,因为这会降低它们的可重用性。另一方面,主窗体了解辅助窗体的详细信息是可以的。所以我的做法与大卫的回答略有不同。
声明回调的方法类型并为表单提供该类型的 属性:
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;
然后在辅助表单的确定按钮的 OnClick 处理程序中调用分配给 属性 的方法:
procedure THelperForm.OnbtnOKClick(Sender: TObject);
begin
if Assigned(OnDataChanged) then OnDataChanged(Edit1.Text)
end;