关于控件的产生于释放(50分)

  • 主题发起人 MicroZeng
  • 开始时间
M

MicroZeng

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在Form1上动态地生成TLabel控件, 然后释放掉,如下程序为什么不行?
会出错? 请大虾帮我查找原因. 或者有什么更好的方法? 谢谢!

procedure TForm1.BitBtn1Click(Sender: TObject);
var Label1 : TLabel;
begin
Label1 := TLabel.Create(Self);
with Label1 do
begin
Parent := Form1;

Caption := IntToStr(Random(700));
Left := Random(800);
Top := Random(600);
end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var i, j : integer;
begin
j := ComponentCount;
for i := 0 to j -1 do
begin
if Components.ClassType = TLabel then //<font color="RED">这里会出错!!</font>
begin
Components.Free;
end;
end;
end;

 

在Private部分定义 var Label1 : TLabel;
 
原因:
当你Free 了一个组件后 , Components的Index会重排, 并且
ComponentCount会减去一, 但你原来的J变量不会改变,
所以发生下标溢出.
办法:
j := ComponentCount;
for i := j-1 downto 0 do
begin
if Components.ClassType = TLabel then //这里会出错!!
begin
Components.Free;
end;
end;
 
to SeaSky:
抢分真快啊。
 
接受答案了.
 

Similar threads

I
回复
0
查看
541
import
I
I
回复
0
查看
494
import
I
I
回复
0
查看
621
import
I
I
回复
0
查看
637
import
I
I
回复
0
查看
616
import
I
顶部