Firemonkey использует StylesData для установки свойства объекта массива в стиле

Я пытаюсь установить свойство объекта при заполнении ListBox с ListBoxItems, Объект представляет собой эллипс, добавленный к стилю, используемому ListBox, Строка кода ниже вызывает исключение:

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

В качестве обходного пути я попытался добраться до собственности, получив ellipsestyle объект с ListBoxItem.FindStyleRessource, но функция возвращает nil,

Спасибо!

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:

Первое место, где вы можете получить доступ к стилю объекта - OnApplyStyleLookup событие указанного ListBoxItem. До 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;
Другие вопросы по тегам