我在运行时动态创建了20个控件数组,然后free掉几个,那么在窗口关闭的时候,如果我要free掉剩下的这些的控件数组,那该怎么写?type 
  frmMain:TfrmMain;
  idx:integer;
  btns:array[1..255] of Tbutton;  ...procedure TfrmMain.btnNewclick(sender:TObject);
begin
  inc(idx);
  btns[idx]:=Tbutton.create(self);
  btns[idx].parent:=frmMain;
  ...
  btns[idx].show;
end;   ...procedure TfrmMain.btnDel(sender:TObject);
begin
  btn[idx].free;//这里的idx并不一定是最后建立的那个。
end;  ...procedure TfrmMain.Close....//窗体关闭时
var i:intger;
begin
   for i:=1 to idx do 
   if ....       //这里这么写??? not Assigned(btns[i])????这个出错.
      btns[i].free; 
end;

解决方案 »

  1.   

    如果开始不free,只有在最后才:
    for i:=1 to idx do 
          btns[i].free;
    行不?
      

  2.   

    这种情况建议你用TSTRINGLIST还好些。或者TLIST也行啊。
    好控制一些。
      

  3.   

    释放控件的时候使用函数FreeAndNil(btn[idx]),这样就可以在最后使用Not Assigned(btn[i])来判断该对象是否被释放。这个问题是由于Delphi在调用Free方法释放对象的时候没有释放对象的指针(置为Nil),在调用Assigned函数时,被释放的对象指针返回非Nil值,导致Assigned函数返回True值引起的。
      

  4.   

    procedure TfrmMain.btnDel(sender:TObject);
    begin
      if btn[idx]<>nil then
      begin
        btn[idx].free;//这里的idx并不一定是最后建立的那个。
        btn[idx]:=nil;
      end;
    end;释放:
       for i:=1 to idx do 
         if btn[idx]<>nil then
         begin
            btn[idx].free;//这里的idx并不一定是最后建立的那个。
            btn[idx]:=nil;
         end;
      

  5.   

    谢谢回答,但是不幸的是   freeAndnil(btn[idx]); //出错,是否在Uses里加点什么?????   btn[idx]:=nil  //也出错,早试过了。 
      

  6.   

    不应该啊,单步调试看看,察看btns[idx]在free前后的数值
      

  7.   

    是不是这样:
    for i:=1 to 255 do
      

  8.   

    是不是这样:
    for i:=1 to 255 do
      if btns[i]<>nil then
        btns[i].free;
      

  9.   

    应该是soldierlu(soldierlu) 所说的