![]() |
TDictionary - ein Wörterbuch
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo DPler :hi:
jetzt hab ich auch mal was für die CodeLibrary. Was Welterschütterndes hab ich zwar nicht, aber praktisch könnte es u.U. trotzdem sein: Manchmal braucht man ja sowas, wie n Wörterbuch. Man hat n string und will dem n anderen string zuordnen. Möglich war das die ganze Zeit auch schon.Es gab dafür auch mehrere Möglichkeiten: a) ne StringList und die zugeordneten strings in die Objects schreiben ==> Nachteil: TypeCasts und Pointer erforderlich b) 2 StringListen ==> Nachteil: Wollte man irgendwie etwas mit der Liste anstellen, so musste man das mit beiden Listen synchron machen; und wehe man hat irgendwo nicht richtig aufgepasst... c) Array of Record ==> Nachteil: Keine OOP, keine vordefinierten Methoden, Speicherverwaltung von Hand zu machen... d) ObjectList of Class ==> Nachteil: TypeCasts e) TList of Record ==> Nachteil: TypeCast, Pointer, Speicherverwaltung f) Verkettete Listen ==> Nachteil: viel Arbeit :wink: g) ... Irgendwie war das alles nix. Also bastelt man sich mal ne Klasse, die einem die lästigen und fehlerträchtigen TypeCasts erspart: TDictionary Was kann das Viech nun alles? Hier mal n Auszug aus der Unit - der public-Teil:
Delphi-Quellcode:
Das Meiste sollte selbsterklärend sein. N paar Anmerkungen trotzdem noch:
public
constructor Create; destructor Destroy; override; property Count: Integer read GetCount; property Items[index: Integer]: TDicData read GetItem write SetItem; property Keys[index: Integer]: string read GetKey write SetKey; property SectionName: string read FSectionName write FSectionName; property Sorted: Boolean read FSorted write SetSorted default False; property Values[Key: string]: string read GetValue write SetValue; default; // bei der D6-Version heißt diese property "ValuesStr" und ist nicht default property Values[index: Integer]: string read GetValue write SetValue; default; function Add(const AKey, AValue: string): Integer; procedure Clear; virtual; procedure Delete(const AKey: string); overload; virtual; procedure Delete(const AIndex: Integer); overload; virtual; function DeleteValue(const AValue: string): Integer; virtual; procedure Exchange(const Index1, Index2: Integer); overload; virtual; procedure Exchange(const Key1, Key2: string); overload; virtual; function First: TDicData; virtual; function IndexOf(const AKey: string): Integer; virtual; function IndexOfValue(const AValue: string): Integer; virtual; procedure Insert(const AKey, AValue: string; const APos: Integer); virtual; function Last: TDicData; virtual; procedure LoadFromFile(const AFileName: string); virtual; procedure Move(const AIndex, ANewIndex: Integer); virtual; procedure SaveToFile(const AFileName: string); virtual; end; - LoadFromFile und SaveToFile speichert/lädt eine Ini-Datei - SectionName bildet hierbei den Namen für die Section; [Data] ist default - Ein Key-string kann nur einmal vorkommen; wird versucht zweimal unter dem selben Key etwas zu speichern, wird der vorhandene Wert ersetzt - objlist_tmpl.pas und jedi.inc werden benötigt(siehe hierzu diesen ![]() Versionshinweise: Delphi 2005 unterstützt das Überladen von properties(keine Ahnung, ob D7 das auch schon tut :gruebel:), deshalb gibt es eine Version für Delphi2005(mit überladener property Values) und eine Delphi6-Version, bei der die property Values, die den Key-String entgegennimmt, "ValuesStr" heißt... Und noch n bisschen Beispiel-Code:
Delphi-Quellcode:
Getestet unter:
var
Dic: TDictionary; begin Dic := TDictionary.Create; try Dic.Add('house', 'Haus'); Dic.Add('pupil', 'Schüler'); Dic.Add('biro', 'Kugelschreiber'); Dic.Add('Screen', 'Bildschirm'); Dic.Add('insert', 'einfügen'); Memo1.Lines.Add(Dic.Values['Screen']); // Value über Key // Memo1.Lines.Add(Dic.ValuesStr['Screen']); // Value über Key; D6-Version Memo1.Lines.Add(Dic['Screen']); // Value über Key per default-property; bei D6 nicht möglich Memo1.Lines.Add(Dic[3]); // Value über Index per default-property Memo1.Lines.Add(Dic.Values[1]); // Value über Index Memo1.Lines.Add(Dic.Keys[0]); // Key über Index Memo1.Lines.Add(Dic.Items[2].Value); // Item über Index Memo1.Lines.Add(Dic.Items[4].Key); // Item über Index finally Dic.Free; end; - D6PE - D2005PE Danke: Dank gebührt u.a.: - alcaeus für die objlist_tmpl.pas - Thomas Mueller für den Artikel ![]() - allen anderen, die sich angesprochen fühlen... :wink: rfc Christian [edit=Chakotay1308]URL-Tags korrigiert. Mfg, Chakotay1308[/edit] [edit=Chakotay1308]Anhang aktualisiert. Mfg, Chakotay1308[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz