Implementeren op itemklik / dubbelklik voor TListView

Het TListView-besturingselement van Delphi geeft een lijst met items weer in kolommen met kolomkoppen en subitems, of verticaal of horizontaal, met kleine of grote pictogrammen.

Net als de meeste Delphi-bedieningselementen geeft de TListView de Bij klikken en OnDblClick (OnDoubleClick) -gebeurtenissen.

Helaas, als u wilt weten op welk item is geklikt of dubbelklikt, kunt u de OnClick / OnDblClick-evenementen niet eenvoudig afhandelen om het aangeklikte item te krijgen.

De OnClick-gebeurtenis (OnDblClick) voor de TListView wordt geactiveerd wanneer de gebruiker op het besturingselement klikt, dat wil zeggen wanneer de "klik" plaatsvindt ergens in het clientgebied van de besturing.

De gebruiker kan in de lijstweergave klikken, MAAR elk item "missen". Bovendien, omdat de lijstweergave de weergave kan veranderen afhankelijk van de ViewStyle-eigenschap, heeft de gebruiker mogelijk op een item, op een itemtitel, op een itempictogram, "nergens", op een itemstatuspictogram, enz. Geklikt.

Opmerking: de ViewStyle-eigenschap bepaalt hoe items in de lijstweergave worden weergegeven: de items kunnen worden weergegeven als een set verplaatsbare pictogrammen of als tekstkolommen.

ListView.On-item Klik & ListView.On-item Dubbelklik

Om het aangeklikte item (indien aanwezig) te kunnen vinden wanneer de OnClick-gebeurtenis voor de lijstweergave wordt geactiveerd, moet u bepalen welke elementen van de lijstweergave onder het punt liggen dat is opgegeven door de X- en Y-parameters - dat is de locatie van de muis op het moment van "klik".

De TListiew's GetHitTestInfoAt functie retourneert informatie over het opgegeven punt in het clientgebied van de lijstweergave.

Om er zeker van te zijn dat op het item is geklikt (of dubbel geklikt), moet u GetHitTestInfoAt aanroepen en alleen reageren als de click-gebeurtenis op een daadwerkelijk item plaatsvond.

Hier is een voorbeeldimplementatie van de OnDblClick-gebeurtenis van ListView1:

 // verwerkt ListView1's bij dubbelklikprocedure TForm.ListView1DblClick(Afzender: TObject);
var
  hts: THitTests;
  ht: THitTest;
  sht: draad;
  ListViewCursosPos: TPoint;
  selectedItem: TListItem;
beginnen
  // positie van de muiscursor gerelateerd aan ListView
  ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
  // dubbelklik waar?
  hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
  // "debug" hit-test
  Bijschrift: = ";
  voor ht in hts Doen
  beginnen
    sht: = GetEnumName (TypeInfo (THitTest), Geheel getal (ht));
    Bijschrift: = Formaat ('% s% s |', [Caption, sht]);
  einde;
  // zoek het dubbelklik-item
  als hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] vervolgens
  beginnen
    selectedItem: = ListView1.Selected;
    // doe iets met het dubbelklik-item!
    Bijschrift: = Formaat ('DblClcked:% s', [selectedItem.Caption]);
  einde;
einde;

Lees in de gebeurtenishandler OnDblClick (of OnClick) de functie GetHitTestInfoAt door deze de locatie van de muis "in" het besturingselement te geven. Om de locatie van de muis met betrekking tot de lijstweergave te verkrijgen, wordt de functie ScreenToClient gebruikt om een ​​punt (muis X en Y) in schermcoördinaten om te zetten in lokale coördinaten of clientgebieden.

De GetHitTestInfoAt retourneert een waarde van THitTests type. De THitTests is een set van THitTest opgesomde waarden.

De THitTest-opsommingswaarden, met hun beschrijving, zijn:

  • htAbove - boven het cliëntgebied.
  • htBelow - onder het klantgebied.
  • htNowhere - in het besturingselement, maar niet op een item.
  • htOnItem - op een item, de tekst of de bitmap.
  • htOnButton - op een knop.
  • htOnIcon - op een pictogram.
  • htOnIndent - op het ingesprongen gebied van een item.
  • htOnLabel - op een etiket.
  • htOnRight - aan de rechterkant van een item.
  • htOnStateIcon - op een statuspictogram of bitmap die aan een item is gekoppeld.
  • htToLeft - links van het clientgebied.
  • htToRight - rechts van het clientgebied.

Als het resultaat van de aanroep van GetHitTestInfoAt een subset (Delphi-sets!) Is van [htOnIcon, htOnItem, htOnLabel, htOnStateIcon], weet u zeker dat de gebruiker op het item (of op het pictogram / statuspictogram) heeft geklikt.