0

我在 TListBox 有一个表单,我在 onCreate 事件中填充了该表单,我还在其中设置了所选项目。我希望列表框在表单显示时显示所选项目,所以我尝试触发该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`
4

1 回答 1

0

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

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

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

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

于 2021-10-06T11:21:22.907 回答