![]() |
unbekannte Anzahl Wertepaare = dyn array ?
Hallo DP !
Ich versuche mich an einer Prozedur, die Personendaten in einem Memo erzeugt. Die Daten sind simpel: (1) Name der Person (2) Eigenschaft 1, Wert 1 (3) Eigenschaft 2, Wert 2 (n) Eigenschaft n, Wert n Beispiel: (1) Horst (2) Lieblingsfarbe, blau (3) Größe, 2m ungetestet:
Delphi-Quellcode:
Das Problem ist, die Anzahl der Eigenschaften sind unterschiedlich. Wenn ich eine ganze Listbox voller Wertepaare habe:
Procedure AddPerson(pname,eigenschaft1,eigenschaft2,wert1,wert2: string;);
Begin Fmain.Memo2.lines.add(pname); Fmain.Memo2.lines.add(eigenschaft1+','+wert1); Fmain.Memo2.lines.add(eigenschaft2+','+wert2); End; //Aufruf AddPerson('Horst','Lieblingsfarbe','Größe','blau','2m');
Code:
mal mit 5 Paaren oder auch 50, wie kann ich meine Prozedur so umschreiben, dass für jedes gefundene Wertepaar (z.B. aus der Listbox) eine eigene Zeile ins Memo geschrieben wird ? Wäre das ein klassischer Anwendungsfall eines einfachen, dynamischen Arrays ?
Länge=2m
Lieblingsfarbe=blau Mag Tomaten=nein Mag Tiere=ja findet Merkel komisch=unbekannt |
AW: unbekannte Anzahl Wertepaare = dyn array ?
Also ich würde das über eine Klasse machen
Delphi-Quellcode:
So kannst du prima auf die Eigenschaften einer Person zugreifen. Für die Personen legst du dir auch noch ein ObjectList an. Und für die Ausgabe an z.b. ein Memo kann du prima dir den Rückgabestring über ein Funktion der Klasse zusammenstricken lassen.
type
TEigenschaft = class FBezeichnung: String; FWert: String; procedure SetBezeichnung(const Value: String); procedure SetWert(const Value: String); published property Bezeichnung: String read FBezeichnung write SetBezeichnung; property Wert: String read FName write SetWert; end; type TEigenschaftenListe = class(TObjectList) protected function getItem(index: Integer): TEigenschaft ; virtual; procedure setItem(index: Integer; Eigenschaft : TEigenschaft ); virtual; public function Add(Eigenschaft : TEigenschaft ): Integer; virtual; function Remove(Eigenschaft : TEigenschaft ): Integer; virtual; function IndexOf(Eigenschaft : TEigenschaft ): Integer; virtual; procedure Insert(index: Integer; Eigenschaft : TEigenschaft ); virtual; function First: TEigenschaft ; virtual; function Last: TEigenschaft ; virtual; property Items[index: Integer]: TEigenschaft read getItem write setItem; default; end; Type TPerson = class FName: String; FEigenschaften: TEigenschaftenListe end; Das oben ist so aus dem Kopf geschrieben, kann also fehler beinhalten. |
AW: unbekannte Anzahl Wertepaare = dyn array ?
Und nein, sowas geht leider nicht. (abgesehn von einigen alten Funktionen mit bissl Compilermagic)
Delphi-Quellcode:
Oder halt andere Varianten, ala dem bereits Genannten.
procedure AddPerson(pname, name_value: array of string);
begin Fmain.Memo2.Lines.Add(pname); for i := 0 to Length(name_value) div 2 - 1 do Fmain.Memo2.Lines.Add(name_value[i * 2] + '=' + name_value[i * 2 + 1]); end; //Aufruf AddPerson('Horst', ['Lieblingsfarbe', 'blau', 'Größe', '2m']); |
AW: unbekannte Anzahl Wertepaare = dyn array ?
Geht ja auch mit
Delphi-Quellcode:
uses
System.Generics.Collections; type TEigenschaften = TDictionary<string,string>; |
AW: unbekannte Anzahl Wertepaare = dyn array ?
Delphi-Quellcode:
Bei 'Array of Const' musst Du in der Prozedur mit 'TVarRec(Eigenschaften[i]).VString' (irgendwie so) arbeiten.
// geht so:
Procedure AddPersonV1(pname : String; Eigenschaften : Array Of Const); // oder so Procedure AddPersonV2(pname : String; Eigenschaften : Variant); // // Aufruf mit AddPersonV1('Paul',['Foo','Bar','Bla']); AddPersonV1('Paul',VarArrayOf(['Foo','Bar','Bla'])); AddPersonV1('Bernd',VarArrayOf(['Foo','Bar','Bla','Nochmehr','Huppsi']));
Delphi-Quellcode:
Irgendwie so (aus dem Gedächtnis).
Procedure AddPersonV1(pname : String; Eigenschaften : Array Of Const);
var i : Integer; begin memo1.lines.add(pname); for i:=0 to High(Eigenschaften) do memo1.lines.add (TVarRec(Eigenschaften[i]).VString); End; Edit: Achso, mit Werten...
Delphi-Quellcode:
Hoffe, das geht so ähnlich.
Procedure AddPersonV1(pname : String; Eigenschaften,Werte : Array Of Const);
var i : Integer; begin Assert(High(Eigenschaften) = High(Werte), 'Eigenschaften und Werte müssen gleich viel Elemente enthalten); memo1.lines.add(pname); for i:=0 to High(Eigenschaften) do memo1.lines.add (Format('%s=%s', [TVarRec(Eigenschaften[i]).VString,TVarRec(Werte[i]).VString)]); End; |
AW: unbekannte Anzahl Wertepaare = dyn array ?
Wenn du den Namen der Person ebenfalls als Eigenschaft betrachtest dann benötigst du ein Konstrukt das als Dictionary, Map, Assoziatives Array, Hashmap,... bekannt ist.
Eine
Delphi-Quellcode:
kann dazu verwendet werden:
TStringList
Delphi-Quellcode:
Neben dem Property
var
list : TStringList; begin list := TStringList.Create; // befüllen list.Values['Name'] := 'Max Mustermann'; list.Values['email'] := 'max@web.de'; // abrufen ShowMessage('ich heisse '+ list.Values['Name']);
Delphi-Quellcode:
gibt es auch noch andere Properties (zb.
Values[]
Delphi-Quellcode:
) mit dessen Hilfe man
Names[]
auch mit einer Schleife über das Dictionary gehen kann um alle Einträge auszulesen: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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