Implementeren op itemklik / dubbelklik voor TListView

Delphi's TListView-besturingselement 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-besturingselementen 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 (OnDblClick) -gebeurtenis 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". Wat meer is, aangezien de lijstweergave de weergave kan veranderen, afhankelijk van de ViewStyle-eigenschap, de gebruiker heeft mogelijk op een item, op een itemtitel, op een itempictogram, "nergens", op een itemstatuspictogram geklikt, enz.

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

instagram viewer

Lijstweergave. Bij item Klik & Lijstweergave. Bij item dubbelklik

Om het aangeklikte item (indien aanwezig) te kunnen vinden wanneer de OnClick-gebeurtenis voor de lijstweergave wordt geactiveerd, moet u bepalen wat elementen van de lijstweergave liggen onder het punt gespecificeerd 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.Lijstweergave 1DblClick(Afzender: TObject);
var
hts: THitTests;
ht: THitTest;
sht: draad;
ListViewCursosPos: TPoint;
selectedItem: TListItem;
beginnen
// positie van de muiscursor gerelateerd aan ListView
ListViewCursosPos: = ListView1.ScreenToClient (muis. 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: = Indeling ('DblClcked:% s', [selectedItem. Onderschrift]) ;
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 opsomming waarden, met hun beschrijving, zijn:

  • htboven - boven het klantengebied.
  • ht hieronder - onder het klantengebied.
  • nergens - 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.
  • htoRight - rechts van het clientgebied.

Als het resultaat van de oproep aan GetHitTestInfoAt een is subset (Delphi-sets!) van [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] kunt u er zeker van zijn dat de gebruiker op het item (of op het pictogram / statuspictogram) heeft geklikt.

Lees ten slotte als het bovenstaande waar is Geselecteerd eigenschap van de lijstweergave, retourneert het het eerste geselecteerde item (als er meerdere kunnen worden geselecteerd) in de lijstweergave. Doe iets met het aangeklikte / dubbelklik / geselecteerde item ...

Zorg ervoor dat u de volledige broncode downloadt om de code te verkennen en te leren door deze te gebruiken.