如题...

解决方案 »

  1.   

    使用窗口的MDIChildCount属性遍历就可以了(假设你的MDI Child Form是动态创建的),如下:var
      I:Integer;
    begin
      for I:=0 to Self.MDIChildCount-1 do  //这里的Self指代主窗体
        if Assigned(MDIChildren[I]) then
          FreeAndNil(MDIChildren[I]);
    end;揭贴吧!
      

  2.   

    var
      I:Integer;
    begin
      for I:= Self.MDIChildCount-1 downto 0 do  //这里的Self指代主窗体
        MDIChildren[I].Free;
    end;FreeAndNil只能对变量操作,另,子窗口可能相互有依赖性,所以从最后一个开始Free。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  3.   

    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;
      Temp.Free;
    end;-----------------------------------------------------------这个是在SysUtils单元定义的FreeAndNil过程的VCL码,可以看到这个过程不仅仅是对变量进行操作,将同时对对象指针和对象进行操作!另外,二楼的倒序释放解决不了窗口相互依赖的问题。对于MDI程序,子窗口的顺序默认情况下是创建顺序,但这个顺序不是一尘不变的,一旦有某个先前被创建的子窗口被激活的情况下,这个顺序马上改变----被激活的窗口跑到了顺序的第一位!而对于刚刚创建的窗口则放到列表的最后!特此更正!
      

  4.   

    对,二楼说的很正确,FreeAndNil不可以对引用进行操作!