FireMonkeyで画面項目をキャプチャ

解決


Moe  2025-03-31 21:48:29  No: 151913  IP: [192.*.*.*]

お世話になります。
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;

編集    削除
Moe  2025-04-01 08:24:02  No: 151914  IP: [192.*.*.*]

自己レスになります。
次のコードで解決致しました。
procedure TForm2.BtnScreenShotClick(Sender: TObject);
var
  Bitmap: TBitMap;
begin
  Bitmap := Layout1.MakeScreenshot;
  Bitmap.SaveToFile('Sample.png');
end;

編集    削除
vram  2025-04-01 09:59:53  No: 151915  IP: [192.*.*.*]

解決とのことですがそれだと png拡張子のビットマップファイルになりませんか?(Windowsからそれっぽく表示されます)
VCLならTPngImageに代入が必要ですがFireMonkeyだと自動でやってくれるのかな?

編集    削除
Moe  2025-04-01 10:05:21  No: 151916  IP: [192.*.*.*]

vramさん
透過PNGになっている様に思います。保存したPNGをExcelに貼り付けて確認しました。

編集    削除
Moe  2025-04-01 10:16:05  No: 151917  IP: [192.*.*.*]

vramさん
追伸です。
Firemonkey でTPNGImageは存在しないかも知れません。
※TPNGImageを宣言し、F1(ヘルプ)で、VCLの説明が表示されました

編集    削除
vram  2025-04-01 10:21:01  No: 151918  IP: [192.*.*.*]

確認ありがとうございますFireMonkeyでは自動なんですね、しかも透過PNGとはうらやましい・・・

編集    削除