delphi - 在运行时创建对象

标签 delphi delphi-xe2

假设我有一个名为 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/

相关文章:

delphi - DrawText 重载解析错误

delphi - 在 Delphi XE2 中开发 Mac 或 iOS 应用程序需要哪些硬件/软件?

delphi - 为什么异常后执行会跳转到proc的末尾?

delphi - 为什么嵌套类型的范围不包括派生类?

delphi - 更新了 Delphi XE2 的 PostgreSQL 客户端连接?

xml - 保存XML文档会将单引号更改为双引号

delphi - 在delphi中建立tcp ip连接时无法读取消息

delphi - 如何确保分配手动线程安全?

string - Delphi从字符串中提取数字

api - 为什么某些函数在导入表中出现多次?