代码如下:
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未对该释放完全.求解!

解决方案 »

  1.   

    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,但它们的对象不是Form11等,窗体是释放了,Form11指针还未为空啊
      

  2.   

    TO HsWong() :"不用写那么一大堆",如何写?
    其实我主要的功能就是释放当前的子窗体窗体(根据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;我想用一个通用的方法解决,能够完全释放。如何?
      

  3.   

    反正你的Form对象指针用全局变量
    那么在每个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;
      

  4.   

    如果需要在每个窗体里用A:action:=cafree,form:=nil,那我就不问了,就是不知道什么原因,在窗体里通过A方法是可以完全释放的,用B方式(freeandnil(MDIChildren[i]))在主窗体中为什么就不可以呢,你说是指针未释放,说的我还是不时很清楚!其实我也试过这种方法:如下         
    for k:=self.MDIChildCount-1 downto 0 do
            begin
              MDIfrm := mainform.MDIChildren[k];
              if Assigned(MDIfrm)   then
              begin
                MDIfrm.free;
                MDIfrm:=nil; 
              end;
            end;
    结果还是不行.
      

  5.   

    在子窗口 OnDestroyif Form1 = Self then Form1 := nil;
      

  6.   

    MDIfrm 和 Form21 (或者其他什么的) 是两个不同的变量(指针),指向同一个内存地址。你把MDIfrm置空并不影响 Form21
      

  7.   

    回复:
    MDIfrm 与Form21 等是两个不同的对象变量(一种隐藏的指针),这两个变量中保存的是对象首地址.当FreeAndNil(MDIfrm)的时候,内存被释放同时将MDIfrm置为Nil.这个在另外一个指针变量Form21所引用的内存也已经不存在了,但是这个变量中所保存的地址并没有被清空,也就是
    Form21<>nil的原因了.