首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TPanel保存为磁盘上的映像

将TPanel保存为磁盘上的映像
EN

Stack Overflow用户
提问于 2014-06-20 04:31:21
回答 1查看 1.1K关注 0票数 0

我有一个 TPanel 组件在我的form.This面板上,它有很多子组件,比如TLabel、TImage、TLine,TPanel etc.This面板是用来在计时器上更新的。我想在任何时候捕捉这个面板的截图。当我只使用TPanel.MakeScreenshot时,它只显示像TImage和TLine这样的孩子。TLabels失踪了。

有没有人知道如何做到这一点。

我正在使用德尔福XE5和火猴

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-06-30 15:17:14

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

这是因为,当您在代码中创建TLabel时,当您将它的父级绘制为TPanel时,不会自动绘制它。它只有在第一次实际显示时才会被绘制。因此,如果您这样做,标签将不会显示:

代码语言:javascript
复制
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方法做的,如下所示:

代码语言:javascript
复制
  ...
  NewLabel.Text := 'some new label';
  NewLabel.ApplyStyleLookup;
  Shot := Panel1.MakeScreenshot; // Now the label will show

您必须为每个标签调用ApplyStyleLookup才能使它们出现。

如果将AutoSize的TLabel设置为true并设置文本,则情况相同。标签的宽度在实际显示在窗体上之前不会调整。

我还没有在FMX源代码中详细查看过这一点,但可能是某个地方的bug,因为它只影响一些组件。

您还没有显示代码,所以我不确定这是否是同一个问题,但听起来确实是这样。

顺便说一句,您可能知道不能直接从另一个线程更新FMX控件,因为它们不是线程安全的,对吗?你还释放了从TBitmap回来的MakeScreenshot?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24319996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档