假设我有一个名为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"需要用数组代替一些怎么样?一切都是在运行时创建的.
最简单的是使用列表.使用通用列表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,因此每次迭代都会创建一个新实例.
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |