在运行时创建对象并使用它们
Create objects in runtime and work with them
我的程序在 运行
时创建的对象有问题
首先我创建了 n 个对象(假设 n := 3)
for i:=0 to n-1 do
begin
With TGauge.Create(Form1) do
begin
Parent := Form1; // this is important
Left := 20; // X coordinate
Top := 20+i*45; // Y coordinate
Width := 250;
Height := 20;
Kind := gkHorizontalBar;
Name := 'MyGauge'+IntToStr(i);
//....
Visible := True;
end;
end;
这 3 个对象已创建并在表单中可见。现在我想改变它的 属性,但每当我尝试访问这些创建的对象时,我只会得到
EAccessViolation
例如,当我尝试获取一个对象的名称时
g := Form1.FindComponent('MyGauge0') as TGauge;
Form1.Label1.Caption:=g.Name;
您的代码失败,因为 FindComponent
returns nil
。那是因为 Form1
对象不拥有具有该名称的组件。从这里很难说出为什么会这样。
但是,使用名称查找是解决您的问题的错误方法。不要使用名称来指代组件。将它们的引用保存在一个数组中。
var
Gauges: array of TGauge;
....
SetLength(Gauges, N);
for I := 0 to N-1 do
begin
Gauges[i] := TGauge.Create(Form1);
....
end;
然后您可以使用该数组引用控件。
我还要评论说,您指的是 Form1
全局对象很奇怪。在 TForm1
class 中执行此操作可能会更好,因此能够使用隐式 Self
实例。
我的程序在 运行
时创建的对象有问题首先我创建了 n 个对象(假设 n := 3)
for i:=0 to n-1 do
begin
With TGauge.Create(Form1) do
begin
Parent := Form1; // this is important
Left := 20; // X coordinate
Top := 20+i*45; // Y coordinate
Width := 250;
Height := 20;
Kind := gkHorizontalBar;
Name := 'MyGauge'+IntToStr(i);
//....
Visible := True;
end;
end;
这 3 个对象已创建并在表单中可见。现在我想改变它的 属性,但每当我尝试访问这些创建的对象时,我只会得到
EAccessViolation
例如,当我尝试获取一个对象的名称时
g := Form1.FindComponent('MyGauge0') as TGauge;
Form1.Label1.Caption:=g.Name;
您的代码失败,因为 FindComponent
returns nil
。那是因为 Form1
对象不拥有具有该名称的组件。从这里很难说出为什么会这样。
但是,使用名称查找是解决您的问题的错误方法。不要使用名称来指代组件。将它们的引用保存在一个数组中。
var
Gauges: array of TGauge;
....
SetLength(Gauges, N);
for I := 0 to N-1 do
begin
Gauges[i] := TGauge.Create(Form1);
....
end;
然后您可以使用该数组引用控件。
我还要评论说,您指的是 Form1
全局对象很奇怪。在 TForm1
class 中执行此操作可能会更好,因此能够使用隐式 Self
实例。