请教释放动态创建的控件

dongmei757 2016-06-23 11:40:29
在Panel上动态创建了几个Button,代码如下,


var
Form1: TForm1;
But : array of TButton;
NewNum : integer;
OldNum : integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
NewNum := strtoint(Edit1.Text);
SetLength(But,NewNum);
for i := 0 to NewNum -1 do
begin
But[i] := TButton.Create(Panel1);
But[i].Parent := Panel1;
But[i].Width := 75;
But[i].Height := 33;
But[i].Tag := 200+i;
But[i].Name := 'But'+inttostr(i);
But[i].Caption := '';
But[i].Top := 40 ;
But[i].Left := 8+ i*120;
end;
OldNum := NewNum;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
try
for i:= OldNum-1 downto 0 do
begin
FreeAndNil(But[i]);
end;
except
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
TempCom:TComponent;
begin
try
for i:= Panel1.ComponentCount-1 downto 0 do
begin
TempCom := Panel1.Components[i];
FreeAndNil(TempCom)
end;
except
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if Assigned(But[0]) then
begin
showmessage('Find');
end;
end;


使用Button2Click事件按钮彻底释放了,使用Button3Click按钮是不见了,但使用Button4Click时,依然提示‘find’,它确实释放了么?请教如何修改Button3Click内容能彻底释放按钮。
...全文
161 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
不得闲 2016-06-28
  • 打赏
  • 举报
回复
。。因为你没有把数组中的无效变量值指空,也就是常说的野指针了
xxfly 2016-06-24
  • 打赏
  • 举报
回复
确实没有释放,变通下,还是释放buf. if TButton(TempCom).Name=But[i].Name then FreeAndNil(But[i]);
lyhoo163 2016-06-23
  • 打赏
  • 举报
回复
But是指向Button的变量。 SetLength(But,NewNum); 创建了,它们始终存在的。 你释放Button时,但But未释放。 建议在Button3中,加入SetLength(But,0); 释放But。
doloopcn 2016-06-23
  • 打赏
  • 举报
回复
是不是理解错了?? 个人觉得是 BUT[0].Free 才是释放按钮对象 FREEANDNIL应该是对于变量

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