Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - komponenten eines records parsen?
trc2001 - Do 18.12.08 14:24
Titel: komponenten eines records parsen?
Hallo,
ich möchte gerne folgendes tun:
Ich definiere mir ein record:
Delphi-Quelltext
1: 2: 3:
| TMyValue = record Definitionen... end; |
Nun möchte ich TMyValue parsen, mit den folgenden Infos:
Anzahl der Einträge
und dann
---pseudocode---
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i:=0 to einträge do begin -> Name des Eintrags -> Typ des Eintrags -> Wert des Eintrags end; |
--/pseudocode---
Den Typ könnte ich ja über vartype() herausbekommen. Allerdings ist mir schleierhaft, wie ich an die namen der Elemente komme und dynamisch auf diese zugreifen kann. Da ich beliebige records parsen möchte ist davon auszugehen, dass ich im Voraus die Struktur des records nicht kenne. Ich muss mir darüber also zur Laufzeit gewahr werden. Da der Compiler das offenbar kann, denke ich mal es müsste auch zur Laufzeit machbar sein. Ideen?
Gruß
jaenicke - Do 18.12.08 14:37
Hallo und :welcome: hier bei uns!
Das Problem dürfte sein, dass keine RTTI für Records erzeugt wird. Und ohne kommst du auch nicht an die Bestandteile des Records heran. Insbesondere kannst du die Namen nicht bekommen, denn die werden schlicht in Adressen übersetzt, sind also in der fertigen Exe gar nicht mehr vorhanden.
Du könntest höchstens die für dich nötigen Informationen selbst speichern, aber das wäre ziemlich umständlich.
Mit Klassen hättest du die RTTI Informationen, aber das sind eben keine Records dann.
Die Frage ist was du vor hast. Es gibt bestimmt auch eine andere (umsetzbare) Lösung.
trc2001 - Do 18.12.08 14:42
Hi,
danke für die Antwort, sowas hatte ich schon befürchtet.
Ich habe in meinem Projekt einige recht komplexe Strukturen die über records realisiert sind. Ich wollte eigentlich gerne die records parsen um sie in eine XML zu speichern und wieder zu lesen. Da es sich um verschiedene records handelt die bei verschiedenen Gelegenheiten in verschiedene Dateien gespeichert werden sollen, dachte ich mir ich könnte vielleicht die records parsen, analysieren und die XML automatisch erzeugen. Ich habe wenig lust, das alles im Klartext für jedes record zu schreiben, scheint aber nicht anders zu gehen :(
Klassen möchte ich aus Performancegründen eher ungern nutzen.
Gruß
Hybrid666 - Do 18.12.08 15:43
dann nutze statt records doch einfach zeiger?
also du erzeugst erst einen record:
Delphi-Quelltext
1: 2: 3: 4: 5:
| TMyValue = record Name : String; Value : Integer; Next : @TMyValue; end; |
dann verkettest du die TMyValues einfach.
Dann kannst du eine prozedur schreiben, die die liste durchgeht, dann kannst du den namen rausfinden über .Name und den inhalt auch.
Iss zwar bissle komplizierter, aber so könnte man das, was du vorhast realisiern.
MfG
jaenicke - Do 18.12.08 16:07
Dadurch steigt aber der Speicherverbrauch deutlich an, wenn, dann müsste man die Namen zentral speichern und nur eine ID darauf in den Record einfügen.
@ ist die Adresse der folgenden Variable, was du meinst ist ^.
trc2001 - Do 18.12.08 16:17
Hi,
ich bin mir jetzt nicht 100% sicher, aber der Vorschlag erfordert doch nen fixierten Record!?
Wie gesagt, meine records sehen sehr komplex aus. Die Typen sind in allen records unterschiedlich.
Mit "Name" meinte ich
TMyRecord."Name"
also nicht eine Variable mit dem Namen "Name" im record.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5:
| TMyValue = record a: String; b: Integer; c: whatever; end; |
Mit Name wollte ich jetzt rausfinden, dass die Variablen "a", "b" und "c" in TMyValue existent sind.
Entweder wir reden aneinander vorbei, oder ich habe es noch nicht kapiert.
Gruß
jaenicke - Do 18.12.08 16:24
Er meinte das so, dass du statt einer Variable mit einem Record nur einen Pointer auf den ersten Wert nimmst und diesen Wert so speicherst wie er oben geschrieben hat.
Der Aufwand dürfte aber eher noch größer sein als jeweils eine Speichermethode pro Record zu schreiben nehme ich an.
trc2001 - Do 18.12.08 16:59
Hi,
ich habe es jetzt erstmal für jedes Record einzeln gelöst, wenn noch jemandem eine Idee kommt würde es mich aber trotzdem interessieren.
Danke!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!