Пример использования Generics.Collections.TObjectDictionary - PullRequest
17 голосов
/ 11 декабря 2011

Онлайн-справка Delphi XE2 (а также Embarcadero DocWiki) очень тонка в документации TObjectDictionary (или я слишком глуп, чтобы ее найти).

Насколько я понимаю, его можно использовать для хранения экземпляров объектов, к которым можно получить доступ через строковые ключи (в основном то, что всегда было возможно с отсортированным TStringList, но безопасным типом). Но я не знаю, как на самом деле объявить и использовать его.

Есть указатели?

1 Ответ

28 голосов
/ 11 декабря 2011

Основное различие между TObjectDictionary и TDictionary заключается в том, что он предоставляет механизм для указания владения ключами и / или значениями, добавляемыми в коллекцию (словарь).), Поэтому вам не нужно беспокоиться об освобождении этих объектов.

Проверьте этот базовый пример

{$APPTYPE CONSOLE}    
{$R *.res}
uses
  Generics.Collections,
  Classes,
  System.SysUtils;


Var
  MyDict  : TObjectDictionary<String, TStringList>;
  Sl      : TStringList;
begin
  ReportMemoryLeaksOnShutdown:=True;
  try
   //here i'm  creating a TObjectDictionary with the Ownership of the Values 
   //because in this case the values are TStringList
   MyDict := TObjectDictionary<String, TStringList>.Create([doOwnsValues]);
   try
     //create an instance of the object to add
     Sl:=TStringList.Create;
     //fill some foo data
     Sl.Add('Foo 1');
     Sl.Add('Foo 2');
     Sl.Add('Foo 3');
     //Add to dictionary
     MyDict.Add('1',Sl);

     //add another stringlist on the fly 
     MyDict.Add('2',TStringList.Create);
     //get an instance  to the created TStringList
     //and fill some data
     MyDict.Items['2'].Add('Line 1');
     MyDict.Items['2'].Add('Line 2');
     MyDict.Items['2'].Add('Line 3');


     //finally show the stored data
     Writeln(MyDict.Items['1'].Text);
     Writeln(MyDict.Items['2'].Text);        
   finally
     //only must free the dictionary and don't need to worry for free the TStringList  assignated to the dictionary
     MyDict.Free;
   end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Проверьте эту ссылку Generics Collections TDictionary (Delphi) для получения полного примера о том, как использовать TDictionary (помните толькоРазница с TObjectDictionary заключается в владении ключами и / или значениями, указанными в конструкторе, поэтому одни и те же понятия применимы к обоим)

...