在一个窗体里打开另外一个窗体
TfomrA=class(TFomr)
private
  fomrB: TfomrB;
public
    constructor Create; override;
    destructor Destroy; override;  
end;formb使用了三方控件EHLIBcreate的时候  formb:=TformB.create(nil);
destroy的时候  if Assigned(formb) then formB.Free;
调用的时候    formB.ShowModal;后期改为 
try
  formb:=TformB.create(nil);
finally
  formb.free
end;
问题在于程序运行时,
1. 无论上面那种调用方式。不定期的出现打开formB后,鼠标移动到formb里面的gridEh控件上时
   formB自动关闭,但是程序不会报错,try except end 检测不到错误,
   由于在ide环境中没有重复到错误,所以不知道是不是有三方控件屏蔽了错误。
2. 在程序中有很多该窗体的实例,formA_1, formA_2, formA_3.......
   如果formA_1出现formB窗体后,free掉formA_1后重新创建后,仍然会出现formA_1仍然会出错。
   在同时formA_2, formA_3打开formB不会出错,free掉其后重新创建也不会出错。问题可能出现在什么地方呢?

解决方案 »

  1.   

    说得很乱,实在看得不是很明白我是否可以这样理解
    1.主窗口MainForm 创建了formA_1, formA_2, formA_3
    2.formA_1创建formB ,formA_2创建formB,formA_3创建formB
     ( fomrB是TfomrA的一个成员,所以每一个TfomrA实例都可以创建一个FormB)
      

  2.   

    >>>后期改为
    try
    formb:=TformB.create(nil);
    finally
    formb.free
    end;这样写代码,formB一创建,马上又释放,怎么用?
      

  3.   

    >>如果formA_1出现formB窗体后,free掉formA_1后重新创建后,仍然会出现formA_1仍然会出错。你是怎么创建formA_1,然后又是怎么释放的呢,
      
      重复创建、释放一个窗口体,如果你用 if Assigned(formA_1)这种方法来判断时
      释放时,最好用FreeAndNil(formA_1);
      

  4.   

    你说的很对,是这样的,从我写的简化后的代码就可以看出来了应该是
    try
      formb:=TformB.create(nil);
      formb.showmodal;     //======================================忘记写了
    finally
      formb.free
    end;从SystUils.Pas中我们可以知道
    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;
    FreeAndNil只是增加了Obj:=nil 的操作,因此问题不可能出现在这里的。
      

  5.   

    TformA在程序中很多窗体的基类,