Autor Beitrag
Christi
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 21.07.08 17:33 
Hallo DF,

ich möchte einen Record der stark verschachtelt ist und auf jeder Ebene sehr unterhiedliche variablen Typen hat in ein XML dokument überführen.
Damit ich nicht für jede in Klartext benannte Variable mit 4 zeilen Code als Node dem XML dokument inzugefügt werden muss möchte ich die struktur durchsuchen.

hat jeman einen Ansatz wie man das machen kann.

Kann auch eine Komponenten lösung sein. im moment bin ich für jede Idee dankbar.


mfg

Christi
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 21.07.08 17:53 
Hi und :welcome: im Delphi-Forum,

Ich bin kein Experte aber ist eine File of TMyRecord nicht einfacher? :)

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 21.07.08 20:06 
user profile iconHidden hat folgendes geschrieben:
Ich bin kein Experte aber ist eine File of TMyRecord nicht einfacher?

Wenn er noch mehr speichern möchte, dann nicht.

Also...

Ein Record ist als ein Block im Speicher verfügbar. Das heißt, auch direkt untergeordnete Records sind in dieser Reihenfolge zu finden. Das ganze wird jedoch scheitern, wenn du nur Pointer auf die Unterobjekte in den Records gespeichert hast.

Das mal vorneweg. Jetzt zur Umsetzung:

Du gehst ganz einfach den Speicher vom Start des Recors Länge Byte durch, wandelst sie in eine hexadezimale Zeichenfolge um und speicherst diese in der XML-Datei.

Ein bisschen Code...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function BinaryToHexStr(Data: Pointer; Size: Integer) String;;
var i: Integer; Start: Integer; P: PByte; B: Byte;
begin
  Result := '';

  // Position des ersten Bytes ermitteln
  Start := Integer(Data);

  // Alle Bytes "abklappern" und in Rückgabewert schreiben
  for i := 0 to Size-1 do
  begin
    // Pointer des aktuellen Bytes ermitteln
    P := PByte(Start + i);

    // Byte auslesen
    B := P^;

    // Byte in Hex-Form in Result schreiben
    Result := Result + IntToHex(B, 2);
  end;
end;

Vielleicht könnte man noch etwas optimieren, da kenne ich mich nicht so aus :)

Grüße,
Yogu
Christi Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 22.07.08 08:55 
Das ist ja klasse,
Danke für die Antworten.

Bestimmt hätte ich es genauer beschreiben sollen.
Natürlich hat der Record auch ein paar Variablen und Arrays mit Strings und Stringlist, also Variablen die nur als "Pointer" hinterlegt sind. Alles andere wäre auch nicht praktikabel.

Eine eigene Speicher verwaltungskalsse zu erzeugen hatte ich auch schon gedacht.
Den Aufwand diese Struktur dann zu erstellen würde aber IMHO den gleichen Aufwand im Programm erzeugen, wie es fest zu codieren.
Alternativ habe ich überlegt einen Parser zu schreiben, der die verschachtelte Record Struktur einfach aus dem pas file rekonstruiert, darauf aufbauend die struktur durchsuchen könnte.

Allerdings habe ich da noch Zweifel, ob das so einfach geht wie ich mir das überlegt habe.
Ach ja natürlich sind die Strings zum groessten Teil alle für TNT Controls und benutzen UTF8.

Gruss

Christi