如何让 fmx listbox.ScrollToItem 处理表单创建或激活

How to get fmx listbox.ScrollToItem to work on form creation or activation

我在 onCreate 事件中填充了一个带有 at TListBox 的表单,我还在其中设置了所选项目。 我希望列表框在显示表单时在视图中显示所选项目,因此我尝试触发 ScrollToItem 方法。这是行不通的。我也试过把它放在 OnShowOnActivate 事件中,但它仍然不起作用。有没有办法让它工作? 这是一个说明问题的示例程序:

`type
  TForm5 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.fmx}

procedure TForm5.FormCreate(Sender: TObject);
var
  i: Integer;
  lbi: TListBoxItem;
begin
 for i := 1 to 50 do
 begin
    lbi := TListBoxItem.Create(ListBox1);
    lbi.Text := 'item ' + inttostr(i);
    ListBox1.AddObject( lbi );
 end;
  ListBox1.itemindex := ListBox1.items.indexof('item 48');
  ListBox1.ScrollToItem(ListBox1.Selected);
end;

end.`

和 FMX 文件:

`object Form5: TForm5
  Left = 0
  Top = 0
  Caption = 'Form5'
  ClientHeight = 480
  ClientWidth = 640
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  OnCreate = FormCreate
  DesignerMasterStyle = 0
  object ListBox1: TListBox
    Position.X = 224.000000000000000000
    Position.Y = 144.000000000000000000
    TabOrder = 1
    DisableFocusEffect = True
    DefaultItemStyles.ItemStyle = ''
    DefaultItemStyles.GroupHeaderStyle = ''
    DefaultItemStyles.GroupFooterStyle = ''
    Viewport.Width = 196.000000000000000000
    Viewport.Height = 196.000000000000000000
  end
end`

TListBox 有一个 属性 ViewportPosition: TPointF 设置滚动条。设置 ListBox1.ItemIndex 后添加以下行:

ListBox1.ViewportPosition := PointF(0.0, ListBox1.itemindex * ListBox1.ItemHeight);

前面假设所有项目都具有相同的高度(TListBox1.ItemHeight 在对象检查器或之前的代码中设置)。您的 FMX 文件没有反映这一点,因此您可能需要添加它,否则滚动将不会发生。

您可能想要为项目设置单独的高度。在这种情况下,您必须遍历所有项目,直到您要选择的项目,然后将它们的高度相加以获得 ViewportPositionY 项。