Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Strings als Array-Key
willy - Mi 28.12.05 16:05
Titel: Strings als Array-Key
Geht das? Eine Zuweisung sollte dann irgentwie so aussehen:
Delphi-Quelltext
1:
| array['test'] := 'was_auch_immer'; |
Wenn es funktioniert, wie erstelle ich ein solches Array?
Danke schonmal
MfG willy
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
noidic - Mi 28.12.05 16:21
Was du suchst ist ein assiozatives Array, sowas hat Delphi nicht von sich aus ( in .NET vllt., keine Ahnung ). Musst du also selbst baun.
Wenns dir nur um Strings geht, könntest du mit ner StringList weiterkommen, wo jeder Eintrag in der Form <Index>=<Inhalt> aufgebaut ist. Stichwort Names und Values.
Narses - Mi 28.12.05 16:22
Moin!
Nein, das geht nicht. Du könntest die Key-Strings in eine StringListe tun und dann mit .IndexOf arbeiten.
cu
Narses
delfiphan - Mi 28.12.05 22:16
Stichwort "selber bauen":
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| type TAssocList = class FKeys, FValues: TStringList; protected function GetStr(Key: String): String; procedure SetStr(Key: String; Value: String); constructor Create; destructor Destroy; override; public property Strings[Key: String]: String read GetStr write SetStr; default; procedure Delete(Key: String); procedure Clear; end;
constructor TAssocList.Create; begin FKeys := TStringList.Create; FValues := TStringList.Create; end;
destructor TAssocList.Destroy; begin if FKeys <> nil then FKeys.Free; if FValues <> nil then FValues.Free; end;
function TAssocList.GetStr(Key: String): String; var I: Integer; begin I := FKeys.IndexOf(Key); if I >= 0 then Result := FValues[I]; end;
procedure TAssocList.SetStr(Key: String; Value: String); var I: Integer; begin I := FKeys.IndexOf(Key); if I >= 0 then FValues[I] := Value else begin FKeys.Add(Key); FValues.Add(Value); end; end;
procedure TAssocList.Delete(Key: String); var I: Integer; begin I := FKeys.IndexOf(Key); if I >= 0 then begin FKeys.Delete(I); FValues.Delete(I); end; end;
procedure TAssocList.Clear; begin FKeys.Clear; FValues.Clear; end; |
Anwendungsbeispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.ButtonClick(Sender: TObject); var MyArray: TAssocList; begin MyArray := TAssocList.Create; MyArray['test'] := 'was_auch_immer'; MyArray.Free; end; |
JayK - Mi 28.12.05 23:13
ich hab irgendwo in der Delphi-Hilfe mal gelesen, dass das bei Properties einer Klasse geht :gruebel: es ist auf jeden Fall irgendwie möglich, denn bei TJvFormStorage.StoredValue[] muss man einen String als Array-"Index" angeben ;)
ich suche nochmal raus, wie und in wie fern das geht...
|EDIT:
Delphi Online Help (Delphi 2005) hat folgendes geschrieben: |
Array-Eigenschaften
Array-Eigenschaften sind indizierte Eigenschaften. Sie werden beispielsweise für die Einträge eines Listenfeldes, die untergeordneten Objekte eines Steuerelements oder die Pixel einer Bitmap-Grafik verwendet.
Die Deklaration einer Array-Eigenschaft enthält eine Parameterliste mit den Namen und Typen der Indizes. Beispiel:
Delphi-Quelltext 1: 2: 3:
| property Objects[Index: Integer]: TObject read GetObject write SetObject; property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel; property Values[const Name: string]: string read GetValue write SetValue; |
Das Format der Liste ist mit dem Format der Parameterliste einer Prozedur oder Funktion identisch. Der einzige Unterschied besteht darin, dass die Parameterdeklarationen nicht in runden, sondern in eckigen Klammern angegeben werden. Im Gegensatz zu Arrays, bei denen nur ordinale Indizes erlaubt sind, können die Indizes von Array-Eigenschaften einen beliebigen Typ haben.
Bei Array-Eigenschaften müssen die Zugriffsbezeichner keine Felder, sondern Methoden angeben. Die Methode in einem read-Bezeichner muss eine Funktion sein, bei der Anzahl, Reihenfolge und Typ der Parameter mit der Indexparameterliste der Eigenschaft identisch sind und der Ergebnistyp mit dem Typ der Eigenschaft übereinstimmt. Die Methode in einem write-Bezeichner muss eine Prozedur sein, bei der Anzahl, Reihenfolge und Typ der Parameter mit der Indexparameterliste der Eigenschaft identisch sind. Außerdem muss ein zusätzlicher Wert- oder const-Parameter mit dem Typ der Eigenschaft vorhanden sein.
Die Zugriffsmethoden für die obigen Array-Eigenschaften können beispielsweise folgendermaßen deklariert werden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function GetObject(Index: Integer): TObject; function GetPixel(X, Y: Integer): TColor; function GetValue(const Name: string): string; procedure SetObject(Index: Integer; Value: TObject); procedure SetPixel(X, Y: Integer; Value: TColor); procedure SetValue(const Name, Value: string); |
Auf eine Array-Eigenschaft kann durch Indizieren ihres Bezeichners zugegriffen werden. So sind beispielsweise die Anweisungen
Delphi-Quelltext 1: 2: 3:
| if Collection.Objects[0] = nil then Exit; Canvas.Pixels[10, 20] := clRed; Params.Values['PATH'] := 'C:\BIN'; |
mit den folgenden Anweisungen identisch:
Delphi-Quelltext 1: 2: 3:
| if Collection.GetObject(0) = nil then Exit; Canvas.SetPixel(10, 20, clRed); Params.SetValue('PATH', 'C:\BIN'); |
Wenn Sie die Direktive default nach der Definition einer Array-Eigenschaft angeben, wird diese als Standardeigenschaft der betreffenden Klasse verwendet. Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type TStringArray = class public property Strings[Index: Integer]: string ...; default; ... end; |
Auf die Array-Standardeigenschaft einer Klasse kann mit der Kurzform Objekt[Index] zugegriffen werden. Diese Anweisung ist mit Objekt.Eigenschaft[Index] identisch. Ausgehend von der vorhergehenden Deklaration kann z. B. StringArray.Strings[7] zu StringArray[7] verkürzt werden. Jede Klasse kann nur eine Standardeigenschaft haben. Das Ändern oder Verbergen der Standardeigenschaft in abgeleiteten Klassen kann zu unerwünschten Ergebnissen führen, da der Compiler Bindungen an Eigenschaften immer statisch vornimmt.
|
delfiphan - Mi 28.12.05 23:41
Hast du denn überhaupt meinen Code oben angeschaut?
JayK - Mi 28.12.05 23:46
Ehrlich gesagt nicht ;) du hast angefangen eine neue Klasse allein fürs array zu implementieren, daher ging ich von einer anderen Lösung aus, sry.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!