假设我有一个名为TMachine的课程 我目前创建了一个类似的
Machine := MachineShape.TMachine.create(self);
但是我需要超过1个,从来没有真正确定我需要多少,因为它依赖于当时数据库中的机器数量,应该永远不会超过20个。所以我知道我需要在var中使用某种类型的数组部分。目前我有
procedure TFLayout1.GetClick(Sender: TObject);
var
machine : TMachine;
begin
.....
//gets number of machines in total
while not fdeptlayout.ADOQuery1.Eof do
begin
fdb.count := fdb.count+1;
fdeptlayout.ADOQuery1.Next;
end;
//restarts back at first query
fdeptlayout.ADOQuery1.First;
//creates the shape
while not fdeptlayout.ADOQuery1.Eof do
begin
machine := MachineShape.TMachine.Create(self);
machine.PlaceShape(44,44,'CM402','first','123/33/123');
fdeptlayout.ADOQuery1.Next;
end;
end;
目前,这将在"Machine"
表单上放置1台计算机。我需要它放置“Machine1”“Machine2”...查询中有多少人。因此"machine"
需要用数组替换一些怎么样?一切都是在运行时创建的。
答案 0 :(得分:5)
最简单的是使用列表。使用Generics.Collections
中的通用列表。
FList: TList<TMachine>;
根据您的需要,您可以将列表声明为您的某个类中的字段。您要控制和管理所有计算机的类。
像这样创建:
FList := TList<TMachine>.Create;
将新成员添加到列表中,如下所示:
FList.Add(Machine);
像这样迭代列表:
for Machine in FList do
Machine.DoSomething;
如果您希望列表控制计算机的生命周期,请改用TObjectList<T>
。
FList: TList<TMachine>;
....
FList := TObjectList<TMachine>.Create;
然后当您从列表中删除项目时,清除列表,销毁列表等,机器也将被销毁。
Delphi文档包含example illustrating the use of TObjectList<T>
。
因此,为了清楚起见,您的while
循环将如下所示:
while not fdeptlayout.ADOQuery1.Eof do
begin
machine := MachineShape.TMachine.Create(self);
FList.Add(machine);
machine.PlaceShape(44,44,'CM402','first','123/33/123');
fdeptlayout.ADOQuery1.Next;
end;
然后在您需要迭代所有计算机的代码中的其他位置时,使用上面for
循环中的代码。
当然,这可能都是一个完整的红鲱鱼。也许您不需要在问题例程之外引用您的机器对象。在这种情况下,您根本不需要列表,问题中的代码已经足够了。
我注意到你声明:
目前,这将在表单上放置一台计算机。
事实并非如此。 while循环将为while
循环的每次迭代创建一个机器对象。您重新使用局部变量machine
这一事实并未改变这一点。每次循环都会调用TMachine.Create
,因此每次迭代都会创建一个新实例。
答案 1 :(得分:2)
您可以将机器放在TObjectList
中在班级定义中添加
FMachines: TObjectList<TMachine>;
然后在你的FormCreate中:
FMachines:= TObjectList<TMachine>.Create;
并在FormDestroy中:
FMachines.Free;
在您的GetClick方法中,将创建的计算机添加到列表中,如下所示:
machine := MachineShape.TMachine.Create(self);
FMachines.Add(machine);
然后,您可以通过访问FMachines列表来引用创建的计算机。