Подтвердить что ты не робот

Пример использования Generics.Collections.TObjectDictionary

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

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

Любые указатели?

4b9b3361

Ответ 1

Основное различие между 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.

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