一个非常非常非常简单的问题,释放控件,可是我不知道哪里错了!(20分)

  • 主题发起人 主题发起人 蔓草
  • 开始时间 开始时间

蔓草

Unregistered / Unconfirmed
GUEST, unregistred user!
var
i:integer;
begin
for i:=0 to frmmain.ComponentCount-1 do
begin
showmessage (inttostr(i)+' '+ frmmain.Components.Name);
frmmain.Components.Free;
end;
end;释放到最后一个控件的时候就有错误,为什么啊 ?
 
最后一个控件是什么控件?
 
是什么都有错啊!你随便在窗体上放3个button实验一下就知道了!
 
不应该这么干吧
Free了一个以后,ComponentCount也应该减一才对。如果是我,就倒着来:
for i:=frmMain.ComponentCount-1 downto 0 do
frmMain.Components.Free;
 
老大,这种序列的删除应该从后往前删,即: for i:=frmmain.ComponentCount-1 downto 0 do
因为每删除一个,队列的长度就会减小,最大元素的序号也会相应减小。还有一点,就是Delphi的
for循环只是在开始执行的时候一次性计算终点,循环过程中不会再次计算终点,只作比较,因此
上面的frmmain.ComponentCount-1在循环过程中不会变化。

eg:
ComponentCount=3 Components[]: [0],[1],[2]
执行 Components[0].Free 之后:
ComponentCount=2 Components[]: [0],[1]
...
 
for i:=self.ComponentCount-1 downto 0 do
begin
showmessage (inttostr(i)+' '+ self.Components.Name);
self.Components.Free;
end;
 
啊,已经有人说了,早知道先刷新一下了
 
多人接受答案了。
 
后退
顶部