Сохранить TPanel как изображение на диске

У меня есть компонент TPanel на одной из моих форм. На этой панели много дочерних элементов, таких как TLabel, TImage, TLine, TPanel и т. Д. Эта панель используется для обновления по таймеру. Я хочу сделать скриншот этой панели в любое время. Когда я использую только TPanel.MakeScreenshot, он показывает только таких детей, как TImage и TLine. TLabels отсутствуют.

Есть ли у какого-либо органа представление о том, как этого можно достичь.

Я использую Delphi XE5 и FireMonkey.

Благодарю.

1 ответ

Однажды у меня была похожая проблема при создании компонента для захвата содержимого 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 для каждой метки, чтобы они появились.

То же самое, если вы установите для AutoSize TLabel значение true и установите текст. Ширина метки не будет изменяться до того, как она будет отображена в форме.
Я не рассматривал это подробно в исходном коде FMX, но, вероятно, это где-то ошибка, потому что она затрагивает только некоторые компоненты.

Вы не показывали свой код, поэтому я не уверен, что это та же проблема, но точно звучит так.

Кстати, вы, вероятно, знаете, что вы не можете обновить элементы управления FMX напрямую из другого потока, потому что они не являются потоко-безопасными, верно? И вы также бесплатно вернули TBitmap из MakeScreenshot?

Другие вопросы по тегам