在窗体内,动态创建了一组button按钮
手动拖入一个button1
单击button1后,如何清除刚才动态创建的button?
我的代码如下:
 if self <> nil then
      begin
       for i := 0 to self.ComponentCount - 1 do
       begin
          if self.Components[i] is tbutton then  (self.Components[i] as Tbutton).CleanupInstance ;//这里应该怎么写?       end;
      end;
请各位大虾指教!

解决方案 »

  1.   

     (self.Components[i] as Tbutton).CleanupInstance.Free;
      

  2.   

    动态创建就将动态创建的句柄FREE下就行了.
      

  3.   

    self.Components[i] as Tbutton).CleanupInstance;
    加上.free会报错
    为什么?
      

  4.   

    (self.Components[i] as Tbutton).Free;//复制了一下,忘了删除了,呵呵
      

  5.   

    (self.Components[i] as Tbutton).Free;
    这只是释放,但那些创建的button还在窗体内
    怎样才能清空窗体内的所有button,使窗体内的button都消失?
    我找不到更好的解决方法
    请大虾指教!
      

  6.   

    if self <> nil then 
          begin 
          for i := 0 to self.ComponentCount - 1 do 
          begin 
              if self.Components[i] is tbutton then  (self.Components[i] asTbutton).Free;        end; 
          end; 
    执行后,会报错“list index out of bounds (54)”
    点“确定”,index为奇数的button被清除,但偶数的还在
    为什么会这样呢?
      

  7.   

    看看啊你下面有没有inc(i)之类的影响i值的语句
      

  8.   



    (self.Components[i] as Tbutton).Parent:=nil;

    (self.Components[i] as Tbutton).Free; 
      

  9.   

    if self <> nil then 
    begin 
      for i := self.ComponentCount - 1 downto 0 do 
      begin 
        if self.Components[i] is tbutton then  (self.Components[i] asTbutton).Free;  
      end; 
    end; 这样试试
      

  10.   


    还会报同样的错,程序里并没有inc(i);之类的语句
    而且每次报错,点了”确定“之后,都是index为奇数的button消失
    不明白为什么会这样再请各位大虾指教!!
      

  11.   

    写错了,把asTbitton连一起了
    if self <> nil then
    begin
      for i := self.ComponentCount - 1 downto 0 do
      begin
        if self.Components[i] is tbutton then  (self.Components[i] as Tbutton).Free;
      end;
    end;
      

  12.   

    Form组件在释放时也会影响Components里组件个数;最好用Controls,不要用Componts如下:var
      i: Integer;
    begin
      if Self <> nil then
        for i := ControlCount - 1 downto 0 do
          if Controls[i] is TButton then
            Controls[i].Free;
    end;其它的什么Parent什么Owner可以不管,Delphi的TControl,TComponent里早就处理好了,不信可以看看Delphi的代码
      

  13.   


    为什么是for i := self.ComponentCount - 1 downto 0 do
    而不是for i :=0  to self.ComponentCount - 1 do二者有什么区别吗?
      

  14.   

    parent:=nil;实际就会调用TControl.SetParent;直接nil就可以了,不用关心.你清除一个,parent的子控件序号就变了,所以你那个循环只清除了奇数的,偶数被跳过了