MetaFileをFileStreamで

解決


印刷屋  2007-06-02 20:50:50  No: 26451

過去ログを参考にしてたんですがうまくいかないので質問させてください。

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;


かみづ  2007-06-02 22:07:05  No: 26452

BGMetaFileという変数はTMetafile型ですか?
であればポインタを記録しようとしているわけなので、
常にサイズは4バイトになります。

TMetafile.SaveToStreamメソッドを使えばデータをStreamへ書き出せます。


印刷屋  2007-06-02 22:59:47  No: 26453

SaveToStreamって、単体使用じゃないんですね。
SaveToFileみたいに1file=1Streamかと思ってました。

これはSaveToStreamメソッドを持ってる型全般に言えることなんですか?


印刷屋  2007-06-03 02:19:32  No: 26454

すいません。追記で教えて頂けますか?

LoadFromStreamで、MetaFileが無いときにエラーが起きるので、Emptyプロパティも一緒に記録しておいて読み出し条件にしようとしたんですが、MetaFile.LoadFromFileで読み込んだにもかかわらず、MetaFile.Empty=True;になってしまいます。
他に分岐条件も思い当たらないので何か良い方法はないでしょうか。


ツイキね  2007-06-03 19:25:16  No: 26455

>…MetaFileが無いときにエラーが起きるので…
MetaFileが空なら、Fileを削除しておけばいいんでないの。


印刷屋  2007-06-05 00:57:34  No: 26456

>> ツイキね様
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;


印刷屋  2007-08-06 20:24:48  No: 26457

しばらく放ってましたが、PaletteModifiedというのを見つけ解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加