web-dev-qa-db-ja.com

Generics.Collections.TObjectDictionaryの使用例

Delphi XE2オンラインヘルプ(およびEmbarcadero DocWiki)は、TObjectDictionaryのドキュメントが非常に薄いです(または、私はそれを見つけるのが愚かすぎます)。

私が理解している限り、文字列キーを介してアクセスできるオブジェクトインスタンスを格納するために使用できます(基本的には、ソートされたTStringListで常に可能でしたが、タイプセーフです)。しかし、実際にそれを宣言して使用する方法に迷っています。

ポインタはありますか?

18
dummzeuch

TObjectDictionaryTDictionary の主な違いは、追加されたキーや値の所有権を指定するメカニズムを提供することです。コレクション(辞書)に追加するので、これらのオブジェクトを解放することを心配する必要はありません。

この基本的なサンプルを確認してください

{$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の使用方法に関する完全なサンプルについては、このリンクを確認してください Generics Collections TDictionary(Delphi) (TObjectDictionaryとの唯一の違いは、キーや値の所有権です。コンストラクターで指定されているため、同じ概念が両方に適用されます)

28
RRUZ