在运行时创建对象命名

时间:2013-01-25 09:31:50

标签: delphi delphi-xe2

假设我有一个名为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"需要用数组替换一些怎么样?一切都是在运行时创建的。

2 个答案:

答案 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列表来引用创建的计算机。