如何让 fmx listbox.ScrollToItem 处理表单创建或激活
How to get fmx listbox.ScrollToItem to work on form creation or activation
我在 onCreate 事件中填充了一个带有 at 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
项。
我在 onCreate 事件中填充了一个带有 at 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
项。