如何在Delphi XE7中使用StylesData在TListBoxItem上使用AnimateFloat - Firemonkey

时间:2014-09-25 15:08:48

标签: delphi firemonkey

我喜欢使用AnimateFloat过程为TListBoxItem设置动画。当我滑动或单击ListBoxItem时,我想将其向右/向左移动,显示其他按钮/信息,这是首先看不见的。

要访问我在样式簿中创建的项目布局样式。在ListBoxItem的StylesData中,我尝试调用方法:StylesData ['rectangle5style.AnimateFloat(''Position.X'', - 150']。但这不起作用。

有谁知道怎么做?

    // To Lookup the clicked ListboxItem
    function FindItemParent(Obj: TFmxObject; ParentClass: TClass): TFmxObject;
    begin
      Result := nil;
      if Assigned(Obj.Parent) then
        if Obj.Parent.ClassType = ParentClass then
          Result := Obj.Parent
        else
          Result := FindItemParent(Obj.Parent, ParentClass);
    end;

    //Create a few Items in a ListBox
    procedure TForm4.Button1Click(Sender: TObject);
    var
      Item : TListBoxItem;
      i: Integer;
    begin
      ListBox1.ItemWidth := ListBox1.Width + 150;
      for i := 0 to 24 do
        begin
          Item := TListBoxItem.Create(nil);
          Item.Locked := false;
          Item.Parent := ListBox1;
          Item.Width  := ListBox1.Width + 150; // Hide buttons on the right
          Item.StyleLookup := 'itemstyle';
          Item.StylesData['rectanglestyle.Width'] := ListBox1.Width + 150;
          Item.StylesData['rectanglestyle.OnClick'] := TValue.From<TNotifyEvent>(DoItemClick);   // set OnClick value
        end;

    end;

    procedure TForm4.DoItemClick(Sender: TObject);
    var
      Item : TListBoxItem;
    begin
      Item := TListBoxItem(FindItemParent(Sender as TFmxObject,TListBoxItem));
      Item.StylesData['rectanglestyle.AnimateFloat(''Position.X'',-150']; // Show buttons on the right
    end;

1 个答案:

答案 0 :(得分:2)

StylesData只能用于访问属性。如果要从样式中调用对象的方法,则需要调用FindStyleResource,传入对象的StyleName并将其作为TFMXObject返回(如果找到)。

procedure TForm4.DoItemClick(Sender: TObject);
var
  Item : TListBoxItem;
  O: TFMXObject;
begin
  Item := TListBoxItem(FindItemParent(Sender as TFmxObject,TListBoxItem));
  O := Item.FindStyleResource('rectanglestyle');
  if Assigned(O) then
    O.AnimateFloat('Position.X',-150]; // Show buttons on the right
end;

BTW组件命名样式的常规约定是从类名中删除T并附加单词样式。对于样式中的对象,StyleName应描述其用途。您使用rectanglestyle意味着您需要TRectangle的默认样式。