Firemonkey使用StylesData在样式中设置数组对象的属性

时间:2016-02-13 14:11:00

标签: firemonkey firemonkey-style

在使用ListBox填充ListBoxItems时,我尝试设置对象的属性。该对象是添加到ListBox使用的样式的椭圆。下面的代码行引发了一个异常:

ListBoxItem.StylesData['ellipsestyle.fill.Gradient.Points.Points[0].Color'] := newAlphaColor;

作为解决方法,我尝试通过ellipsestyle获取ListBoxItem.FindStyleRessource对象来访问该属性,但该函数返回nil

谢谢!

1 个答案:

答案 0 :(得分:1)

StylesData无法访问'复杂'属性。 你可以做下一个解决方法:

var
  Obj: TObject;
  myListBoxItem: TListBoxItem;
begin
  // create new item
  myListBoxItem:=TListBoxItem.Create(nil);
  ListBox1.AddObject(myListBoxItem);
  myListBoxItem.StyleLookup:='listboxitembottomdetail';

  myListBoxItem.StylesData['ellipsestyle.fill.Kind']:=TValue.From<TBrushKind>(TBrushKind.Gradient);

  // access to GradientPoints collection 
  Obj:=myListBoxItem.StylesData['ellipsestyle.fill.Gradient.Points'].AsObject;
  if not (Obj is TGradientPoints) then
    Exit;

  TGradientPoints(Obj).Points[0].Color:=TAlphaColorRec.Blanchedalmond;
  TGradientPoints(Obj).Points[1].Color:=TAlphaColorRec.Alpha;

关于FindStyleResource

首先,您可以在其中访问样式对象 - 指定ListBoxItem的OnApplyStyleLookup事件。在OnApplyStyleLookup之前(例如 - 在创建Listboxitem之后立即执行),您将无法访问样式。

因此,请将代码移至ListBoxItem.OnApplyStyleLookup并将其更改为:

procedure TForm2.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var
  FMXObj: TFmxObject;
  Ellipse: TEllipse;
begin
  if not (Sender is TFmxObject) then
    Exit;
  FMXObj:=TFMXObject(Sender).FindStyleResource('ellipsestyle');// get object by it`s "StyleName".
  if not (FMXObj is TEllipse) then
    Exit;

  Ellipse:=TEllipse(FMXObj);
  Ellipse.Fill.Kind:=TBrushKind.Gradient;
  Ellipse.Fill.Gradient.Points.Points[0].Color:=TAlphaColorRec.Blueviolet;
  Ellipse.Fill.Gradient.Points.Points[1].Color:=TAlphaColorRec.Greenyellow;
end;

此外,您可以强制加载样式(这是不推荐的方式 - 默认情况下,第一次绘制时加载的对象的样式):

var
  FMXObj: TFmxObject;
  Ellipse: TEllipse;
  myListBoxItem: TListBoxItem;
begin
  myListBoxItem:=TListBoxItem.Create(nil);
  ListBox1.AddObject(myListBoxItem);
  myListBoxItem.StyleLookup:='listboxitembottomdetail';

  // force load style
  myListBoxItem.NeedStyleLookup;
  myListBoxItem.ApplyStyleLookup; // this method also call OnApplyStyleLookup event

  FMXObj:=myListBoxItem.FindStyleResource('ellipsestyle');
  if not (FMXObj is TEllipse) then
    Exit;

  Ellipse:=TEllipse(FMXObj);
  Ellipse.Fill.Kind:=TBrushKind.Gradient;
  Ellipse.Fill.Gradient.Points.Points[0].Color:=TAlphaColorRec.Blanchedalmond;
  Ellipse.Fill.Gradient.Points.Points[1].Color:=TAlphaColorRec.Alpha;