| Autor |
Beitrag |
trc2001
Hält's aus hier
Beiträge: 4
|
Verfasst: Do 18.12.08 14:24
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 18.12.08 14:37
Hallo und  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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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!
|
|