Example for using Generics.Collections.TObjectDictionary

dummzeuch picture dummzeuch · Dec 11, 2011 · Viewed 26.5k times · Source

The Delphi XE2 online help (as well as the Embarcadero DocWiki) is very thin on the documentation of TObjectDictionary (or I am too stupid to find it).

As far as I understand it, it can be used to store object instances that can be accessed via string keys (basically what was always possible with a sorted TStringList but typesafe). But I am at a loss on how to actually declare and use it.

Any pointers?

Answer

RRUZ picture RRUZ · Dec 11, 2011

The main difference between a TObjectDictionary and a TDictionary is that provides an mechanism to specify the Ownership of the keys and/or values added to the collection (dictionary), So you don't need to worry about freeing these objects.

Check this basic sample

{$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.

Check this link Generics Collections TDictionary (Delphi) for a complete sample about how to use a TDictionary (remember the only difference with the TObjectDictionary is the Ownership of the keys and/or values that is specified in the constructor, So the same concepts applies to both)