代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
k:integer;
MDIfrm:TForm;
begin
for i:=0 to listbox1.Count-1 do
begin
if listbox1.Selected[i] then
begin
if i=j then
begin
exit;
end
else
begin
for k:=self.MDIChildCount-1 downto 0 do
begin
MDIfrm := mainform.MDIChildren[k];
if Assigned(MDIfrm) then
begin
FreeAndNil(MDIfrm);
end;
end;
j:=i;
case i of
0:
begin
if form11<>nil then
begin
FreeAndNil(form11)
end
else
begin
Form11:=TForm11.Create(Self);
Form11.Show;
end;
end;
1:
begin
if (form21<>nil) and (form22<>nil) then
begin
FreeAndNil(form21);
FreeAndNil(form22);
end
else
begin
Form21:=TForm21.Create(Self);
Form21.Show;
Form22:=TForm22.Create(Self);
Form22.Show;
end;
end;
2:
begin
if (form31<>nil) and (form32<>nil) and (form33<>nil) then
begin
FreeAndNil(form31);
FreeAndNil(form32);
FreeAndNil(form33);
end
else
begin
Form31:=TForm31.Create(Self);
Form31.Show;
Form32:=TForm32.Create(Self);
Form32.Show;
Form33:=TForm33.Create(Self);
Form33.Show;
end;
end;
end;
end;
end;
end;
end;
代码说明:mainform为主窗体formstyle为fsMDIForm
其他(form11,form21,form22,form31,form32,form33)均为子窗体,formstyle为fsMDIChild
要求:选择不同的listbox项,开启不同的子窗体集合(如第二项,将开启form21,form22)
出现问题:我在释放了当前选中的listbox项(1:)时所对应的子窗体时,间隔的选择曾经选择的项(1:),
在我做判断时候(if (form21<>nil) and (form22<>nil)),发现该语句仍然为True,也就是说freeandnil未对该释放完全.求解!
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
k:integer;
MDIfrm:TForm;
begin
for i:=0 to listbox1.Count-1 do
begin
if listbox1.Selected[i] then
begin
if i=j then
begin
exit;
end
else
begin
for k:=self.MDIChildCount-1 downto 0 do
begin
MDIfrm := mainform.MDIChildren[k];
if Assigned(MDIfrm) then
begin
FreeAndNil(MDIfrm);
end;
end;
j:=i;
case i of
0:
begin
if form11<>nil then
begin
FreeAndNil(form11)
end
else
begin
Form11:=TForm11.Create(Self);
Form11.Show;
end;
end;
1:
begin
if (form21<>nil) and (form22<>nil) then
begin
FreeAndNil(form21);
FreeAndNil(form22);
end
else
begin
Form21:=TForm21.Create(Self);
Form21.Show;
Form22:=TForm22.Create(Self);
Form22.Show;
end;
end;
2:
begin
if (form31<>nil) and (form32<>nil) and (form33<>nil) then
begin
FreeAndNil(form31);
FreeAndNil(form32);
FreeAndNil(form33);
end
else
begin
Form31:=TForm31.Create(Self);
Form31.Show;
Form32:=TForm32.Create(Self);
Form32.Show;
Form33:=TForm33.Create(Self);
Form33.Show;
end;
end;
end;
end;
end;
end;
end;
代码说明:mainform为主窗体formstyle为fsMDIForm
其他(form11,form21,form22,form31,form32,form33)均为子窗体,formstyle为fsMDIChild
要求:选择不同的listbox项,开启不同的子窗体集合(如第二项,将开启form21,form22)
出现问题:我在释放了当前选中的listbox项(1:)时所对应的子窗体时,间隔的选择曾经选择的项(1:),
在我做判断时候(if (form21<>nil) and (form22<>nil)),发现该语句仍然为True,也就是说freeandnil未对该释放完全.求解!
begin
MDIfrm := mainform.MDIChildren[k];
if Assigned(MDIfrm) then
begin
FreeAndNil(MDIfrm);
end;
end;
Form11:=nil;
Form21:=nil;
Form22:=nil;
Form31:=nil;
.
.
你是用了FreeAndNil,但它们的对象不是Form11等,窗体是释放了,Form11指针还未为空啊
其实我主要的功能就是释放当前的子窗体窗体(根据listbox选项),
你的代码:
for k:=self.MDIChildCount-1 downto 0 do
begin
MDIfrm := mainform.MDIChildren[k];
if Assigned(MDIfrm) then
begin
FreeAndNil(MDIfrm);
end;
end;
Form11:=nil;
Form21:=nil;
Form22:=nil;
Form31:=nil;
在freeandnil,后在次使form:=nil;我想用一个通用的方法解决,能够完全释放。如何?
那么在每个Form的OnClose里写,比如Form: FreeAndNil(Form11)procedure TForm1.Button1Click(Sender: TObject);
function GetIndex:Integer
var
i:Integer;
begin
Result:=-1;
for i:=0 to ListBox1.Count-1 do
begin
if ListBox1.Selected[i] then Result=i;
end;
end;
var
i:integer;
begin
for i:=Self.MDIChildCount-1 downto 0 do
Self.MDIChildren[i].Close;
Case GetIndex of
0:
begin
Form11:=TForm11.Create(Self);
Form11.Show;
end;
1:
begin
Form21:=TForm21.Create(Self);
Form21.Show;
end;
2:
3:
end;
for k:=self.MDIChildCount-1 downto 0 do
begin
MDIfrm := mainform.MDIChildren[k];
if Assigned(MDIfrm) then
begin
MDIfrm.free;
MDIfrm:=nil;
end;
end;
结果还是不行.
MDIfrm 与Form21 等是两个不同的对象变量(一种隐藏的指针),这两个变量中保存的是对象首地址.当FreeAndNil(MDIfrm)的时候,内存被释放同时将MDIfrm置为Nil.这个在另外一个指针变量Form21所引用的内存也已经不存在了,但是这个变量中所保存的地址并没有被清空,也就是
Form21<>nil的原因了.