Implementarea pe clic pe articol / dublu clic pentru TListView

Controlul TListView al Delphi afișează o listă de elemente din coloane cu anteturi și sub-elemente de coloană, sau vertical sau orizontal, cu pictograme mici sau mari.

La fel ca majoritatea controalelor Delphi, TListView expune OnClick și OnDblClick (OnDoubleClick) evenimente.

Din păcate, dacă trebuie să știți ce articol a fost făcut clic sau a dat dublu clic, nu puteți pur și simplu să gestionați evenimentele OnClick / OnDblClick pentru a obține elementul dat clic.

Evenimentul OnClick (OnDblClick) pentru TListView este lansat de fiecare dată când utilizatorul face clic pe control - adică de fiecare dată când apare „clicul”. undeva în zona clientului a controlului.

Utilizatorul poate face clic în vizualizarea listei, DAR „lipsește” oricare dintre elemente. Mai mult, din moment ce vizualizarea listei își poate schimba afișarea în funcție de proprietatea ViewStyle, utilizatorul ar fi putut face clic pe un articol, pe o legendă de articol, pe o pictogramă a articolului, „nicăieri”, pe o pictogramă de stare a unui articol, etc..

Notă: proprietatea ViewStyle determină modul în care elementele sunt afișate în vizualizarea listei: elementele pot fi afișate ca un set de icoane mobile sau ca coloane de text.

Element Faceți clic dublu și ListView.On element dublu clic

Pentru a putea localiza elementul cu clic (dacă există unul) atunci când evenimentul OnClick pentru vizualizarea listei este activat, trebuie să determinați ce elemente ale vizualizării listei se află sub punctul specificat de parametrii X și Y - adică locația mouse-ului în momentul „faceți clic”.

TListiew's GetHitTestInfoAt funcția returnează informații despre punctul specificat din zona clientului vizualizării listei.

Pentru a vă asigura că elementul a fost făcut clic (sau dublu clic), trebuie să apelați la GetHitTestInfoAt și să reacționați numai dacă evenimentul de clic a avut loc pe un element real.

Iată un exemplu de implementare a evenimentului OnDblClick al ListView1:

 // gestionează pe Double Click pe ListView1procedură TForm.ListView1DblClick(Expeditor: TObject);
var
  hts: THitTests;
  ht: THitTest;
  sht: şir;
  ListViewCursosPos: TPoint;
  selectat Item: TListItem;
începe
  // poziția cursorului mouse-ului în legătură cu ListView
  ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
  // faceți dublu clic unde?
  hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
  // Testul de succes „debug”
  Subtitrare: = ";
  pentru ht în hts do
  începe
    sht: = GetEnumName (TypeInfo (THitTest), Integer (ht));
    Legenda: = Format ('% s% s |', [Legenda, sht]);
  Sfârșit;
  // localizați elementul cu dublu clic
  dacă hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] apoi
  începe
    selectedItem: = ListView1.Selected;
    // faceți ceva cu elementul dublu clic!
    Subtitrare: = Format ('DblClcked:% s', [selectItem.Caption]);
  Sfârșit;
Sfârșit;

În manipulatorul de evenimente OnDblClick (sau OnClick), citiți funcția GetHitTestInfoAt oferindu-i locația mouse-ului „în interiorul” controlului. Pentru a obține locația mouse-ului în legătură cu vizualizarea listei, funcția ScreenToClient este utilizată pentru a converti un punct (X și Y mouse) în coordonatele ecranului în coordonate locale sau client..

GetHitTestInfoAt returnează o valoare a THitTests tip. The THitTests este un set de THitTest valori enumerate.

Valorile de enumerare THitTest, cu descrierea lor, sunt:

  • htAbove - deasupra zonei clientului.
  • htBelow - sub zona clientului.
  • htNowhere - în interiorul controlului, dar nu pe un articol.
  • htOnItem - pe un articol, textul sau harta sa de biți.
  • htOnButton - pe un buton.
  • htOnIcon - pe o icoană.
  • htOnIndent - pe zona indentată a unui articol.
  • htOnLabel - pe o etichetă.
  • htOnRight - în partea dreaptă a unui articol.
  • htOnStateIcon - pe o pictogramă de stat sau pe o hartă de bit asociate cu un element.
  • htToLeft - în stânga zonei clientului.
  • htToRight - în dreapta zonei clientului.

Dacă rezultatul apelului către GetHitTestInfoAt este un subset (Delphi setează!) Din [htOnIcon, htOnItem, htOnLabel, htOnStateIcon], puteți fi sigur că utilizatorul a făcut clic pe element (sau pe pictograma / pictograma sa de stat).