我有一个Modal表单,在Ok按钮中它处理一些信息,我需要在调用模态表单的表单中。
如何在关闭之前将其取出?
或延迟收盘直到我说它可以关闭。
答案 0 :(得分:11)
我希望您的确定按钮的ModalResult
设置为mrOK
。如果要将错误检查添加到“确定”按钮,请将其更改为mrNone
。向按钮添加OnClick
处理程序,该按钮执行您需要的任何检查或处理。如果确定表单可以关闭,请在Self.ModalResult := mrOK
处理程序中设置OnClick
。
答案 1 :(得分:7)
在表单关闭之前,您真的需要访问这些信息吗?延迟关闭表单会影响应用程序的用户体验(除非它足够快,以至于他们没有注意到 - 在这种情况下为什么要延迟它?)
关闭表单在内存中仍然可用于调用者(除非关闭操作是caFreeOnClose)。因此,您应该能够将公共属性添加到表单中,然后您可以在调用者中访问该表单。
e.g
Type Form2 = Class(TForm)
public
//Add a public property here
end;
来自来电者:
if Form2.ShowModal = mrOk then
begin
InformationIWant = Form2.PublicProperty;
end;
答案 2 :(得分:5)
只是其他人所说的内容的组合。
最好形式化如何从模态对话框中验证和获取数据。 一遍又一遍地使用相同的技术使一切都更容易维护和阅读。
一个例子:
Type TFormModal = Class(TForm)
procedure OnOkClick( Sender : TObject);
function ValidateInterface : boolean;
public
procedure SetInterface( input data here);
procedure GetInterface( output data here);
end;
procedure TFormModal.OnOkClick( Sender : TObject);
begin
if ValidateInterface
then modalResult := mrOk
else modalResult := mrNone;
end;
来自您的主要表单:
procedure MainForm.OnShowMyModalFormClick( sender : TObject);
var
myModal : TFormModal;
begin
...
myModal := TFormModal.Create( nil);
try
myModal.SetInterface( ...);
if (myModal.ShowModal = mrOk) then myModal.GetInterface(...);
finally
myModal.Free;
end;
...
end;
答案 3 :(得分:2)
作为JamesB's answer的补充。
您必须致电Form2.Free,然后取得您想要的信息。
我通常会在第二个表单的单元中添加一个新函数,例如:
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
InformationIWant : SomeType;
end;
var
Form2: TForm2;
function ReturnValue : SomeType
implementation
function ReturnValue : Sometype;
begin
try
if Form2 = nil then
Form2 := TForm2.Create(nil);
Form2.Windowstate := wsNormal;
Form2.BringToFront;
SetForegroundWindow(Application.Handle);
if Form2.ShowModal then
Result := InformationIWant
finally
FreeAndNil(Form2);
end;
end;
答案 4 :(得分:2)
David的答案替代方法是使用OnClose
或OnCloseQuery
个事件。使用OnCloseQuery
,您可以通过设置CanClose := false;
答案 5 :(得分:0)
比方说,您要做的不只是简单地知道用户是否按了模态来源中的“确定”或“取消”按钮。
假设您需要在FromSettings中为MainFrom设置一些参数。
当然,MainFrom必须具有一些公开的(公共)字段,您可以在其中从FormSettings接收数据,例如:
FormMain.AlphaBlendValue := FormSettings.spnTransparency;
提示1:
您不必将数据从FormSettings传输到MainForm。如果更适合您,您还可以将数据保存在全局变量中或进行记录。
提示2:
我个人不使用上述方法,该方法旨在在释放FormSettings时节省RAM。
实际上,我从未破坏过SettingsForm。有人会说这是“恐怖”的事情,但是今天的计算机至少有4GB或RAM,并且带有某些控件的表单将“浪费”非常少的RAM。因此,FormSettings一直是内存。当我需要一些值时,只需让MainForm从FormSettings中读取它们即可。
同样,这绝对是推荐的方法。这是方便的方法:)您已经被警告!