我在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组件,谢谢!
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组件,谢谢!
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
if Components[i].GetParentComponent.Name ='Panel1' then //在这里 写入你的panel的名字是控件的name
把提示的showmessage去掉
只要有一个能区分的标志就行了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;
你的代码好像不用到button.name,只根据button.caption来删除button
但是运行时,ComponentCount好像是0,执行没有效果 yq3woaini(哈哈镜(中级代码工)
谢谢你给的代码,一定会给分,如果问题解决会加分
但是如果你的代码中用到了button.name来删除button的话,好像在我的应用中没办法
首先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;
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.
if Panel1.Controls[i] is TSpeedButton then
Panel1.Controls[i].Free;
可以释放我所要删除的button,但是退出来的时候报错。
这个有什么用?
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;
我这段代码可以实现,会有什么问题吗?
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;
我的代码就是这样,运行时报错,说是什么访问地址之类的错误,看不懂!
请问问题究竟在哪里?
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
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;这样没问题的,我测试了,不知道呢的问题出在哪里