Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Records dynamisch durchlaufen (https://www.delphipraxis.net/9362-records-dynamisch-durchlaufen.html)

mickmack 24. Sep 2003 21:00


Records dynamisch durchlaufen
 
Gibt es eine Möglichkeit ein Record dynamisch zu durchlaufen?

Hatte an etwa sowas gedacht:
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
       end;

MyRec:TRec;

//nur PseudoCode
while not AmRecordEnde do
begin
  -gebe aktuelles Recordelement aus
   (in ersten Fall das Element name etc)
  -gehe zum nächsten Recordelement
end;
Mir würde es auch schon reichen irgendwie die Elementanzahl des Records zu ermitteln (im Beispiel 3 Elem.).

Gibt es da ne Möglichkeit, oder muss man immer ein Array mitlaufen lassen, um eine gewisse Dynamik zu erhalten.

Also ich hoffe das ist soweit einigermaßen verständlich. War gar nicht so leicht zu formulieren ;-)

Tonic1024 25. Sep 2003 07:59

Re: Records dynamisch durchlaufen
 
Moin...


Du könntest deinen Record mir nem Array "kreuzen". zum Bleistiel so:
Delphi-Quellcode:
TRec = record
        name:Array of string;
        nachname:Array of string;
        alter:Array of integer;
       end;
dann musst du zwar immernoch name, nachname und alter ausschreiben, aber brauchst das nur einmal machen und kannst den rest in einer Schleife abarbeiten.

Erstellst du denn den record dynamisch? sonst weisst du doch wie lang der ist?!? :spin:

bis denne...

mickmack 25. Sep 2003 09:39

Re: Records dynamisch durchlaufen
 
Zitat:

Zitat von Tonic1024
Erstellst du denn den record dynamisch? sonst weisst du doch wie lang der ist?!?

Ja aber das ist ja das Problem. Ich lese an mehreren Stellen das Record aus, zB um es in ein StringGrid einzulesen. Wenn ich jetzt aber das Record verändere, dh ein Element hinzufüge oder entferne muss ich überall den gesamten Code anpassen.
Ganz praktisch wäre so etwas auch im folgenden Fall: wenn man zB das Record über ein Form einlesen möchte, muss man jetzt noch dieses Form statisch zur Erstellungszeit erzeugen. Toll wäre es doch aber, wenn es ne Möglichkeit gäbe, dieses Form in Abhängigkeit von der Anzahl der Recordelemente zur Laufzeit zu erstellen.
Das Einzige was mir dazu einfiel, ist entweder eine Konstante mit der Länge des Records, bzw ein Array in dem nocheinmal die Elementnamen des Records gespeichert sind. Dieses Array könnte man dann dynamisch durchlaufen.
Aber das ist ja eigentlich das, was ich umgehen möchte. So muss ich zwar nicht ständig den ganzen Code ändern, aber immerhin noch zwei Quellen pflegen, das Record und das Array.
Mir schwebt halt vor, nur das Record pflegen zu müssen.

Tpercon 25. Sep 2003 10:03

Re: Records dynamisch durchlaufen
 
@ Tonic1024:
Das wäre aber praktischer (wobei ich auch nicht ganz die Frage verstehe:gruebel:):
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
       end;

MyRec:array of TRec;

mickmack 25. Sep 2003 10:20

Re: Records dynamisch durchlaufen
 
Ich versuch mein Problem noch einmal über das Beispiel mit dem Einlesen der Recorddaten deutlich zu machen.
Um die Daten einzulesen, brauch ich doch ein Form, das für jedes Recordelement ein Editfeld besitzt. Dieses Form erstellt man doch aber zur Designzeit.
Wenn ich jetzt aber den Typen des Records ändere(siehe Beispiel), muss ich doch auch per Hand das Formular anpassen. Ich muss ein weiters Editfeld für die Telefonnummer hinzufügen.
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
        Tel: String; //hinzugefuegt
       end;
Ich würde aber gerne eine Möglichkeit haben den Recordtypen dynamisch zu durchlaufen und für jedes Element ein Editfeld zur Laufzeit zu erzeugen, ähnlich wie man beim Array von low to high gehen kann.

