![]() |
Speichern 2-dim. dynamischer ShortString-Arrays als Stream
Hallo, Delphi-Praktiker !
Ich habe mir folgendes dynamische ShortString-Array definiert:
Delphi-Quellcode:
Im Laufe des Programms dimensioniere ich es:
var
Feld: Array of Array of String[15];
Delphi-Quellcode:
Dieses Array möchte ich dann mit folgender Anweisung in einem Stream speichern:
setLength(Feld, xLaenge, yLaenge);
Delphi-Quellcode:
Jetzt passiert aber folgendes:
var
Datei: TFileStream; s: String[15]; begin Datei:= TFileStream.Create(<Dateiname>, fmOpenWrite); Datei.WriteBuffer(Feld[0, 0], xLaenge * yLaenge * SizeOf(s)); end; Ich speichere mein Feld mit folgenden Einstellungen ab:
Delphi-Quellcode:
Jetzt steht in der Stream-Datei (im Editor betrachtet) folgendes drin:
xLaenge:= 6;
yLaenge:= 2; Feld:= (('1', '2'), ('3', '4'), ('5', '6'), ('7', '8'), ('9', '10'), ('11', '12'));
Delphi-Quellcode:
Hier erkennt man ja, dass jedes Element meines Arrays 1+15 Byte lang ist, ok. Aber nach dem zweiten Eintrag stehen 16 Byte Unsinn, dann kommen '3' und '4' und wieder 16 Byte Unsinn usw. Also immer nach zwei Elementen 16 Byte, von denen ich nicht weiß, woher sie kommen. Dadurch fehlen mir natürlich die letzten vier Elemente!
1 2 ÀŒ® 3 4 ÀŒ® 5 6 ÀŒ® 7 8 ÀŒ®
Weiß jemand, woher das kommt? Völlig abstrus wird es, wenn ich die Länge des ShortStrings auf sieben Zeichen setze. Dann sind die ersten zwei Elemente noch in Ordnung, der Rest hat aber nichts mehr mit dem Soll zu tun. Frage: Wie speichert man ein mehrdimensionales dynamisches ShortString-Array sauber ab? Vielen Dank KPB |
Re: Speichern 2-dim. dynamischer ShortString-Arrays als Stre
dynamische Arrays sind Zeiger ... du mußt also die Strings einzeln speichern
(wobei man die Daten der tierfsten Arays auch zusammen Speichern könnte) |
Re: Speichern 2-dim. dynamischer ShortString-Arrays als Stre
Hallo,
Du musst zuvor aber irgendwie Dimensionen abspeichern, eventuell auch die Stringlänge, falls diese variabel ist. Denn 10x5 String[x] belegen den gleichen Platz wie 5x10 String[x]. Also so ähnlich:
Delphi-Quellcode:
Gruß Horst
type
TFeldGroessen = record Zeilen, Spalte, StringSize : integer; //.. end; var Datei: TFileStream; FeldGroessen : TFeldGroessen; i: integer; s: String[15]; begin with FeldGroessen do begin Zeilen := high(Feld)-Low(Feld)+1; Spalten := high(Feld[0])-Low(Feld[0])+1; stringSize := SizeOf(s);//Obacht -> String[StringSize-1] end; Datei:= TFileStream.Create(<Dateiname>, fmOpenWrite); Datei.WriteBuffer(FeldGroessen,SizeOf(FeldGroessen)); //Alle Zeilen nacheinander abspeichern -> Daten des tiefsten array sind die Spalten For i := 0 to FeldGroessen.Zeilen-1 do Datei.WriteBuffer(Feld[i], SpaltenZahl* SizeOf(s)); .... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 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