![]() |
Warum keine dynamischen Arrays in Records möglich
Hallo Community,
ich habe 2 Records:
Delphi-Quellcode:
Weiter im Code erstelle ich eine Variable:
TInhalt = Record
Kanal : String[10]; Effektname : String[255]; Position : String[255]; Ausrichtung : String[255]; end; TDatei = Record Name : String[255]; Copyright : String[255]; Autor : String[255]; Inhalt : Array of TInhalt; end;
Delphi-Quellcode:
Hier sagt der Compiler mir allerdings, dass er für den Typ TDatei eine Finalisation benötigt. Wenn ich das Array statisch mache, geht alles (Wie auch bei den Strings), ich bnötige allerdings ein Dynamisches, weil ich erst beim Erstellen der Datei ermittle, wie groß das Array sein muss!
Datei : File of TDatei;
Weiß einer Rat oder eine andere Lösung für mein Problem? Gruß, Chris |
Re: Warum keine dynamischen Arrays in Records möglich
Nimm eine untypisierte Datei oder einen Filestream. Das macht allerdings sowohl das Speichern als auch das Laden komplizierter.
|
Re: Warum keine dynamischen Arrays in Records möglich
Hi,
vergiss deinen Ansatz, mit file of ... solltest du nur statische Strukturen verwenden. Ansonsten könntest du es per Hand schreiben ![]() Mfg FAlter |
Re: Warum keine dynamischen Arrays in Records möglich
mit "file of Type" legt man fest das der Inhalt einer Datei komplett mit Type gefüllt ist. Dabei ist Type immer gleich groß. Man kann also fix mal zum 5ten Eintrag in der Datei gehen weil man einfach die Position ändert. Hast du jedoch ein dynamisches Array oder dergleichen, so ist das erstmal nicht mehr als ein Pointer der auf dynamich reservierten Speicher zeigt. Delphi ist da wohl schon so schlau um zu wissen das es keinen Sinn macht diesen Pointer zu speichern weil beim nächsten Programmstart der wo ganz anders hinzeigen könnte. Und um die Daten direkt in die Datei zu schreiben ist wohl der Ansatz der konstanten Datengröße nicht gegeben.
Das sind zumindest meine Vermutungen warum das, was du vor hast nicht so zu machen geht. :) |
Re: Warum keine dynamischen Arrays in Records möglich
Ja, eine typisierte Datei hat eine feste Recordbreite, was ja mit einem dynamischen array nicht gegeben ist.
Würde den zweiten Record erweitern:
Delphi-Quellcode:
Schreiben ist ja sowieso kein Problem und mit dem Counter sollte dann auch lesen mit einem TFileStream problemlos möglich sein.
TDatei = Record
Name : String[255]; Copyright : String[255]; Autor : String[255]; InhaltCount : Integer; Inhalt : Array of TInhalt; end; Also vorm Schreiben InhaltCount mit der tatsächlichen Zahl füllen und die Record-Felder einzeln speichern (TInhalt in einer Schleife length(x)) Beim Lesen erst den "Header" bis bis InhaltCount einlesen und ensprechend die Anzahl der TInhalt Arrays. |
Re: Warum keine dynamischen Arrays in Records möglich
Ok, ich werde mir das mit dem TFileStream mal anschaun.
Dank an alle! |
Re: Warum keine dynamischen Arrays in Records möglich
Hier mal eine Basis zum erweitern (ohne Try...finally und with * do) zum besseren Verständnis:
Delphi-Quellcode:
FileStream.Free schießt danach die Datei, aber das machst ja im finally Block. Lesen im Prinzip umgekehrt, also der High-Wert der for Schleife durch Lesen des "Header" ermitteln.
// Record mit Inhalt füllen
[...] DateiRec.InhaltCount := Length(DateiRec.Inhalt); // Datei anlegen/öffnen -> Varianten zum Öffnen siehe Hilfe FileStream := TFileStream.Create('F:\Worktemp\MyFile.dat',fmCreate or fmShareExclusive); // Header schreiben FileStream.Write(DateiRec.Name,SizeOf(DateiRec.Name)); FileStream.Write(DateiRec.Copyright,SizeOf(DateiRec.Copyright)); FileStream.Write(DateiRec.Autor,SizeOf(DateiRec.Autor)); FileStream.Write(DateiRec.InhaltCount,SizeOf(DateiRec.InhaltCount)); // Body schreiben for i := 1 to DateiRec.InhaltCount {Length(DateiRec.Inhalt)} do FileStream.Write(DateiRec.Inhalt[i-1], SizeOf(TInhalt)); PS: wenn ich das so sehe, evtl .Name in .AutorName ändern. |
Re: Warum keine dynamischen Arrays in Records möglich
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mir gerade nicht alles durchgelesen, bin faul um die Uhrzeit^^
Hab vor kurzem für jemanden nen kleines telefonbuch gemacht, wo arrays und so drin vorkommen, vllt ist ja irgendwas brauchbares für dich da drinne... habs mal angehangen!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz