在运行时创建对象命名

Gle*_*rse 1 delphi delphi-xe2

假设我有一个名为TMachine的类我目前正在创建一个类

 Machine := MachineShape.TMachine.create(self);
Run Code Online (Sandbox Code Playgroud)

但我需要更多的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;
Run Code Online (Sandbox Code Playgroud)

目前,这将在表格上放置1台机器"Machine".我需要它放置"Machine1""Machine2"...查询中有多少人.因此"machine"需要用数组代替一些怎么样?一切都是在运行时创建的.

Dav*_*nan 5

最简单的是使用列表.使用通用列表Generics.Collections.

FList: TList<TMachine>;
Run Code Online (Sandbox Code Playgroud)

根据需要,您可以将列表声明为其中一个类的字段.要控制和管理所有计算机的类.

像这样创建它:

FList := TList<TMachine>.Create;
Run Code Online (Sandbox Code Playgroud)

像这样添加新成员到列表:

FList.Add(Machine);
Run Code Online (Sandbox Code Playgroud)

像这样迭代列表:

for Machine in FList do
  Machine.DoSomething;
Run Code Online (Sandbox Code Playgroud)

如果您希望列表控制机器的生命周期,请TObjectList<T>改用.

FList: TList<TMachine>;
....
FList := TObjectList<TMachine>.Create;
Run Code Online (Sandbox Code Playgroud)

然后,当您从列表中删除项目,清除列表,销毁列表等,机器也将被销毁.

Delphi文档包含一个说明使用的示例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;
Run Code Online (Sandbox Code Playgroud)

然后在代码中的某个其他位置,当您需要迭代所有计算机时,请使用for上面循环中的代码.


当然,这可能都是一个完整的红鲱鱼.也许您不需要在问题例程之外引用您的机器对象.在这种情况下,您根本不需要列表,问题中的代码已经完全足够了.

我注意到你陈述:

目前,这将在表单上放置一台机器.

事实并非如此.while循环将为循环的每次迭代创建一个机器对象while.您重新使用局部变量的machine事实不会改变它.每次循环都会调用TMachine.Create,因此每次迭代都会创建一个新实例.