W załączniku masz program testowy; W nim masz algorytm do przesuwania suwaka i tyle itemów, ile chcesz pokazać; Tak naprawdę to nie jest przesuwanie suwaka, ale ustawianie właściwości ListBox.TopIndex
w specjalny sposób tak, by wyglądało na przesuwanie; Masz w nim kilka warunków, w których jest sprawdzany ItemIndex
oraz obliczane kilka rzeczy po to, by prawidłowo ocenić ilość itemów do pokazania;
Tutaj wklejam kod samego zdarzenia OnMouseDown
, zaś w załączniku masz program, którym możesz testować napisany przeze mnie algorytm:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const
{ LICZBA ITEMÓW DO POKAZANIA POD ZAZNACZONYM ITEMEM }
iShowCount = 5;
var
iIndex,
iTop,
iBottom,
iCount,
iShowCount,
iPerScreen: Integer;
begin
iIndex := ListBox1.ItemAtPos(Point(X, Y), True);
case iIndex of
-1: ListBox1.ItemIndex := -1;
else
ListBox1.ItemIndex := iIndex;
ListBox1.Selected[iIndex] := True;
{ INDEKS PIERWSZEGO WIDOCZNEGO ITEMA NA LIŚCIE }
iTop := ListBox1.TopIndex;
{ LICZBA ITEMÓW MIESZCZĄCYCH SIĘ W KOMPONENCIE }
iPerScreen := ListBox1.Height div ListBox1.ItemHeight;
{ LICZBA WSZYSTKICH ITEMÓW }
iCount := ListBox1.Items.Count;
{ INDEKS OSTATNIEGO WIDOCZNEGO ITEMA NA LIŚCIE }
if iCount - iPerScreen > 0 then
iBottom := iTop + iPerScreen - 1
else
iBottom := iCount - 1;
{ JEŻELI ITEMÓW JEST WIĘCEJ NIŻ POMIEŚCI KOMPONENT }
if iCount > iPerScreen then
{ JEŻELI SUWAK NIE JEST NA SAMYM DOLE }
if iBottom < iCount - 1 then
{ JEŻELI ITEMÓW POD INDEKSEM JEST MNIEJ NIŻ TYCH, KTÓRE CHCEMY POKAZAĆ }
if iBottom - iIndex < iShowCount then
if iCount - 1 - iIndex < 5 then
{ JEŻELI ITEMÓW POD INDEKSEM JEST MNIEJ, NIŻ TYCH KTÓRE CHCEMY POKAZAĆ }
{ PIERWSZY_WIDOCZNY := PIERWSZY_WIDOCZNY + ILOŚĆ_WSZYSTKICH - 1 - OSTATNI_WIDOCZNY }
ListBox1.TopIndex := ListBox1.TopIndex + iCount - 1 - iBottom
else
{ JEŻELI ITEMÓW JEST WIĘCEJ NIŻ TYCH, KTÓRE CHCEMY POKAZAĆ }
{ PIERWSZY_WIDOCZNY := PIERWSZY_WIDOCZNY + (ILOŚĆ_DO_POKAZANIA - (OSTATNI_WIDOCZNY - INDEKS)) }
ListBox1.TopIndex := ListBox1.TopIndex + (iShowCount - (iBottom - iIndex));
end;
end;
Procedura działa w 100% więc polecam sprawdzić jedynie zasadę działania; Można zamiast modyfikacji właściwości TopIndex
posłużyć się metodą ListBox.ScrollBy()
; Według uznania;
Pozdrawiam;