我在form的panel上动态创建一些button组件(创建时没有名字),如何再动态删除任意一个button组件?procedure TForm1.btnFreeCtrlClick(Sender: TObject);
var
  Comp:TComponent;
begin
  Comp:=FindComponent(button.name);
  if Comp<>nil then
    Comp.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
var
  btn:TButton;
begin
  btn:=TButton(panel.FindChildControl(btnname));
  if btn<>nil then
    btn.Free;
end;这些都不行,因为必须要知道button.name,我动态创建的这些button都没有button.name
请问我要怎么才能实现删除任意button组件,谢谢!

解决方案 »

  1.   

    var
      btn:TButton;
      i:integer;
      flag:boolean;
    begin  flag:=true;
      while (flag) do
      begin
          flag:=False;
          for i:=0 to ComponentCount -1 do
          begin
           if  Components[i].ClassName='TButton' then
           begin         ShowMessage (Components[i].Name );
             if Components[i].HasParent then
             begin
               if Components[i].GetParentComponent.Name ='Panel1' then
               begin
                  flag:=true;
                  Components[i].Free;
                  break;
               end;         end;
           end;
          end;
      end;//while
      

  2.   

    说明:
     if Components[i].GetParentComponent.Name ='Panel1' then  //在这里 写入你的panel的名字是控件的name
    把提示的showmessage去掉
      

  3.   

    没有给名字,给你Caption了么,只要Cation不同,就根据Caption来删除
    只要有一个能区分的标志就行了procedure TForm1.Button1Click(Sender: TObject);
    var
      I : integer;
    begin
      for I:=ComponentCount-1 downto 0 do
      begin
        if (Components[i] is Tbutton)and
         ((Components[i] as Tbutton).Caption='sdf')
         and ((Components[i] as Tbutton).GetParentComponent.Name='Panel1') then
        begin
          Components[i].Free;
          break;
        end;  end;
    end;
      

  4.   

    cdsgajxlp(起名很难) 
    你的代码好像不用到button.name,只根据button.caption来删除button
    但是运行时,ComponentCount好像是0,执行没有效果 yq3woaini(哈哈镜(中级代码工)
    谢谢你给的代码,一定会给分,如果问题解决会加分
    但是如果你的代码中用到了button.name来删除button的话,好像在我的应用中没办法
      

  5.   

    yq3woaini(哈哈镜(中级代码工)的ComponentCount的值也是0ComponentCount的值是在panel1创建的时候产生的还是在我现在用的时候产生的?因为panel1上的button都是后来动态创建的,在panel1创建的时候,button还没有产生,如果ComponentCount的值以后不自动改变的话,ComponentCount的值肯定是0。请高手解释
      

  6.   

    你删除这个按钮时是指定删除还是其它删除办法,可不可以这样..
    首先Delphi里面的按钮TButton不支持双击事件,我们可以自己写一个出来,再使用一个通用的方法来删除动态创建的按钮,在双击事件里面写,因为一般按钮双击事件都没用什么,所以就拿来用啰.通用方法:
    proceudre DelButton(Sender: TObject);
    begin
     if Sender is TButton then
       if  MessageBox(Handle,'是否删除此按钮?','提示',MB_YESNO) = IDYES then
         begin
          TButton(Sender).Free;
         end;
    end;
    ///////
    var
     a: TmyButton;   //TmyButton 自定义有双击事件的按钮
    begin
     a := TmyButton.Create;
     a.OnDbClick := DelButton;
    end;
      

  7.   

    那么你动态创建的时候,为什么不给它添加一个、记录的名字,或者caption 呢,或者记录指针也行呀。动态创建的代码,你可以控制的呀。
      

  8.   

    这是我的代码。我测试过 可以的呀, 你好好看一下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        //procedure ForEach(data:Array of Integer;DoIt:ProcDoItem);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      btn:TButton;
      i:integer;
      flag:boolean;
    begin  flag:=true;
      while (flag) do
      begin
          flag:=False;
          for i:=0 to ComponentCount -1 do
          begin
           if  Components[i].ClassName='TButton' then
           begin         ShowMessage (Components[i].Name );
             if Components[i].HasParent then
             begin
               if Components[i].GetParentComponent.Name ='Panel1' then
               begin
                  flag:=true;
                  Components[i].Free;
                  break;
               end;         end;
           end;
          end;
      end;//whileend;procedure TForm1.Button2Click(Sender: TObject);
    var
     btn:TButton;
    begin
      btn:=TButton.Create(Self );
      btn.Parent :=Panel1;  btn.Visible:=true;
      btn.Show ;
       end;end.
      

  9.   

    给它的Tag分别赋标志值,再按(Components[i] as Tbutton).Tag来FREE
      

  10.   

    button2是动态创建, button1是销毁
      

  11.   

    for i := Panel1.ControlCount - 1 downto 0 do    // 必须使用downto
      if Panel1.Controls[i] is TSpeedButton then
        Panel1.Controls[i].Free;
      

  12.   

    我想用一个全局变量tmp_btn寄存点击的button对象,然后再button.onclick中,tmp_btn.free
    可以释放我所要删除的button,但是退出来的时候报错。
      

  13.   

    看《DELPHI高级开发指南》,就是写《Mastering DELPHI X》家伙写的,里面有详细讲解
      

  14.   

    (Components[i] as Tbutton).GetParentComponent.Name='Panel1'
    这个有什么用?
    for I:=form1.RzPanel70.ControlCount-1 downto 0 do
    begin
     if (form1.RzPanel70.Controls[i] is Trzbutton) and   ((form1.RzPanel70.Controls[i] as     Trzbutton).Caption=RzLabel1.Caption) then
        begin
          form1.RzPanel70.Controls[i].Free;
          break;
        end;
    end;
    我这段代码可以实现,会有什么问题吗?
      

  15.   

    如果你的button的caption:='test' 可以这样写 TButton(FindComponent('test')).Free;
      

  16.   

    procedure Tmodiy_form.RzButton1Click(Sender: TObject);
    var
      I : integer;
    begin
       if  RzRadioButton5.Checked=true then
       begin
        for I:=form1.RzPanel70.ControlCount-1 downto 0 do
         begin
            if (form1.RzPanel70.Controls[i] is Trzbutton) and   ((form1.RzPanel70.Controls[i] as Trzbutton).Caption=RzLabel1.Caption) and ((form1.RzPanel70.Controls[i] as Trzbutton).GetParentComponent.Name='RzPanel70' ) then
             begin
                  form1.RzPanel70.Controls[i].Free;
                  break;
             end;
        end;
       end ;
       modiy_form.Close;
    end;
    我的代码就是这样,运行时报错,说是什么访问地址之类的错误,看不懂!
    请问问题究竟在哪里?
      

  17.   

    可以考虑下在hint属性里面
      

  18.   


    proceduce form.BtnClick(sender);
    begin
      modiy_form:=Tform.create(self);
        。
        。
        。
      modiy_form.showmodel;
    end;用modiy_form.showmodel的时候出问题,改为下面的就ok了
    proceduce form.BtnClick(sender);
    begin
      modiy_form:=Tform.create(self);
      modiy_form.show;
        。
        。
        。
    end
      

  19.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : integer;
      t, l : integer;
    begin
      t := 0; l := 0;
      for i := 1 to 10 do
      begin
        with TButton.Create(self) do
        begin
          Caption := IntToStr(i);
          Parent := Panel1;
          Top := t;
          Left := l;
          l := l + 100;
          if i = 5 then
          begin
            t := t + 40;
            l := 0;
          end;
        end;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i : integer;
    begin
      for i := Panel1.ControlCount - 1 downto 0 do
      begin
        if (Panel1.Controls[i] is TButton) and ((Panel1.Controls[i] as TButton).Caption = Edit1.Text) then
          Panel1.Controls[i].Free;
      end;
      Close;
    end;这样没问题的,我测试了,不知道呢的问题出在哪里
      

  20.   

    两个可能,按钮create的时候写的不对,或者在某按钮响应事件时将其free