Как сделать TObjectDictionary.Values ​​доступным как свойство? - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть такой объект:

  TMyObj = class
  private
    FObjList: TObjectDictionary <integer, TMyObject>;
  public
    constructor Create;
    destructor Destroy;
    // How to access Values correctly? Something similar to this not working code
    property Values: TValueCollection read FObjList.Values write FObjList.Values;
  end;

  var MyObj: TMyObj;

Чтобы получить доступ к значениям FObjList, я хотел бы написать:

  for tmpObject in MyObj.Values do
...

Как мне нужно объявить свойство "Значения", чтобы MyObj.Values ​​вел себя точно так же, как если бы я обращался к MyObj.FObjList.Values?

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010
  /// Interface

  TMyDictionary = TObjectDictionary <integer, TMyObject>;
  TMyValueCollection = TDictionary<integer,TMyObject>.TValueCollection;

  TMyObj = class
  private
    FObjList: TMyDictionary;
    function GetValues: TMyValueCollection;
  public
    constructor Create;
    destructor Destroy; override;
    property Values: TMyValueCollection read GetValues;
  end;


/// Implementation


constructor TMyObj.Create;
begin
  inherited;
  FObjList := TMyDictionary.Create;
end;

destructor TMyObj.Destroy;
begin
  FObjList.Free;
  inherited;
end;

function TMyObj.GetValues: TMyValueCollection;
begin
  Result := FObjList.Values;
end;
1 голос
/ 22 декабря 2010

TValueCollection является вложенным классом TDictionary и должен быть квалифицирован. И вам лучше указать метод получения для значений.

type   
  TMyObjectDictionary = TObjectDictionary <integer, TMyObject>;

  TMyObj = class   
  private
    FObjList: TMyObjectDictionary;
    function GetValues: TMyObjectDictionary.TValueCollection;  
  public
    property Values: TMyObjectDictionary.TValueCollection read GetValues;   
  end;

function TMyObj.GetValues: TMyObjectDictionary.TValueCollection;
begin
  Result := FObjList.Values;
end;

Редактировать: Ups! Слишком поздно ... Но немного по-другому.

...