Delphi. Componente și clase. TListView
Există o modalitate destul de convenabilă de derulare a listelor: dacă utilizatorul mișcă cursorul mouse-ului peste elementele listă cu butonul stâng apăsat, este selectat elementul deasupra căruia este localizat cursorul. Și dacă cursorul este deasupra sau dedesubtul listei, derularea începe. Vom vorbi despre cum să facem asta pentru ListView astăzi.
În primul rând, trebuie să selectați elementele de deasupra cărora se află cursorul mouse-ului (cu butonul din stânga apăsat). Este convenabil să utilizați funcția GetItemAt pentru a găsi elementul utilizând coordonatele cursorului. Pentru a modifica selecția, trebuie să modificați proprietățile selectate și ItemFocused.
Pentru a prinde evenimentele mouse-ului atunci când cursorul părăsește ListView, trebuie să-i spuneți WIndows că mouse-ul este acum "al meu". Pentru aceasta, utilizați funcția SetCapture (pentru a spune că "mouse-ul pe care nu mai am nevoie" este folosit de funcția ReleaseCapture). Deoarece GetItemAt returnează un element gol (nul) dacă cursorul părăsește limitele, lista nu mai poate fi verificată. Variabila d are o valoare pozitivă în cazul în care defilarea are loc în jos și negativ altfel. Modulul d indică câte elemente vor fi derulate simultan. Acest lucru este necesar pentru a schimba viteza derulării (aici viteza de defilare depinde de cât de departe este cursorul din ListView).
Derularea în sine este efectuată în procedura de mutare. Se adaugă numărul elementului selectat d. Dacă numărul nou este în afara intervalului valid, acesta este setat la 0 sau Items.Count - 1. Apoi, verifică: dacă numărul elementului selectat este același în noul număr, nu este necesar să faceți nimic. În caz contrar, trebuie să schimbați valoarea selectată și a itemului Focalizat și, de asemenea, să derulați lista. Pentru acesta din urmă, este convenabil să utilizați procedura MakeVisible. Acesta derulează lista astfel încât elementul specificat să fie proeminent.
Pentru ca lista să se deruleze atunci când mouse-ul este în continuare, trebuie să faceți un cronometru care apelează periodic Mutare. Dacă cursorul este din nou peste ListView sau utilizatorul eliberează butonul stâng al mouse-ului, Timerul este oprit.
var
d: integer = 0;
procedura de mișcare;
var
NewIndex: integer;
începe
cu Form1.ListView1 faceți dacă este asignat (selectat) apoi începeți
NewIndex: = Selected.Index + d;
dacă NewIndex <0
apoi NewIndex: = 0
altfel dacă NewIndex> = Items.Count
apoi NewIndex: = Items.Count - 1;
dacă NewIndex <> Selected.Index începe apoi
Selectat: = Elemente [NewIndex];
ItemFocused: = selectat;
Selected.MakeVisible (true);
se încheie;
se încheie;
se încheie;
procedura TForm1.FormCreate (expeditor: TObject);
var
i: întreg;
li: TListitem;
lc: TListColumn;
începe
Timer1.Interval: = 100;
ListView1.ViewStyle: = vsReport;
lc: = ListView1.Columns.Add;
lc.Caption: = 'Legendă';
lc.AutoSize: = adevărat;
lc: = ListView1.Columns.Add;
lc.Caption: = 'SubItem';
lc.AutoSize: = adevărat;
ListView1.Items.BeginUpdate;
pentru i: = 1 până la 1000 începe
li: = ListView1.Items.Add;
li.Caption: = 'Punctul' + IntToStr (i);
li.SubItems.Add ("SubItem" + IntToStr (i));
se încheie;
ListView1.Items.EndUpdate;
se încheie;
procedura TForm1.ListView1MouseDown (expeditor: TObject; buton: TMouseButton;
Schimbare: TShiftState; X, Y: Integer);
începe
SetCapture (ListView1.Handle);
se încheie;
procedura TForm1.ListView1MouseMove (expeditor: TObject; Shift: TShiftState; X,
Y: Integer);
var
li: TListItem;
începe
dacă începe ssLeft în Shift cu ListView1
li: = GetItemAt (10, Y);
dacă este Atribuit (li), atunci începe
Timer1.Enabled: = false;
Selectat: = li;
ItemFocused: = ListView1.Selected;
incepe altceva
dacă Y> = ListView1.ClientHeight
apoi d: = (Y - ListView1.ClientHeight) div 20 + 1
altfel d: = Y div 20-1;
dacă Timer1.Enabled = false atunci începe
Mută;
Timer1.Enabled: = true;
se încheie;
se încheie;
se încheie;
se încheie;
procedura TForm1.ListView1MouseUp (expeditor: TObject; buton: TMouseButton;
Schimbare: TShiftState; X, Y: Integer);
începe
Timer1.Enabled: = false;
ReleaseCapture;
se încheie;
procedura TForm1.Timer1Timer (expeditor: TObject);
începe
Mută;
se încheie;