Talk:Generics.Collections.TDictionary (Delphi)
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.