我想使用依赖于 TObjectList<> (System.Generics.Collections / Spring.Collections) 但只有 TObjectList (System.Contnrs) 的 TObjectDataset。除了遍历对象并构建新的 TObjectList<> 以使其正常工作之外,还有其他方法吗?最终,我想将 TObjectList 耦合到 Objectdataset 以绑定到 UI。
问问题
984 次
2 回答
1
你的问题有点错误。Spring4d TObjectDataSet 采用一个IObjectList
接口,它是IList<T>
where T
is 的特化TObject
。
该合同由Contnrs.TObjectList
. 所以“简单地”为你TObjectList
的实现创建一个包装类IObjectList
。我只是用引号引起来,因为这个接口有很多方法。您可以将TListBase<T>
其用作已实现所有方法的适配器的基类。然后你只需要覆盖一些(看看TList<T>
那些是哪些)。
要知道的一个重要细节是TObjectDataSet
需要知道列表中对象的确切类别。这是通过ElementType
. IObjectList
如果返回,TObject
尽管这不是很有帮助。所以你需要重写那个方法。
编辑:这是这样一个适配器类的完整代码:
unit Spring.Collections.ObjectListAdapter;
interface
uses
Contnrs,
TypInfo,
Spring.Collections,
Spring.Collections.Base;
type
TObjectListAdapter = class(TListBase<TObject>, IObjectList)
private
fList: TObjectList;
fClassType: TClass;
protected
function GetCapacity: Integer; override;
function GetCount: Integer; override;
function GetElementType: PTypeInfo; override;
function GetItem(index: Integer): TObject; override;
procedure SetCapacity(value: Integer); override;
procedure SetItem(index: Integer; const value: TObject); override;
public
constructor Create(const list: TObjectList; classType: TClass);
procedure Delete(index: Integer); override;
function Extract(const item: TObject): TObject; override;
procedure Insert(index: Integer; const item: TObject); override;
procedure Exchange(index1, index2: Integer); override;
procedure Move(currentIndex, newIndex: Integer); override;
end;
implementation
uses
Classes,
Types;
{ TObjectListAdapter }
constructor TObjectListAdapter.Create(const list: TObjectList; classType: TClass);
begin
inherited Create;
fList := list;
fClassType := classType;
end;
procedure TObjectListAdapter.Delete(index: Integer);
begin
fList.Delete(index);
end;
procedure TObjectListAdapter.Exchange(index1, index2: Integer);
begin
fList.Exchange(index1, index2);
end;
function TObjectListAdapter.Extract(const item: TObject): TObject;
begin
Result := fList.Extract(item);
end;
function TObjectListAdapter.GetCapacity: Integer;
begin
Result := fList.Capacity;
end;
function TObjectListAdapter.GetCount: Integer;
begin
Result := fList.Count;
end;
function TObjectListAdapter.GetElementType: PTypeInfo;
begin
Result := fClassType.ClassInfo;
end;
function TObjectListAdapter.GetItem(index: Integer): TObject;
begin
Result := fList[index];
end;
procedure TObjectListAdapter.Insert(index: Integer; const item: TObject);
begin
fList.Insert(index, item);
end;
procedure TObjectListAdapter.Move(currentIndex, newIndex: Integer);
begin
fList.Move(currentIndex, newIndex);
end;
procedure TObjectListAdapter.SetCapacity(value: Integer);
begin
fList.Capacity := value;
end;
procedure TObjectListAdapter.SetItem(index: Integer; const value: TObject);
begin
fList[index] := value;
end;
end.
于 2017-03-27T08:41:20.560 回答
0
除了遍历对象并构建一个新对象
TObjectList<T>
来使其正常工作之外,还有其他方法吗?
那没有。这两种类型不兼容。
于 2017-03-26T11:18:16.127 回答