Home > Software engineering >  How to get fmx listbox.ScrollToItem to work on form creation or activation
How to get fmx listbox.ScrollToItem to work on form creation or activation

Time:10-08

I have a form with at TListBox that I populate in the onCreate event, where I also set the selected item. I want the List Box to have the selected item in view when the form shows, so I tried firing the ScrollToItem method. This does not work. I also tried putting it in OnShow and OnActivate events, but it still does not work. Is there a way to get this to work? Here is a sample program that illustrates the problem:

`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.`

and the FMX file:

`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`

CodePudding user response:

TListBox has a property ViewportPosition: TPointF that sets the scrollbars. Add the following line after you set ListBox1.ItemIndex:

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

The previous assumes that all items have the same height (TListBox1.ItemHeight set in Object Inspector or in code earlier). Your FMX file doesn't reflect this, so you may want to add it, otherwise the scrolling will not take place.

You might want to set individual height for the items. In that case you must traverse all items up to the one you want to be selected and sum their heights to get the Y term for the ViewportPosition.

  • Related