使用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类型,第二个给我第一个位置,最后从这个位置...转到此列表中的下一个元素。
答案 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;