Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi TDictionary - ein Wörterbuch (https://www.delphipraxis.net/60130-tdictionary-ein-woerterbuch.html)

r2c2 3. Jan 2006 15:40


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:
  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;
Das Meiste sollte selbsterklärend sein. N paar Anmerkungen trotzdem noch:
- 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 Thread)

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:
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;
Getestet unter:
- D6PE
- D2005PE

Danke:
Dank gebührt u.a.:
- alcaeus für die objlist_tmpl.pas
- Thomas Mueller für den Artikel Object Pascal Templates
- 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 23:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz