お世話になります。
FireMonkeyを勉強中なのですが、とても困っていることがあります。
フォーム上にTLayoutを配置し、その中にTRectangleなどを配置しています。※一部動的に配置したりしようと思っています
やりたいことは、上記のTLayout(各オブジェクトを配置した後)の状態をキャプチャし、PNG画像として保存したいのです。
次のコードを書いてみましたが、Layout1.PaintToで「ECanvasExceptionレンダリングを実行できません」という様なメッセージが出てしまいます。
また、このまま処理を継続しますと、Bitmap.Canvas.EndScene;のところで、「オブジェクト ロックが所有されていません」と怒られます。
何かヒントがありましたら、教えていただけませんでしょうか。
環境はDelphi12Enterprise(パッチ未適用)です。どうぞよろしくお願いいたします。
procedure TForm2.BtnCaptureClick(Sender: TObject);
var
Bitmap: TBitmap;
Rect: TRectF;
begin
try
Bitmap := TBitmap.Create;
try
Bitmap.Canvas.BeginScene;
Bitmap.SetSize(Round(Layout1.Width), Round(Layout1.Height));
Bitmap.Clear(TAlphaColorRec.Yellow);
// Layout1を描画
Rect := TRectF.Create(0, 0, Layout1.Width, Layout1.Height);
Layout1.PaintTo(Bitmap.Canvas, Rect);
Bitmap.SaveToFile('capture.png');
finally
// 描画終了
Bitmap.Canvas.EndScene;
end;
finally
Bitmap.Free;
end;
end;
自己レスになります。
次のコードで解決致しました。
procedure TForm2.BtnScreenShotClick(Sender: TObject);
var
Bitmap: TBitMap;
begin
Bitmap := Layout1.MakeScreenshot;
Bitmap.SaveToFile('Sample.png');
end;
解決とのことですがそれだと png拡張子のビットマップファイルになりませんか?(Windowsからそれっぽく表示されます)
VCLならTPngImageに代入が必要ですがFireMonkeyだと自動でやってくれるのかな?
vramさん
透過PNGになっている様に思います。保存したPNGをExcelに貼り付けて確認しました。
vramさん
追伸です。
Firemonkey でTPNGImageは存在しないかも知れません。
※TPNGImageを宣言し、F1(ヘルプ)で、VCLの説明が表示されました
確認ありがとうございますFireMonkeyでは自動なんですね、しかも透過PNGとはうらやましい・・・
編集 削除