将TPanel保存为磁盘上的映像

时间:2014-06-20 04:31:22

标签: delphi firemonkey delphi-xe5 firemonkey-fm2

我的一个表单上有一个 TPanel 组件。这个面板有很多孩子,如TLabel,TImage,TLine,TPanel等。这个面板用于更新计时器。 我想随时捕捉这个面板的截图。 当我只使用TPanel.MakeScreenshot时,它只显示像TImage和TLine这样的孩子。 TLabels丢失了。

是否有任何机构知道如何实现。

我正在使用Delphi XE5和 firemonkey

感谢。

1 个答案:

答案 0 :(得分:0)

在制作组件以捕获TLayout的内容时,我遇到过类似的问题。在测试中,一些组件没有显示在使用TLayout.MakeScreenshot拍摄的屏幕截图中。

这是因为当您在代码中创建TLabel时,当您将其父级添加到TPanel时,它不会自动绘制。它仅在第一次实际显示时绘制。因此,如果您执行此类操作,标签将不会显示:

var
  NewLabel: TLabel;
  Shot: TBitmap;
...
  NewLabel := TLabel.Create;
  NewLabel.Parent := Panel1; // I suppose you are setting the parent like this in your code
  NewLabel.Text := 'some new label';
  Shot := Panel1.MakeScreenshot;

要使标签显示您必须在TPanel画布上进行绘画。我使用ApplyStyleLookup方法完成了它,如:

  ...
  NewLabel.Text := 'some new label';
  NewLabel.ApplyStyleLookup;
  Shot := Panel1.MakeScreenshot; // Now the label will show

您必须为每个标签调用ApplyStyleLookup才能显示它们。

如果将TLabel的AutoSize设置为true并设置文本,则相同。标签的宽度在实际显示在表单上之前不会调整 我没有在FMX源代码中详细查看过,但可能是某个地方的错误,因为它只影响某些组件。

你没有显示你的代码,所以我不确定这是否是同样的问题,但确实听起来像这样。

是的,你可能知道你不能直接从另一个线程更新FMX控件,因为它们不是线程安全的,对吧?你还可以免费从MakeScreenshot返回TBitmap吗?