record型の動的配列をバイナリで書き込みたいのですが、どうしてもよく分かりません。
(RPGのマップデータ用です・・・。↓)
------------------------------
type
MapRec=record
PictureNo: Byte;
...
end;
Map:array of array of MapRec;
------------------------------
よろしくお願いします。
TFileStreamクラスを使って書き出します。
動的に確保したメモリを書き出すだけだと思います。
もし、動的に確保したRecord型に、Stringなど動的に大きさが決まるものがあるのなら、ループで回しながら書き出します。
試したことはないのでわかりませんけど、
TMemoryStreamの配列ってだめでしょうか?
でも、SetLengthのときに、中身がおかしくなったりするかも?
試したことはないのでわからないですけど、
配列の中身が消えるかも知れませんねぇ…。
どうなんでしょうか?VBの配列サイズ変更関数は、
ごていねいに今の中身を消すかどうか聞いてくれますけど。
試せばいいだけですけどね^^;
ああ、その場合、recordからTFileとかに移すには、CopyMemoryとかが使えるかも。
上のは忘れてください…。
Map:array of array of MapRec;
となってますので、2次元配列ですね。
2次元配列は、1次配列がポインタ配列になるはずですので、
1行ずつサイズとデータを書き込みながら
ループで回さないといけないと思います。
読み込むときは、逆にサイズを読み込んで、
配列の長さを確保して、データを読み込むという
手順になります。
下記のようになります。
フィールドに String などのように動的に長さが決まる物が入っている場合は、
その部分は、さらにサイズとデータをそれぞれ書き込む必要があります。
var
FileName: string;
FFile:TFileStream;
Len, i, j: Byte;
begin
FileName := 'Test.dat';
//2次元配列の書き込み
FFile := TFileStream.Create(FileName, fmCreate);
try
Len := Length(Map); //1次配列の長さ
FFile.Write(Len, SizeOf(Len)); //それを書き込む
for i := 0 to Len - 1 do
begin
Len := Length(Map[i]); //i行目の2次配列の長さ
FFile.Write(Len, SizeOf(Len)); //それを書き込む
FFile.Write(Map[i, 0], SizeOf(MapRec) * Len); //i行目の2次配列のデータを書き込む
end;
finally
FFile.Free;
end;
//2次元配列の読み込み
FFile := TFileStream.Create(FileName, fmOpenRead);
try
FFile.Read(Len, SizeOf(Len)); //1次配列の長さを読み込む
SetLength(Map, Len);
for i := 0 to Len - 1 do
begin
FFile.Read(Len, SizeOf(Len));//i行目の2次配列の長さを読み込む
SetLength(Map[i], Len);
FFile.Read(Map[i, 0], SizeOf(MapRec) * Len);//i行目の2次配列のデータを読み込む
end;
finally
FFile.Free;
end;
end;
みなさん、有難うございました。
おかげで、解決できました。
心より感謝いたします。
ツイート | ![]() |