1

假设我有一个名为 TMachine 的类,我目前像这样创建 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;

目前这将在表格上放置 1 台机器"Machine"。我需要它来放置“Machine1”“Machine2”......查询中有多少。因此"machine"需要如何替换为数组?一切都是在运行时创建的。

4

2 回答 2

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 文档包含一个说明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,因此每次迭代都会创建一个新实例。

于 2013-01-25T09:40:36.523 回答
2

您可以将机器放在 TObjectList

在你的类定义中添加

FMachines: TObjectList<TMachine>;

然后在您的 FormCreate 中:

FMachines:= TObjectList<TMachine>.Create;

在 FormDestroy 中:

FMachines.Free;

在您的 GetClick 方法中,将创建的机器添加到列表中,如下所示:

machine := MachineShape.TMachine.Create(self);
FMachines.Add(machine);

You can then refer to the created machines by accessing the FMachines list.

于 2013-01-25T09:41:27.463 回答