Le contrôle TListView de Delphi affiche une liste d'éléments dans des colonnes avec des en-têtes et sous-éléments de colonne, ou verticalement ou horizontalement, avec de petites ou grandes icônes.
Comme la plupart des contrôles Delphi, le TListView expose le Sur clic et OnDblClick (OnDoubleClick) événements.
Malheureusement, si vous avez besoin de savoir quel élément a été cliqué ou double-cliqué, vous ne pouvez pas simplement gérer les événements OnClick / OnDblClick pour obtenir l'élément cliqué.
L'événement OnClick (OnDblClick) pour TListView est déclenché chaque fois que l'utilisateur clique sur le contrôle - c'est-à-dire chaque fois que le «clic» se produit quelque part à l'intérieur de la zone cliente du contrôle.
L'utilisateur peut cliquer à l'intérieur de la vue de liste, MAIS "manquer" l'un des éléments. De plus, comme la vue de liste peut changer son affichage en fonction de la propriété ViewStyle, l'utilisateur peut avoir cliqué sur un élément, sur une légende d'élément, sur une icône d'élément, "nulle part", sur une icône d'état d'élément, etc..
Remarque: la propriété ViewStyle détermine la façon dont les éléments sont affichés dans la vue de liste: les éléments peuvent être affichés sous la forme d'un ensemble d'icônes mobiles ou sous forme de colonnes de texte.
Pour pouvoir localiser l'élément cliqué (s'il y en a un) lorsque l'événement OnClick pour la vue de liste est déclenché, vous devez déterminer quels éléments de la vue de liste se trouvent sous le point spécifié par les paramètres X et Y - c'est-à-dire emplacement de la souris au moment du "clic".
Les TListiew's GetHitTestInfoAt La fonction renvoie des informations sur le point spécifié dans la zone client de la vue liste.
Pour vous assurer que l'élément a été cliqué (ou double-cliqué), vous devez appeler GetHitTestInfoAt et réagir uniquement si l'événement de clic s'est produit sur un élément réel.
Voici un exemple d'implémentation de l'événement OnDblClick de ListView1:
// gère ListView1's On Double Clickprocédure TForm.ListView1DblClick(Expéditeur: TObject);
var
hts: THitTests;
ht: THitTest;
sht: chaîne;
ListViewCursosPos: TPoint;
selectedItem: TListItem;
commencer
// position du curseur de la souris par rapport à ListView
ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
// double-cliquez où?
hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
// test de réussite "debug"
Légende: = ";
pour ht dans hts faire
commencer
sht: = GetEnumName (TypeInfo (THitTest), Integer (ht));
Légende: = Format ('% s% s |', [Légende, sht]);
fin;
// localiser l'élément double-cliqué
si hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] ensuite
commencer
selectedItem: = ListView1.Selected;
// faire quelque chose avec l'élément double-cliqué!
Légende: = Format ('DblClcked:% s', [selectedItem.Caption]);
fin;
fin;
Dans le gestionnaire d'événements OnDblClick (ou OnClick), lisez la fonction GetHitTestInfoAt en lui fournissant l'emplacement de la souris "à l'intérieur" du contrôle. Pour obtenir l'emplacement de la souris par rapport à la vue de liste, la fonction ScreenToClient est utilisée pour convertir un point (souris X et Y) en coordonnées d'écran en coordonnées locales ou clientes..
GetHitTestInfoAt renvoie une valeur de THitTests type. Les THitTests sont un ensemble de THitTest valeurs énumérées.
Les valeurs d'énumération THitTest, avec leur description, sont:
Si le résultat de l'appel à GetHitTestInfoAt est un sous-ensemble (ensembles Delphi!) De [htOnIcon, htOnItem, htOnLabel, htOnStateIcon], vous pouvez être sûr que l'utilisateur a cliqué sur l'élément (ou sur son icône / icône d'état).