Delphi 如何销毁自定义组件阵列

Delphi 如何销毁自定义组件阵列,delphi,delphi-xe2,Delphi,Delphi Xe2,我有一个自定义组件“TCARD”的销毁过程。然后在运行时创建一个数组 Cards: array[1..20] of TCards 然后我做一些事情。。。 在程序结束时,我想销毁阵列中的所有TCARD。我该怎么做,还是必须每次都这样做 cards[1].destroy; cards[2].destroy; .... cards[20].destroy; 如果您使用TObjectList,这将为您完成,您只需销毁列表即可 Uses Generics.Collections, ... //

我有一个自定义组件“
TCARD
”的销毁过程。然后在运行时创建一个数组

Cards: array[1..20] of TCards
然后我做一些事情。。。 在程序结束时,我想销毁阵列中的所有TCARD。我该怎么做,还是必须每次都这样做

cards[1].destroy;
cards[2].destroy;
....
cards[20].destroy;

如果您使用
TObjectList
,这将为您完成,您只需销毁列表即可

Uses
  Generics.Collections,
...

// define your list
Cards: TObjectList<TCard>;

...

// create list
Cards := TObjectList<TCard>.Create;
try
 // Create and add your card objects
 ACard := TCard.Create;
 Cards.Add(ACard);
 // do something with Cards
 ...
 // destroy cards - this will automatically free the objects owned by the list
finally
 Cards.Free;
end;

如果您使用
TObjectList
,这将为您完成,您只需销毁列表即可

Uses
  Generics.Collections,
...

// define your list
Cards: TObjectList<TCard>;

...

// create list
Cards := TObjectList<TCard>.Create;
try
 // Create and add your card objects
 ACard := TCard.Create;
 Cards.Add(ACard);
 // do something with Cards
 ...
 // destroy cards - this will automatically free the objects owned by the list
finally
 Cards.Free;
end;

停止对对象使用数组,并使用TObjectList。对象销毁由列表管理。尚未使用的TobjectList将查看它。。但是如果我使用它,我可以做一个TObjectlist.destroy?TObjectlist就是你需要的。但是你从来没有听说过for循环吗?说真的,如果你看不到那个解决方案,你就需要回到基本点上。@DavidHeffernan,我有过,但希望有一个Array.destroy之类的东西。而且我还是在基础上。。我发现当你自己教每一件事的时候,你并没有学到基础知识——按顺序前进。。我发现开始一个项目并付诸实践会教我更好。要做到这一点,你通常会使用一些基本的,甚至是一些高级的。。但也许我错了:在你可以使用的地方使用一些更高级别的容器,这样你就可以保护自己不受本质的影响。停止对对象使用数组,使用TObjectList。对象销毁由列表管理。尚未使用的TobjectList将查看它。。但是如果我使用它,我可以做一个TObjectlist.destroy?TObjectlist就是你需要的。但是你从来没有听说过for循环吗?说真的,如果你看不到那个解决方案,你就需要回到基本点上。@DavidHeffernan,我有过,但希望有一个Array.destroy之类的东西。而且我还是在基础上。。我发现当你自己教每一件事的时候,你并没有学到基础知识——按顺序前进。。我发现开始一个项目并付诸实践会教我更好。要做到这一点,你通常会使用一些基本的,甚至是一些高级的。。但也许我错了:使用一些更高层次的容器,这样你就可以保护自己不受本质的影响。目前我有例如
cards[i].Cname:=adoquery1.FieldByName('Name').AsString我假设我仍然可以这样做抱歉,我还没有搜索,只是仍然更改代码是的,你可以像普通数组一样循环它们:)推它,我知道,但一旦对象在列表中。我编辑列表中的对象。然后我必须使原始对象=列表中的项目正确吗?或者列表中的对象是否直接影响原始对象?如果这是我理解的另一个问题,对象独立存在,它不知道它在列表或数组中。objectlist只是一个容器。例如:
MyObject:=MyList[i];MyObject.field:=1
与MyList[i]相同。字段:=1
。这是同一个物体,明白吗?他们用卡片做些事情。目前我有例如
cards[i].Cname:=adoquery1.FieldByName('Name').AsString我假设我仍然可以这样做抱歉,我还没有搜索,只是仍然更改代码是的,你可以像普通数组一样循环它们:)推它,我知道,但一旦对象在列表中。我编辑列表中的对象。然后我必须使原始对象=列表中的项目正确吗?或者列表中的对象是否直接影响原始对象?如果这是我理解的另一个问题,对象独立存在,它不知道它在列表或数组中。objectlist只是一个容器。例如:
MyObject:=MyList[i];MyObject.field:=1
与MyList[i]相同。字段:=1
。这是同一个物体,明白吗?
procedure FreeCards(Cards : TCards);

var
  Card : TCard;

begin
 For Card in Cards do
  Card.Free;
end;