假设我有一个名为 TMachine 的类(class)
我目前像这样创建 1 个类
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"
需要如何替换为数组?一切都是在运行时创建的。
最佳答案
最简单的是使用列表。使用 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
中的代码。上面循环。当然,这可能都是一个完全的红鲱鱼。也许您永远不需要在问题的例程之外引用您的机器对象。在这种情况下,您根本不需要列表,并且问题中的代码已经完全足够了。
我注意到你说:
Currently that will place one machine on the form.
事实并非如此。 while 循环将为您的
while
的每次迭代创建一个机器对象。环形。您重用局部变量 machine
的事实不会改变这一点。每次循环调用 TMachine.Create
因此每次迭代都创建一个新实例。
关于delphi - 在运行时创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518930/