Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Delphi中动态创建表单的检查_Forms_Delphi_Callback - Fatal编程技术网

Forms Delphi中动态创建表单的检查

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;

我需要创建任意数量的动态创建的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;
该表单有一个调用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也采用了同样的方法