我的对象列表中有多少个对象类型

时间:2014-02-25 15:24:13

标签: delphi

使用DELPHI对象List我存储对Tforms类项的引用。在向该列表创建和插入表单之后,还执行一些删除....和其他处理步骤。 在我谈到这一点之后,我需要评估对象列表的内容。

  aForm1 : TMyForm_1 ;
  aForm2 : TMyForm_1 ;
  aForm3 : TMyForm_1 ;

  MyObjectList := TObjectList.create; 

  ....  
  MyObjectList.add(aForm1) ;  //  and also the other forms , many time each ...

TMyform_1类型中有多少个表单实例仍在我的列表中? 循环所有列表元素并检查类类型是我解决该任务的想法

for i := 0 ....    
if (MyObjectList.items[i] is  TMyForm_1) ...

更优雅的方法来解决这个问题? 拳头我只需知道列表中的TMyForm_1类型,第二个给我第一个位置,最后从这个位置...转到此列表中的下一个元素。

3 个答案:

答案 0 :(得分:1)

TObjectList不提供任何基于容器成员的运行时类型返回信息的方法。您必须使用is运算符编写自己的功能。

答案 1 :(得分:0)

我能想到的最优雅的是:

uses
  Generics.Collections;

var
  dict: TDictionary<TClass,Integer>;
  obj: TObject;
  i: Integer;
begin
  // ...

  for obj in MyObjectList do
    if dict.TryGetValue(obj.ClassType, i) then
      dict[obj.ClassType] := i + 1
    else
      dict.Add(obj.ClassType, 1);

  // ...
end;

答案 2 :(得分:0)

您可以为TObjectList编写一个类助手,并添加一个返回给定类型的项数组的函数。

type
  TObjectListHelper = class helper for TObjectList
    function GetItemsByType<T : class> : TArray<T>;
  end;

  { TObjectListHelper }

function TObjectListHelper.GetItemsByType<T> : TArray<T>;
var
  LIdx : Integer;
  LItem : TObject;
  LCount : Integer;
begin
  SetLength( Result, Self.Count );
  LCount := 0;
  for LIdx := 0 to Self.Count - 1 do
  begin
    LItem := Self.Items[LIdx];

    if LItem is T then
    begin
      Result[LCount] := LItem as T;
      Inc( LCount );
    end;
  end;
  SetLength( Result, LCount );
end;

在您的应用程序中,您可以像这样使用它

var
  LItem : TMyForm_1;
begin
  for LItem in MyObjectList.GetItemsByType<TMyForm_1> do
  begin
    // do something with LItem
  end;
end;