Scrolling & scroll bars
Pixel-smooth or cell-snapping, continuous or release-only redraws, programmatic scroll-to, custom-styled or external scroll bars.
Overview
Scrolling is configured through three top-level grid properties — ScrollMode, ScrollUpdate, and CustomScrollBars — plus a handful of API methods for programmatic control. The defaults match Excel: smooth pixel scrolling with continuous redraw and OS-native scroll bars.
Scroll mode
uses
FMX.TMSFNCDataGrid;
procedure TForm1.SetScrollMode;
begin
Grid.ScrollMode := gsmCellScrolling;
end;
| Value | Effect |
|---|---|
gsmPixelScrolling |
Smooth pixel-by-pixel scrolling (default). |
gsmCellScrolling |
Snaps so the top-left visible cell is always fully aligned. |
Pick gsmCellScrolling when fractional row/column visibility looks odd — for example a grid that imitates a paper form.
Scroll update strategy
uses
FMX.TMSFNCDataGrid;
procedure TForm1.SetScrollUpdate;
begin
Grid.ScrollUpdate := gsuOnce;
end;
| Value | Effect |
|---|---|
gsuContinuous |
Redraws while the user drags the scroll thumb (default). |
gsuOnce |
Redraws only when the thumb is released. |
Use gsuOnce on very large grids where continuous repaint costs become noticeable.
Programmatic scrolling
uses
FMX.TMSFNCDataGrid;
procedure TForm1.ScrollProgrammatically;
begin
Grid.Scroll(0, 500); // pixel offset (h, v)
Grid.GoToCell(MakeCell(3, 20)); // navigate to a specific cell
end;
procedure TForm1.ReadScrollPosition;
var
H, V: Single;
begin
H := Grid.GetHScrollValue;
V := Grid.GetVScrollValue;
end;
procedure TForm1.RebuildKeepingScroll;
begin
Grid.Root.SaveScrollPosition;
Grid.LoadFromCSVData('data.csv');
Grid.Root.RestoreScrollPosition;
end;
Scroll events
uses
System.SysUtils, FMX.TMSFNCDataGrid;
procedure TForm1.GridHScroll(Sender: TObject; APosition: Single);
begin
StatusBar1.SimpleText := Format('H-scroll: %.0f', [APosition]);
end;
procedure TForm1.GridVScroll(Sender: TObject; APosition: Single);
begin
StatusBar1.SimpleText := Format('V-scroll: %.0f', [APosition]);
end;
Assign via OnHScroll and OnVScroll.
Custom scroll bars
Replace the OS scroll bars with the grid's own styled scroll bars (TTMSFNCScrollBar) for a consistent look across platforms:
uses
FMX.TMSFNCScrollBar, FMX.TMSFNCDataGrid;
procedure TForm1.ConfigureCustomScrollBars;
var
HSB, VSB: TTMSFNCScrollBar;
begin
Grid.CustomScrollBars := True;
// Access them directly
HSB := Grid.CustomHorizontalScrollBar;
VSB := Grid.CustomVerticalScrollBar;
// Fill the full edge (touch the corners) instead of leaving a gap
Grid.StretchScrollBars := True;
// Hide a scroll bar without disabling scroll
Grid.HorizontalScrollBarVisible := False;
Grid.VerticalScrollBarVisible := True;
end;
External scroll bars
For layouts where the scroll bars need to live outside the grid control (e.g. in a separate panel), implement ITMSFNCDataGridExternalScrollBar on any control and assign it:
uses
FMX.TMSFNCDataGrid;
// MyVerticalScrollBarAdapter / MyHorizontalScrollBarAdapter are controls that
// implement ITMSFNCDataGridExternalScrollBar.
procedure TForm1.AssignExternalScrollBars;
begin
Grid.ExternalVerticalScrollBar := MyVerticalScrollBarAdapter;
Grid.ExternalHorizontalScrollBar := MyHorizontalScrollBarAdapter;
end;
The interface requires: Value, Min, Max, PageSize, SmallChange, LargeChange, Visible, and OnChange. The grid drives all properties automatically; the implementation forwards them to the underlying scroll control.
Mouse-wheel scrolling
Grid.Options.Mouse controls wheel behaviour:
uses
FMX.TMSFNCDataGrid;
procedure TForm1.ConfigureWheelScrolling;
begin
Grid.Options.Mouse.WheelScrollSize := 3; // rows per tick
Grid.Options.Mouse.WheelScrollKeepSelection := True; // don't move cursor on scroll
end;
Wheel over a nested grid
When the pointer is over a subgrid — a detail grid in a master-detail layout, for example — the wheel scrolls that subgrid. If the subgrid is short enough that it needs no scrolling, the parent grid handles the wheel instead, so the outer list keeps moving rather than the gesture being swallowed by a detail panel that has nowhere to go.
Touch scrolling
uses
FMX.TMSFNCDataGrid;
procedure TForm1.ConfigureTouchScrolling;
begin
Grid.Options.Mouse.TouchScrolling := True; // enable swipe scroll
Grid.Options.Mouse.TouchScrollingSensitivity := 5; // pixels before scroll starts
end;
Auto-scroll while dragging
When the user drags a selection (or a row/column) past the edge of the visible area, the grid auto-scrolls:
uses
FMX.TMSFNCDataGrid;
procedure TForm1.ConfigureAutoScroll;
begin
Grid.Options.Mouse.AutoScrolling := True;
Grid.Options.Mouse.AutoScrollingInterval := 50; // ms per tick
Grid.Options.Mouse.AutoScrollingSpeed := 2; // rows/cols per tick
end;
Related API
Grid.ScrollMode,Grid.ScrollUpdateGrid.Scroll(H, V),Grid.GoToCell(Cell)Grid.GetHScrollValue/GetVScrollValueGrid.Root.SaveScrollPosition/RestoreScrollPositionOnHScroll,OnVScrollGrid.CustomScrollBars,StretchScrollBarsGrid.HorizontalScrollBarVisible,Grid.VerticalScrollBarVisibleGrid.CustomHorizontalScrollBar,Grid.CustomVerticalScrollBarGrid.ExternalHorizontalScrollBar,Grid.ExternalVerticalScrollBarGrid.Options.Mouse.WheelScrollSize,WheelScrollKeepSelectionGrid.Options.Mouse.TouchScrolling,TouchScrollingSensitivityGrid.Options.Mouse.AutoScrolling,AutoScrollingInterval,AutoScrollingSpeed
See also
- Large datasets —
gsuOnceand other patterns for big grids. - Keyboard & mouse — page-up/page-down navigation also drives scrolling.
- Paging — paging is an alternative to long-scroll datasets.