![]() |
Records dynamisch durchlaufen
Gibt es eine Möglichkeit ein Record dynamisch zu durchlaufen?
Hatte an etwa sowas gedacht:
Delphi-Quellcode:
Mir würde es auch schon reichen irgendwie die Elementanzahl des Records zu ermitteln (im Beispiel 3 Elem.).
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; 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 ;-) |
Re: Records dynamisch durchlaufen
Moin...
Du könntest deinen Record mir nem Array "kreuzen". zum Bleistiel so:
Delphi-Quellcode:
dann musst du zwar immernoch name, nachname und alter ausschreiben, aber brauchst das nur einmal machen und kannst den rest in einer Schleife abarbeiten.
TRec = record
name:Array of string; nachname:Array of string; alter:Array of integer; end; Erstellst du denn den record dynamisch? sonst weisst du doch wie lang der ist?!? :spin: bis denne... |
Re: Records dynamisch durchlaufen
Zitat:
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. |
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; |
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:
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.
TRec = record
name:string; nachname:string; alter: 1..110; Tel: String; //hinzugefuegt end; |
Re: Records dynamisch durchlaufen
Ich versuchs nochmal:
Delphi-Quellcode:
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.
TFeld = record
Text, inhalt: string; end; TRec = record gruppe: string; feld: array of TFeld; end; MyRec: array of TRec; 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' |
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... |
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) |
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:
Basierte aber darauf, dass ich Frage falsch interpretiert hatte... Das was MichMack wirklich will ist ja mit einem assoziativen Array viel besser gelöst.
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; ![]() 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