Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record dynamisch erzeugen (https://www.delphipraxis.net/114874-record-dynamisch-erzeugen.html)

Alex_ITA01 2. Jun 2008 09:45


Record dynamisch erzeugen
 
Hallo zusammen,
ich möchte eine Art Offline-Viewer von gespeicherten Binär-Dateien programmieren.
Diese Binär-Dateien wurden als Stream mit einer bestimmten Record-Struktur abgespeichert. Diese Struktur kennt mein Offline Viewer ja nicht und ich möchte diese zur Laufzeit "eingebbar" machen (wie, überlege ich mir noch). Wie kann ich jetzt im Viewer diese Struktur dynamisch erzeugen, damit ich die Datei einlesen kann?
Ich hoffe, ihr wisst was ich meine und könnt mir ein Tip geben.

Viele Grüße,
Alex

mkinzler 2. Jun 2008 09:46

Re: Record dynamisch erzeugen
 
Eine Recordstruktur kann man genausowenig wie eine Klassenstruktur dynamisch anlegen.

Alex_ITA01 2. Jun 2008 09:50

Re: Record dynamisch erzeugen
 
ok, habe ich mir gedacht. Wollte nur wenigstens mal nachgefragt haben :-)

SirThornberry 2. Jun 2008 09:55

Re: Record dynamisch erzeugen
 
du könntest das ganze höchstens mit einer Beschreibung kombinieren die du dann zur Laufzeit auswertest.

Hast du Beispielsweise folgenden Record:
Delphi-Quellcode:
TUnknwon = packed record
  wert1: Byte;
  wert2: Byte;
end;
so müsstest du eigentlich erstmal nur wissen das er 2 Byte groß ist um die Daten einzulesen. Wie die 2 Byte zu interpretieren sind ist erstmal egal. Als nächstes kommt dann die Beschreibung welche dir sagt wie die Daten zu interpretieren sind. Diese müsstest du ja auch irgendwo ablegen.

Um das ganze einigermaßen brauchbar umzusetzen bietet sich ein eigenes Object an welches eine Liste von Werten hat.
Jeder Listeneintrag muss dann den Typ beinhalten und den dazugehörigen Wert.

Laplace 2. Jun 2008 10:10

Re: Record dynamisch erzeugen
 
Hi Alex,

vielleicht kannst du mal folgendes probieren:

1.) Erzeug' dir ein dynamisches Byte- (oder Integer-) Array mit der Länge deines Datensatzes (also Anzahl der Felder).
2.) In dieses Array trägst du Index-Werte für die Datentypen, die im Stream vorkommen ein, also z.B. 0= eine 1 Byte-Zahl, 1= eine 2 Byte-Zahl, ... 5= eine Fließkomma 8 Byte-Zahl (Double) ... 21= nullterminierter String ...
3.) Dieses Array kannst du in einer case-Schleife einfach auswerten (sprich einlesen), in Strings umwandeln und als Text ausgeben.

Schönen Tag noch
Laplace

Alex_ITA01 2. Jun 2008 15:42

Re: Record dynamisch erzeugen
 
Danke für die Tips, aber das Problem ist ja, dass die Größe des Datensatzes nicht immer gleich ist. Das heißt, ich habe eine Datei, die besteht aus einem Record mit 15 Byte-Felder. Dann habe ich noch eine Datei, die besteht vom Record aus 1x Double, 1x Byte, 1xWord und wieder 14x Byte. Daher kann ich kein Record vorher erzeugen...
Ich denke mal noch ein bisschen drüber nach.
Gruß,
Alex

himitsu 3. Jun 2008 12:16

Re: Record dynamisch erzeugen
 
du könnte Klasse basteln, welcher du den Speicher und den Aufbau übergibst und dann über dieser dir den Speicher zerlegen läßt.

tomsel 3. Jun 2008 12:42

Re: Record dynamisch erzeugen
 
Zitat:

Das heißt, ich habe eine Datei, die besteht aus einem Record mit 15 Byte-Felder. Dann habe ich noch eine Datei, die besteht vom Record aus 1x Double, 1x Byte, 1xWord und wieder 14x Byte. Daher kann ich kein Record vorher erzeugen...
Versteh das nicht ganz. Was hindert dich daran, ZWEI Records "vorher" zu erzeugen? Die beiden Dateien wirst du doch programmtechnisch voneinander unterscheiden können, oder?

stoxx 3. Jun 2008 13:59

Re: Record dynamisch erzeugen
 
Zitat:

Zitat von Alex_ITA01
Danke für die Tips, aber das Problem ist ja, dass die Größe des Datensatzes nicht immer gleich ist. Das heißt, ich habe eine Datei, die besteht aus einem Record mit 15 Byte-Felder. Dann habe ich noch eine Datei, die besteht vom Record aus 1x Double, 1x Byte, 1xWord und wieder 14x Byte. Daher kann ich kein Record vorher erzeugen...

na Du müsstest mit Pointern arbeiten, Dir irgendwo die Itemsize merken und mit AllocMem und FreeMem Deinen Speicher selber erzeugen.


Delphi-Quellcode:
node :=Ponter(AllocMem(FItemSize));


FreeMem(Pointer(node));


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz