运行时创建的动态控件数组怎么free掉?

138075 2003-08-23 09:50:28
我在运行时动态创建了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;



...全文
51 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjw1018 2003-08-24
  • 打赏
  • 举报
回复
学习
kuan 2003-08-24
  • 打赏
  • 举报
回复
应该是soldierlu(soldierlu) 所说的
soldierlu 2003-08-23
  • 打赏
  • 举报
回复
是不是这样:
for i:=1 to 255 do
if btns[i]<>nil then
btns[i].free;
soldierlu 2003-08-23
  • 打赏
  • 举报
回复
是不是这样:
for i:=1 to 255 do
wjowner 2003-08-23
  • 打赏
  • 举报
回复
不应该啊,单步调试看看,察看btns[idx]在free前后的数值
cxz7531 2003-08-23
  • 打赏
  • 举报
回复
up
138075 2003-08-23
  • 打赏
  • 举报
回复
谢谢回答,但是不幸的是

freeAndnil(btn[idx]); //出错,是否在Uses里加点什么?????

btn[idx]:=nil //也出错,早试过了。
checkyvc6 2003-08-23
  • 打赏
  • 举报
回复
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;

wjowner 2003-08-23
  • 打赏
  • 举报
回复
释放控件的时候使用函数FreeAndNil(btn[idx]),这样就可以在最后使用Not Assigned(btn[i])来判断该对象是否被释放。这个问题是由于Delphi在调用Free方法释放对象的时候没有释放对象的指针(置为Nil),在调用Assigned函数时,被释放的对象指针返回非Nil值,导致Assigned函数返回True值引起的。
zhoutian618 2003-08-23
  • 打赏
  • 举报
回复
这种情况建议你用TSTRINGLIST还好些。或者TLIST也行啊。
好控制一些。
138075 2003-08-23
  • 打赏
  • 举报
回复
不行啊,中间必须要删除,程序需要啊。
wdong18 2003-08-23
  • 打赏
  • 举报
回复
如果开始不free,只有在最后才:
for i:=1 to idx do
btns[i].free;
行不?

5,387

社区成员

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

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