1

我想使用依赖于 TObjectList<> (System.Generics.Collections / Spring.Collections) 但只有 TObjectList (System.Contnrs) 的 TObjectDataset。除了遍历对象并构建新的 TObjectList<> 以使其正常工作之外,还有其他方法吗?最终,我想将 TObjectList 耦合到 Objectdataset 以绑定到 UI。

4

2 回答 2

1

你的问题有点错误。Spring4d TObjectDataSet 采用一个IObjectList接口,它是IList<T>where Tis 的特化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 回答