Forms Delphi中动态创建表单的检查
我需要创建任意数量的动态创建的Form1(MDI)实例Forms Delphi中动态创建表单的检查,forms,delphi,callback,Forms,Delphi,Callback,我需要创建任意数量的动态创建的Form1(MDI)实例 class procedure TForm1.ShowForm; var Form1: TForm1; begin Form1 := TForm1.Create(nil); Form1.Show; end; 结束时: procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;
class procedure TForm1.ShowForm;
var
Form1: TForm1;
begin
Form1 := TForm1.Create(nil);
Form1.Show;
end;
结束时:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
该表单有一个调用Form2的按钮。
Form2处理一些东西,显示进度,最后执行创建时传递的回调函数:
表格1上的回调:
procedure TForm1.MyCallback(icont_process: Integer);
begin
Self.LabelResult.Caption := IntToStr(icont_process)+' processed itens.');
end;
表格2的创建:
class procedure TForm2.ShowForm(AMyCallback: TMyCallback);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(nil);
with Form2 do
begin
FMyCallback := AMyCallback;
Show;
end;
end;
回调时出现问题
如何检查应返回结果的Form1实例是否仍然有效?
如果我关闭Form1,Form2不应该执行回调。。。你知道我该怎么检查吗?你有两个选择:
Form2
仍处于打开状态时,不要让Form1
关闭即可。例如,使用Form2.showmodel()
而不是Form2.Show()
Form2
超过Form1
,请使Form1
保留对其关联Form2
的引用,然后在关闭Form1
时清除回调指针
private
FForm2: TForm2;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if FForm2 <> nil then
FForm2.FMyCallback := nil;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if FForm2 = nil then
begin
FForm2 := TForm2.Create(Application);
FForm2.FMyCallback := MyCallback;
FForm2.OnDestroy := Form2Destroyed;
end;
FForm2.Show;
end;
procedure TForm1.Form2Destroyed(Sender: TObject);
begin
FForm2 := nil;
end;
private
FForm2:TForm2;
程序TForm1.FormDestroy(发送方:ToObject);
开始
如果FForm2为零,则
FForm2.FMyCallback:=nil;
结束;
过程TForm1.FormClose(发送方:TObject;var操作:TCloseAction);
开始
动作:=caFree;
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
如果FForm2=nil,则
开始
FForm2:=TForm2.Create(应用程序);
FForm2.FMyCallback:=MyCallback;
FForm2.OnDestroy:=形式2已去氧;
结束;
FForm2.表演;
结束;
程序TForm1.Form2Destroyed(发送方:ToObject);
开始
FForm2:=零;
结束;
类似于:当Form1调用TForm2.ShowForm()时,保存对已创建Form2的引用(将类过程更改为类函数并返回Form2的引用)。在Form2中声明一个过程“ShutDown”,Form1可以调用该过程(使用它拥有的引用)。Form2停止其任务并在“ShutDown”中释放自身.Form1在Form2通过回调正常退出时删除Form2引用。谢谢@TomBrunberg,我相信Remy Lebeu的aswer也采用了同样的方法