AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi unbekannte Anzahl Wertepaare = dyn array ?
Thema durchsuchen
Ansicht
Themen-Optionen

unbekannte Anzahl Wertepaare = dyn array ?

Ein Thema von Ajintaro · begonnen am 6. Aug 2014 · letzter Beitrag vom 6. Aug 2014
Antwort Antwort
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#1

unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 14:12
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 ?
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#2

AW: unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 14:29
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo ( 6. Aug 2014 um 19:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

AW: unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 14:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 17:00
Geht ja auch mit
Delphi-Quellcode:
uses
  System.Generics.Collections;

type
  TEigenschaften = TDictionary<string,string>;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 17:02
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.

Geändert von Dejan Vu ( 6. Aug 2014 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: unbekannte Anzahl Wertepaare = dyn array ?

  Alt 6. Aug 2014, 19:12
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 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 Values[] gibt es auch noch andere Properties (zb. 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
fork me on Github
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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