Tpercon 25. Sep 2003 10:39

Re: Records dynamisch durchlaufen
 
Ich versuchs nochmal:
Delphi-Quellcode:
  TFeld = record
    Text,
    inhalt: string;
  end;

  TRec = record
    gruppe: string;
    feld: array of TFeld;
  end;

MyRec: array of TRec;
Jetzt kannst du jedes MyRec Element einen Gruppennamen verpassen und die ganzen Feldbezeichnungen der Gruppe legst du unter dem dyn. Array feld an. Die Bezeichnung unter Text und den Inhalt unter inhalt.
Bsp. für MyRec[0]:
gruppe -> Gruppexy
feld[0].Text -> name
feld[0].inhalt -> 'meinnachname'
feld[1].Text -> vorname
feld[1].inhalt -> 'meinname'
feld[2].Text -> alter
feld[2].inhalt -> '20'

Tonic1024 25. Sep 2003 10:55

Re: Records dynamisch durchlaufen
 
Moin...

@Tpercon: Normal würde ich dir Recht geben, aber er wollte ja den Record dynamisch durchlaufen und nicht ein Array mit Records... [Haarspalterei ON] :lol:


Ist das dann nicht auch der falsche weg mit den records? Ich wüde assoziative arrays vorschlagen... irgentwo gabs da was zum free-download für delphi.

Dann hättest du die Möglichkeit den feldern namen zu geben und es würden Funktionen wie high() und Length() ziehen...

Zu dem Code von Tpercon: Aber wo steckt darin die dynamik im Sinne von Mickmack's Problem? Dann muss er doch immernoch den Record "von Hand" ändern, oder doch, oder wie?!? - [beinahe_völlig_verwirrt_nu]

Bis denne...

Jens Schumann 25. Sep 2003 13:53

Re: Records dynamisch durchlaufen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Tonic1024,
ich denke so wie Du das vor hast geht das nicht.
Ich wüßte nicht das Records mit RTTI Info's abgelet werden.
Nachfahren vom TComponent haben jedoch RTTI Info's.
Anstatt eines Record's habe ich in dem Beispiel einen TComponent Nachfahren verwendet. Die Properties, die dynamisch editieren möchte
müssen published sein. Wenn Du im Quelltext TMyObject eine String-Property hinzufügst wird auch ein passendes TEdit erzeugt und über dieses TEdit kannst Du die Eigenschaft auch setzen.

Es handelt sich um ein rudimentäres Beispiel (gerade getippt)

Tonic1024 26. Sep 2003 08:01

Re: Records dynamisch durchlaufen
 
Moin...

Erstmal muss ich sagen, dass ich mir bestimmt nicht soviel Gedanken gemacht habe wie Jens... Ist schon ein beachtliches Stück Code... - für mal eben getippt... :lol:

Ist vielleicht auch ein wenig unhandlich... Aber ich glaube wir schweifen ab... Nur um das Thema noch mal zu vervollständigen und damit ein weiterer Suchender auch eine Antwort bekommt... :D

Das war es was ich gemeint hatte.

Delphi-Quellcode:
TRec = record
        name:Array of string;
        nachname:Array of string;
        alter:Array of integer;
       end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var Daten: TRec;
begin
  setlength(Daten.name,length(Daten.name)+1);
  setlength(Daten.nachname,length(Daten.nachname)+1);
  setlength(Daten.alter,length(Daten.alter)+1);

  Daten.name[0]:='Mick';
  Daten.nachname[0]:='Mack';
  Daten.alter[0]:=23;

  Label1.Caption:=Daten.name[0];
  Label2.Caption:=Daten.nachname[0];
  Label3.Caption:=inttostr(Daten.alter[0]);
end;
Basierte aber darauf, dass ich Frage falsch interpretiert hatte... Das was MichMack wirklich will ist ja mit einem assoziativen Array viel besser gelöst.

Hier im Forum suchenassoziatives array
Hash wäre noch so ein stichwort nach dem man suchen könnte...

Bis denne...


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