Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi unbekannte Anzahl Wertepaare = dyn array ? (https://www.delphipraxis.net/181325-unbekannte-anzahl-wertepaare-%3D-dyn-array.html)

Ajintaro 6. Aug 2014 13:12

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:
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');
Das Problem ist, die Anzahl der Eigenschaften sind unterschiedlich. Wenn ich eine ganze Listbox voller Wertepaare habe:

Code:
Länge=2m
Lieblingsfarbe=blau
Mag Tomaten=nein
Mag Tiere=ja
findet Merkel komisch=unbekannt
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 ?

Captnemo 6. Aug 2014 13:29

AW: unbekannte Anzahl Wertepaare = dyn array ?
 
Also ich würde das über eine Klasse machen

Delphi-Quellcode:
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;
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.

Das oben ist so aus dem Kopf geschrieben, kann also fehler beinhalten.

himitsu 6. Aug 2014 13:38

AW: unbekannte Anzahl Wertepaare = dyn array ?
 
Und nein, sowas geht leider nicht. (abgesehn von einigen alten Funktionen mit bissl Compilermagic)

Delphi-Quellcode:
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']);
Oder halt andere Varianten, ala dem bereits Genannten.

Sir Rufo 6. Aug 2014 16:00

AW: unbekannte Anzahl Wertepaare = dyn array ?
 
Geht ja auch mit
Delphi-Quellcode:
uses
  System.Generics.Collections;

type
  TEigenschaften = TDictionary<string,string>;

Dejan Vu 6. Aug 2014 16:02

AW: unbekannte Anzahl Wertepaare = dyn array ?
 
Delphi-Quellcode:
// 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']));
Bei 'Array of Const' musst Du in der Prozedur mit 'TVarRec(Eigenschaften[i]).VString' (irgendwie so) arbeiten.
Delphi-Quellcode:
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;
Irgendwie so (aus dem Gedächtnis).

Edit: Achso, mit Werten...
Delphi-Quellcode:
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;
Hoffe, das geht so ähnlich.

sx2008 6. Aug 2014 18:12

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:
TStringList
kann dazu verwendet werden:
Delphi-Quellcode:
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']);
Neben dem Property
Delphi-Quellcode:
Values[]
gibt es auch noch andere Properties (zb.
Delphi-Quellcode:
Names[]
) mit dessen Hilfe man
auch mit einer Schleife über das Dictionary gehen kann um alle Einträge auszulesen:
http://docwiki.embarcadero.com/Libra...Strings.Values


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:41 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