過去ログを参考にしてたんですがうまくいかないので質問させてください。
TMetafileにEMFとかWMFを読み込んで、その後他の変数とかも混ぜてFileStreamにしたいと思ってます。で、下記のようにしてみたんですが、上手く書き込めません。
//データの書き出し
procedure SaveStream;
var
F:TFileStream;
L:Byte;
begin
//数値の代入
//ストリーム出力
F := TFileStream.Create(frmMain.dlgSave.FileName,fmCreate);
try
F.Write(PaperSizeX,SizeOf(Integer));//その他の変数
F.Write(PaperSizeY,SizeOf(Integer));//その他の変数
L := SizeOf(BGMetaFile);//4が返ってくる
F.Write(L,SizeOf(L));//サイズ書き込み
F.Write(BGMetaFile,L);//メタファイルデータ書き込み
finally
F.Free;
end;
end;
BGMetaFileという変数はTMetafile型ですか?
であればポインタを記録しようとしているわけなので、
常にサイズは4バイトになります。
TMetafile.SaveToStreamメソッドを使えばデータをStreamへ書き出せます。
SaveToStreamって、単体使用じゃないんですね。
SaveToFileみたいに1file=1Streamかと思ってました。
これはSaveToStreamメソッドを持ってる型全般に言えることなんですか?
すいません。追記で教えて頂けますか?
LoadFromStreamで、MetaFileが無いときにエラーが起きるので、Emptyプロパティも一緒に記録しておいて読み出し条件にしようとしたんですが、MetaFile.LoadFromFileで読み込んだにもかかわらず、MetaFile.Empty=True;になってしまいます。
他に分岐条件も思い当たらないので何か良い方法はないでしょうか。
>…MetaFileが無いときにエラーが起きるので…
MetaFileが空なら、Fileを削除しておけばいいんでないの。
>> ツイキね様
Fileを削除するとはどういう意味でしょうか?
procedure LoadStream;
var
F:TFileStream;
begin
F := TFileStream.Create(frmMain.dlgOpen.FileName,fmOpenRead);
//
try
//変数内取り込み
F.Read(PaperSizeX,SizeOf(Integer));
F.Read(PaperSizeY,SizeOf(Integer));
BGMetaFile.LoadFromStream(F);//メタファイルが空のデータを読むとエラー
//
F.Free;
except
ShowMessage('読み込みに失敗しました。');
end;
しばらく放ってましたが、PaletteModifiedというのを見つけ解決しました。
ツイート | ![]() |