我在onCreate事件中填充了一个带有TListBox的表单,其中我还设置了所选项目。我希望列表框在视图中有选中的项目当表单显示时,所以我尝试触发ScrollToItem
方法。这行不通。我也试过把它在OnShow
和OnActivate
事件,但它仍然不工作。有办法让它起作用吗?下面是一个示例程序来说明这个问题:
`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
文件没有反映这一点,所以你可能想要添加它,否则滚动将不会发生。
您可能希望为项目设置单独的高度。在这种情况下,你必须遍历所有项目,直到你想要被选中的项目,并将它们的高度相加,以获得ViewportPosition
的Y
项。