2011-12-11 44 views
13

Trợ giúp trực tuyến Delphi XE2 (cũng như Docthon Embarcadero) rất mỏng trên tài liệu của TObjectDictionary (hoặc tôi quá ngu ngốc để tìm thấy nó). Theo như tôi hiểu nó, nó có thể được sử dụng để lưu trữ các cá thể đối tượng có thể được truy cập thông qua các khóa chuỗi (về cơ bản những gì luôn có thể với một số được sắp xếp TStringList nhưng an toàn). Nhưng tôi đang thua lỗ về cách thực sự tuyên bố và sử dụng nó.Ví dụ về việc sử dụng Generics.Collections.TObjectDictionary

Mọi con trỏ?

+0

Các khóa trong từ điển TDictionary hoặc TObjectDictionary không phải là chuỗi. Chúng có thể là bất kỳ loại nào. Các * giá trị * trong một TObjectDictionary phải mở rộng TObject, trong khi TDictionary có thể lưu trữ các giá trị của bất kỳ loại nào. – awmross

Trả lời

24

Sự khác biệt chính giữa TObjectDictionaryTDictionary là cung cấp cơ chế chỉ định Quyền sở hữu khóa và/hoặc giá trị được thêm vào bộ sưu tập (từ điển), Vì vậy, bạn không cần lo lắng về việc giải phóng các đối tượng này.

Kiểm tra mẫu cơ bản này

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

Kiểm tra liên kết này Generics Collections TDictionary (Delphi) cho một mẫu đầy đủ về cách sử dụng một TDictionary (nhớ sự khác biệt chỉ với TObjectDictionary là sở hữu của các phím và/hoặc giá trị được chỉ định trong hàm tạo, Vì vậy, các khái niệm tương tự áp dụng cho cả hai)

+6

+1 Sử dụng 'doOwnsKeys' nếu bạn muốn điều trị tương tự cho các phím –

Các vấn đề liên quan