У меня была похожая проблема однажды при создании компонента для захвата содержимого 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?
person
VGeorgiev
schedule
30.06.2014