Попробуйте так :
procedure TForm1.Process;
Const
N=100;
var
I,Index:Integer;
Item:TListBoxItem;
begin
for I := 1 to N do
begin
Item:=TListBoxItem.Create(ListBox1);
Item.Text:=IntToStr(I);
ListBox1.AddObject(Item);
end;
ListBox1.ApplyStyleLookup; // (создаст ContentLayout)
ListBox1.ScrollToItem(Item);
end;
Меняется с помощью стиля. Например:
procedure TForm2.Button1Click(Sender: TObject);
begin
ComboBox1.ListBox.DefaultItemStyles.ItemStyle := 'ListBoxItemMyStyle' ;
ComboBox1.NeedStyleLookup;
end;
Стандартным способом никак (или я плохо искал)
Получилось не очень, но работает.
(на форме только два ListBox-а)
.........
type
THackListBox = class(TListBox)
public
property VScrollBar;
end;
THackScrollBar = class(TScrollBar)
public
property Track;
end;
procedure TForm1.FormShow(Sender: TObject);
var
i : Integer ;
begin
for i := 0 to 50 do
ListBox1.Items.Add('Item '+ IntToStr(i));
for i := 0 to 50 do
ListBox2.Items.Add('Item '+ IntToStr(i));
ListBox1.OnVScrollChange := ListBoxVScrollChange;
ListBox2.OnVScrollChange := ListBoxVScrollChange;
end;
procedure TForm1.EndScrollListBox(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
ListB : TCustomListBox;
C : TFmxObject;
begin
if Sender is TThumb then
if TThumb(Sender).IsPressed then
begin
ListB := nil;
C := TFmxObject(Sender);
while C <> nil do
begin
C := C.Parent;
if (C <> nil) and (C is TCustomListBox) then
begin
ListB := C as TCustomListBox;
break;
end;
end;
if ListB <> nil then
ShowMessage('End tracking scroll Listbox. Name : '+ ListB.Name);
end;
end;
procedure TForm1.ListBoxVScrollChange(Sender: TObject);
begin
if Sender is TListBox then
if not Assigned(THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp) then
THackScrollBar(THackListBox(Sender).VScrollBar).Track.Thumb.OnMouseUp := EndScrollListBox;
end;