Talk:Generics.Collections.TDictionary (Delphi)

From RAD Studio Code Examples
Jump to: navigation, search

Just a quick update to get the example working... I also changed the output to a TMemo instead of ShowMessage. Start with a blank form, set form's name to 'Form1', add a TMemo then paste in the following:


unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Generics.Collections,
 Dialogs, StdCtrls;

type

 TCity= record
   Country: string;
   Latitude: double;
   Longitude: double;
 end;


type

 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
 private
   procedure KNotify(Sender: TObject; const Item: String;
     Action: TCollectionNotification);
   procedure VNotify(Sender: TObject; const Item: TCity; Action: TCollectionNotification);
   procedure AddMessage(aMsg: string);
   { Private declarations }
 public
   { Public declarations }
 end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AddMessage(aMsg: string); begin

 Memo1.Lines.Add(aMsg);
 Memo1.Lines.Add();

end;


procedure TForm1.KNotify(Sender: TObject; const Item: String;

 Action: TCollectionNotification);

begin

 { Show a message each time a key is added or removed. }
 AddMessage('The key "' + Item + '" was added/removed.');

end;

procedure TForm1.VNotify(Sender: TObject; const Item: TCity;

 Action: TCollectionNotification);

begin

 { Show a message each time a value is added or removed. }
 AddMessage('The value "' + Item.Country + '" was added/removed.');

end;

procedure TForm1.FormCreate(Sender: TObject); var

 Dictionary: TDictionary<String, TCity>;
 City, Value: TCity;
 Key: String;
 temp: String;
 pair: TEnumerator<TPair<String, TCity>>;

begin

 { Create the dictionary. }
 Dictionary := TDictionary<String, TCity>.Create;
 Dictionary.OnKeyNotify := KNotify;
 Dictionary.OnValueNotify := VNotify;
 { Add some key-value pairs to the dictionary. }
 City.Country := 'Romania';
 City.Latitude := 47.16;
 City.Longitude := 27.58;
 Dictionary.Add('Iasi', City);
 City.Country := 'United Kingdom';
 City.Latitude := 51.5;
 City.Longitude := -0.17;
 Dictionary.Add('London', City);
 City.Country := 'Argentina';
 { Notice the wrong coordinates. }
 City.Latitude := 0;
 City.Longitude := 0;
 Dictionary.Add('Buenos Aires', City);
 { Display the current number of key-value entries. }
 AddMessage('Number of pairs in the dictionary: ' +
 IntToStr(Dictionary.Count));
 // Try looking up "Iasi".
 if (Dictionary.TryGetValue('Iasi', City) = True) then
 begin
   AddMessage(
   'Iasi is located in ' + City.Country +
   ' with latitude = ' + FloatToStrF(City.Latitude, ffFixed, 4, 2) +
   ' and longitude = ' + FloatToStrF(City.Longitude, ffFixed, 4, 2)
   );
 end
 else
   AddMessage('Could not find Iasi in the dictionary');
 { Remove the "Iasi" key from dictionary. }
 Dictionary.Remove('Iasi');
 { Make sure the dictionary's capacity is set to the number of entries. }
 Dictionary.TrimExcess;
 { Test if "Iasi" is a key in the dictionary. }
 if Dictionary.ContainsKey('Iasi') then
   AddMessage('The key "Iasi" is in the dictionary.')
 else
   AddMessage('The key "Iasi" is not in the dictionary.');
 { Test if (Argentina, 0, 0) is a value in the dictionary. }
 City.Country := 'United Kingdom';
 City.Latitude := 51.5;
 City.Longitude := -0.17;
 if Dictionary.ContainsValue(City) then
   AddMessage('The value (United Kingdom, 51.5, -0.17) is in the dictionary.')
 else
   AddMessage('The value (United Kingdom, 51.5, -0.17) is not in the dictionary.');
 { Update the coordinates to the correct ones. }
 City.Country := 'Argentina';
 City.Latitude := -34.6;
 City.Longitude := -58.45;
 Dictionary.AddOrSetValue('Buenos Aires', City);
 { Generate the exception "Duplicates not allowed". }
 try
   Dictionary.Add('Buenos Aires', City);
 except
   on Exception do
     { AddMessage('Could not add entry. Duplicates are not allowed.'); }
 end;
 { Display all countries. }
 temp := 'All countries:' + #13;
 for Value in Dictionary.Values do
   temp := temp + #13 + Value.Country;
 AddMessage(temp);
 { Iterate through all keys in the dictionary and display their coordinates. }
 temp := 'All cities and their coordinates:' + #13;
 for Key in Dictionary.Keys do
   temp := temp + #13 + Key + ': ' + #13 +
   FloatToStrF(Dictionary.Items[Key].Latitude, ffFixed, 4, 2) + ', ' +
   FloatToStrF(Dictionary.Items[Key].Longitude, ffFixed, 4, 2) + #13;
 AddMessage(temp);
 { Clear all entries in the dictionary. }
 Dictionary.Clear;
 { There should be no entries at this point. }
 AddMessage('Number of key-value pairs in the dictionary: ' + IntToStr(Dictionary.Count));
 { Free the memory allocated for the dictionary. }
 Dictionary.Destroy;

end;

end.