delphi – 如何在TObjectList中做?
发布时间:2020-12-15 04:29:33 所属栏目:大数据 来源:网络整理
导读:我试图用于迭代TObjectList: program Project1;{$APPTYPE CONSOLE}{$R *.res}uses System.SysUtils,Contnrs;var list: TObjectlist; o: TObject;begin list := TObjectList.Create; for o in list do begin //nothing end;end. 它无法编译: [dcc32 Error]
|
我试图用于迭代TObjectList:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,Contnrs;
var
list: TObjectlist;
o: TObject;
begin
list := TObjectList.Create;
for o in list do
begin
//nothing
end;
end.
它无法编译:
似乎Delphi的for in构造中没有处理无类型的,未说明的,TObjectList和可枚举的目标. 如何枚举TObjectList中的对象? 我现在应该做什么 我目前的代码是: procedure TfrmCustomerLocator.OnBatchDataAvailable(BatchList: TObjectList);
var
i: Integer;
o: TObject;
begin
for i := 0 to BatchList.Count-1 do
begin
o := BatchList.Items[i];
//...snip...where we do something with (o as TCustomer)
end;
end;
没有充分的理由,我希望将其改为: procedure TfrmCustomerLocator.OnBatchDataAvailable(BatchList: TObjectList);
var
o: TObject;
begin
for o in BatchList do
begin
//...snip...where we do something with (o as TCustomer)
end;
end;
为什么要使用枚举器?只是因为. 解决方法
为了回答具体问题,这是引入枚举器的一个例子. type
TObjectListEnumerator = record
private
FIndex: Integer;
FList: TObjectList;
public
constructor Create(AList: TObjectList);
function GetCurrent: TObject;
function MoveNext: Boolean;
property Current: TObject read GetCurrent;
end;
constructor TObjectListEnumerator.Create(AList: TObjectList);
begin
FIndex := -1;
FList := AList;
end;
function TObjectListEnumerator.GetCurrent;
begin
Result := FList[FIndex];
end;
function TObjectListEnumerator.MoveNext: Boolean;
begin
Result := FIndex < FList.Count - 1;
if Result then
Inc(FIndex);
end;
//-- Your new subclassed TObjectList
Type
TMyObjectList = class(TObjectList)
public
function GetEnumerator: TObjectListEnumerator;
end;
function TMyObjectList.GetEnumerator: TObjectListEnumerator;
begin
Result := TObjectListEnumerator.Create(Self);
end;
枚举器的这种实现使用记录而不是类.这样做的优点是在执行枚举时不会在堆上分配额外的对象. procedure TfrmCustomerLocator.OnBatchDataAvailable(BatchList: TObjectList);
var
o: TObject;
begin
for o in TMyObjectList(BatchList) do // A simple cast is enough in this example
begin
//...snip...where we do something with (o as TCustomer)
end;
end;
正如其他人所指出的,有一个泛型类是更好的选择,TObjectList< T>. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
