Autor Beitrag
trc2001
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.12.08 14:24 
Hallo,

ich möchte gerne folgendes tun:

Ich definiere mir ein record:

ausblenden 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---
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: Do 18.12.08 15:43 
dann nutze statt records doch einfach zeiger?

also du erzeugst erst einen record:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
TMyValue = record
  Name : String;
  Value : Integer; //(oder was anderes)
  Next : @TMyValue; // bin mir jetzt nicht sicher ob das der richtige pointersyntax ist, habe nur einmal in delphi mit pointern gearbeitet und das iss schon 2 jahre her :D also einfach ma pointer anschaun.
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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!