1

TMachine というクラスがあるとします。現在、そのようなクラスを 1 つ作成しています。

 Machine := MachineShape.TMachine.create(self);

しかし、私は1つ以上必要です.その時点でデータベース内のマシンの数に依存するため、必要な数は決してわかりません.20を超えることはありません. 現在、私は持っています

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>;

必要に応じて、リストをクラスの 1 つのフィールドとして宣言します。すべてのマシンを制御および管理するクラス。

次のように作成します。

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上記のループでコードを使用します。


もちろん、これはすべて完全なニシンかもしれません。おそらく、質問のルーチンの外でマシン オブジェクトを参照する必要はないでしょう。その場合、リストはまったく必要なく、問題のコードはすでに完全に適切です。

私はあなたが次のように述べていることに注意します:

現在、フォーム上に 1 台のマシンが配置されます。

そうではありません。while ループは、ループの反復ごとに 1 つのマシン オブジェクトを作成します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);

その後、FMachines リストにアクセスして、作成されたマシンを参照できます。

于 2013-01-25T09:41:27.463 に答える