Delphi```
  我有一个主窗体A(fsMDIForm),一个子窗体B(fsMDIChild),一个正常窗体(fsNormal).
      A 的Create 什么也没有做```
      B 的Create 做了个查询              
      C 的Create 做了个查询,并根据查询结果生成了一个动态数组,然后又数组绑定``生成一些动态控件.
       
   步骤:A  调用  B  调用  C
调用没有出现问题```一切很正常``
     
      但是 当我关闭就出现问题
         1\当 C 窗体没有生成动态数组及动态控件  ,关闭C 窗体很正常,然后关闭 B窗体 也正常.
         2\当 C 窗体有生成动态数组及动态控件  ,关闭C 窗体正常, 然后关闭 B 窗体就报错,\
  错误步骤如下:
         1\ Invalid pointer operation
         2\Access violation at address ```````````` 
     等错误弹过后```然后在打开 B窗体 `
         就告知: A Conponent named  Mlll_Frm already exists.      请朋友们帮我解决下这个问题``我在线等候``谢谢```
    本人QQ  251812159
   
      

解决方案 »

  1.   


      for i :=0 to AFrm.MDIChildCount -1 do
       if (AFrm.MDIChildren[i] is TBFrm) then
       begin
         self.MDIChildren[i].BringToFront;
         MDIChildren[i].SetFocus;
         Exit;
       end;  //创建新窗体
      Application.CreateForm(TBFrm,BFrm);
      MeterFrm.Show;
    释放:procedure TBFrm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      BFrm := nil;
      Action := caFree;
    end;
      

  2.   

    to (kampan)
        该如何释放`我能想到的我都想了 `` 我C 窗体释放代码如下:
             close事件 
              CBox:=nil;//我创建的动态数组
              Action:=caFree;
      

  3.   


    在Delphi程序中,一个最普遍导致Access Violation错误的原因是使用了一个没有被创建的对象!
      

  4.   

       代码如下`:
         B(fsMDIChild)窗体调用代码:
               if YanSe_Frm=nil then
                  YanSe_Frm:=TYanSe_Frm.Create(Self);   //创建窗体
                 YanSe_Frm.Show;   //显示窗体
         B(fsMDIChild)窗体释放代码:
                Action:=caFree;
    -----------------------------------------------------
         C(fsNormal)窗体全部代码:
    procedure TYanSe_Frm.FormCreate(Sender: TObject);
    var
      SqlStr:String;
      TempStr:String;
    begin
      tp:=30;
      count:=1;
      Label3.Caption:=Mlll_Frm.cxComboBox2.Text+'颜色:';
      TempStr:=Copy(Mlll_Frm.cxComboBox2.Text,1,Pos('/',Mlll_Frm.cxComboBox2.Text)-1);
      SqlStr:='SELECT  MIANLIAO.MLDM,MIANLIAO.MLMC,DANWEI.DWMC ,VW_MLJXCMX.GGDM as YSDM,HGUIGE1.GGMC as YSMC,SUM(VW_MLJXCMX.SL) AS SL_S '
               +' FROM (SELECT CKDM,QRRQ,MLDM,GGDM,SL FROM VW_MLJXCMX WITH (NOLOCK) WHERE VW_MLJXCMX.QR='+QuotedStr('1')+' and MLDM='+QuotedStr(TempStr)+' )VW_MLJXCMX, MIANLIAO, CANGKU, DANWEI   ,HGUIGE1  WITH (NOLOCK) '
               +' WHERE VW_MLJXCMX.MLDM=MIANLIAO.MLDM AND VW_MLJXCMX.CKDM=CANGKU.CKDM  AND MIANLIAO.DWDM = DANWEI.DWDM  AND VW_MLJXCMX.GGDM=HGUIGE1.GGDM  '
               +' GROUP BY   MIANLIAO.MLDM,MIANLIAO.MLMC,DANWEI.DWMC ,VW_MLJXCMX.GGDM,HGUIGE1.GGMC  HAVING SUM(VW_MLJXCMX.SL) <>0';  OpenQuery(DataModule1.ADOQuery1,SqlStr);//自定义函数,功能就是查询.
      SetLength(CBox,DataModule1.ADOQuery1.RecordCount); //为动态数组划分空间
      DataModule1.ADOQuery1.First;
      while not(DataModule1.ADOQuery1.Eof) do
      begin
         TempStr:=DataModule1.ADOQuery1.FieldValues['YSDM']  +'/'+DataModule1.ADOQuery1.FieldValues['YSMC'];
         CreateBtn(Sender,TempStr,clRed,17,97,67,tp);
         DataModule1.ADOQuery1.Next;
         count:=count+1;
         tp:=tp+25;
      end;
    end;
    //创建CheckBox
    function TYanSe_Frm.CreateBtn(Sender: TObject; BtnCaption: String;
      BtnColor: TColor; BtnHeight, BtnWidth, BtnLeft,
      BtnTop: Integer): Integer;
    begin
      CBox[Count]:=TcxCheckBox.Create(Self);
      CBox[Count].Parent:=Self;
      CBox[Count].Properties.Alignment:=taRightJustify;
      CBox[Count].Caption:=BtnCaption;
    //  DTbutton.Font.Color:=BtnColor;
      CBox[Count].Height:=BtnHeight;
      CBox[Count].Width:=BtnWidth;
      CBox[Count].Left:=BtnLeft;
      CBox[Count].Top:=BtnTop;
      CBox[Count].Cursor:=crHandPoint;
    //  按钮事件
     // CBox[Count].OnClick:=OnCheckChick;
    //  DTbutton.OnMouseUp:=MYRightClick;
      CBox[Count].Show;
    end;procedure TYanSe_Frm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      //YanSe_Frm:=nil;
      //CBox:=nil;
      //YanSe_Frm.Free;
     // Action:=caHide;
     {
    try
      CBox:=nil;
    except
      ShowMessage('未释放');
    end;     
      }
    end;procedure TYanSe_Frm.FormDestroy(Sender: TObject);
    begin
     CBox:=nil;
    end;end.
        
      

  5.   

      B(fsMDIChild)窗体调用代码:
              if YanSe_Frm=nil then
                  YanSe_Frm:=TYanSe_Frm.Create(Self);  //创建窗体
                YanSe_Frm.Show;  //显示窗体
        B(fsMDIChild)窗体释放代码:
                Action:=caFree; 
                B窗体变量 := nil;
      

  6.   

    to (SmallHand)
           你的意思是让每个  Cbox:=nil  ?
      但是,我在关掉 B 窗体的时候还是报错啊 ``错误跟我刚刚说的一样```
      
      

  7.   

    for i := 0 to count-1 do
      begin
        CBox[Count].Free;
      end;
      

  8.   

    一般有Action:=caFree;就行了, 试试去掉CBox的free操作看看
      

  9.   

    就算你要free它,Action:=caFree;也是放在最后的(即成为最后一句).
      

  10.   


    CBox[Count]:=TcxCheckBox.Create(Self); //刚刚看到这里,你不需要手工释放CBox,系统会自动为你释放的!
      

  11.   

    问题出在这~~::::
       SetLength(CBox,DataModule1.ADOQuery1.RecordCount); //为动态数组划分空间 
    我把它改成:
       SetLength(CBox,100);
     就什么问题也没有了``很神奇吧``同时也很抑郁~!!~!~!
      不过很感谢朋友们的帮助!!!
        谢谢你们~!~!~!