使用窗口的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;揭贴吧!
var I:Integer; begin for I:= Self.MDIChildCount-1 downto 0 do //这里的Self指代主窗体 MDIChildren[I].Free; end;FreeAndNil只能对变量操作,另,子窗口可能相互有依赖性,所以从最后一个开始Free。————————————————————————————————— 宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。 —————————————————————————————————
procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end;-----------------------------------------------------------这个是在SysUtils单元定义的FreeAndNil过程的VCL码,可以看到这个过程不仅仅是对变量进行操作,将同时对对象指针和对象进行操作!另外,二楼的倒序释放解决不了窗口相互依赖的问题。对于MDI程序,子窗口的顺序默认情况下是创建顺序,但这个顺序不是一尘不变的,一旦有某个先前被创建的子窗口被激活的情况下,这个顺序马上改变----被激活的窗口跑到了顺序的第一位!而对于刚刚创建的窗口则放到列表的最后!特此更正!
I:Integer;
begin
for I:=0 to Self.MDIChildCount-1 do //这里的Self指代主窗体
if Assigned(MDIChildren[I]) then
FreeAndNil(MDIChildren[I]);
end;揭贴吧!
I:Integer;
begin
for I:= Self.MDIChildCount-1 downto 0 do //这里的Self指代主窗体
MDIChildren[I].Free;
end;FreeAndNil只能对变量操作,另,子窗口可能相互有依赖性,所以从最后一个开始Free。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;-----------------------------------------------------------这个是在SysUtils单元定义的FreeAndNil过程的VCL码,可以看到这个过程不仅仅是对变量进行操作,将同时对对象指针和对象进行操作!另外,二楼的倒序释放解决不了窗口相互依赖的问题。对于MDI程序,子窗口的顺序默认情况下是创建顺序,但这个顺序不是一尘不变的,一旦有某个先前被创建的子窗口被激活的情况下,这个顺序马上改变----被激活的窗口跑到了顺序的第一位!而对于刚刚创建的窗口则放到列表的最后!特此更正!