Delphi 在模式窗体关闭之前从其获取数据
我有一个模态表单,在Ok按钮中,它处理一些信息,这些信息是我在称为模态表单的表单中需要的 我怎样才能在关门前把它弄出来Delphi 在模式窗体关闭之前从其获取数据,delphi,modal-dialog,Delphi,Modal Dialog,我有一个模态表单,在Ok按钮中,它处理一些信息,这些信息是我在称为模态表单的表单中需要的 我怎样才能在关门前把它弄出来 或者延迟关闭,直到我说它可以关闭。我希望您的“确定”按钮将ModalResult设置为mrOK。如果要将错误检查添加到“确定”按钮,请将其更改为mrNone。在按钮上添加一个OnClick处理程序,该处理程序执行您需要的任何检查或处理。如果确定表单可以关闭,请在OnClick处理程序中设置Self.ModalResult:=mrOK。关闭表单之前,您真的需要访问信息吗?延迟关闭
或者延迟关闭,直到我说它可以关闭。我希望您的“确定”按钮将
ModalResult
设置为mrOK
。如果要将错误检查添加到“确定”按钮,请将其更改为mrNone
。在按钮上添加一个OnClick
处理程序,该处理程序执行您需要的任何检查或处理。如果确定表单可以关闭,请在OnClick
处理程序中设置Self.ModalResult:=mrOK
。关闭表单之前,您真的需要访问信息吗?延迟关闭表单会影响用户对应用程序的体验(除非它足够快以至于他们没有注意到-在这种情况下,为什么要延迟呢?)
调用方的内存中仍然有一个关闭的窗体(除非关闭操作是caFreeOnClose)。因此,您应该能够将公共属性添加到表单中,然后可以在调用者中访问该表单 e、 g 从调用方:
if Form2.ShowModal = mrOk then
begin
InformationIWant = Form2.PublicProperty;
end;
作为补充
在你获取你想要的信息后,你必须给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;
只是其他人所说的话的组合 将如何验证和从模式对话框中获取数据形式化是一个好主意。 反复使用相同的技术可以使所有内容更易于维护和阅读 例如:
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;
David回答的另一种方法是使用
OnClose
或OnCloseQuery
事件。使用OnCloseQuery
可以通过设置CanClose:=false来防止表单关闭代码>假设您想要做的不仅仅是简单地知道用户是否在您的模式中按下了“确定”或“取消”按钮。
假设您需要在FromSettings中为Main设置一些参数
创建并显示FormSettings模式
当用户按下FormSettings中的“OK”(或“Apply”)按钮关闭表单时,您将所有数据从FormSettings传输到MainForm
最后调用FormSettings.Close或更好的FormSettings.Release(非FormSettings.Free)关闭表单
当然,MainFrom必须有一些公开(公共)字段,在这些字段中您可以从FormSettings接收数据,例如:
FormMain.AlphaBlendValue := FormSettings.spnTransparency;
提示1:
您不必将数据从FormSettings传输到MainForm。如果它更适合您,您还可以将数据保存在全局变量或记录中
提示2:
我个人不使用上述方法,该方法旨在释放FormSettings时保存RAM。
实际上我从来没有破坏过设置窗体。有些人会说这是“恐怖”的,但今天的计算机有4GB或RAM(至少),并且一个带有一些控件的表单将“浪费”很少的RAM。因此,FormSettings始终在内存中。当我需要一些值时,我只让主窗体从FormSettings读取它们。
再一次。。。这绝对是推荐的方法。这是最方便的方式:)你已经被警告了 祝贺你登上了榜首。有人知道为什么这个答案有两张反对票吗?这似乎是解决问题中“延迟关闭直到我说它可以关闭”部分的唯一答案。在关闭表单之前,我需要做一些事情,这解决了我的问题!这里有几个问题:1<代码>显示
不是一项功能。你大概是指ShowModal
。2.你没有提到问题中关于“延迟关闭直到我说它可以关闭”的部分。@DavidHeffernan:谢谢大卫,我目前没有访问德尔福的权限,所以无法检查。我已经更新了答案。我已尝试解决您的第二个问题,通常需要验证数据并阻止表单关闭。这必须发生在表单内部,而不是在showmodel
返回之后。@DavidHeffernan:我认为这个问题不是关于验证数据,而是关于访问调用代码中对话框的数据。JamesB在回答中提到了这一点。“除非关闭操作是caFreeOnClose”-不幸的是,在许多(大多数?)情况下都会发生这种情况。FreeAndNil(Form2)清楚地表明,Form2可以是ReturnValue
中的局部变量,而不是全局变量。重要信息:最好在表单上调用.Release,而不是.Free。释放将使表单有机会处理队列中所有剩余的消息。见:
FormMain.AlphaBlendValue := FormSettings.spnTransparency;