在Delphi上检查动态创建的表单

时间:2017-04-03 16:39:27

标签: 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;

表单有一个调用Form2的按钮。 Form2处理一些东西,显示进度,最后执行一个在其创建时传递的回调函数:

Form1上的

回调:

procedure TForm1.MyCallback(icont_process: Integer);
begin
  Self.LabelResult.Caption := IntToStr(icont_process)+' processed itens.');
end;

创建Form2:

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不应该执行回调...我应该如何检查?

1 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 在关联的Form1仍处于打开状态时,不要让Form2关闭。例如,使用Form2.ShowModal()代替Form2.Show()

  2. 如果您必须允许Form2超过Form1,请让Form1保持对其关联的Form2的引用,然后在Form1时清除回调指针{1}}已关闭。

    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;