Delphis TListView-kontroll visar en lista över objekt i kolumner med kolumnrubriker och underobjekt, eller vertikalt eller horisontellt, med små eller stora ikoner.
Liksom de flesta Delphi-kontroller exponerar TListView OnClick och OnDblClick (OnDoubleClick) -händelser.
Tyvärr, om du behöver veta vilket objekt som klickades eller dubbelklickade kan du inte bara hantera händelserna OnClick / OnDblClick för att få det klickade objektet.
Händelsen OnClick (OnDblClick) för TListView avfyras varje gång användaren klickar på kontrollen - det är när "klick" inträffar någonstans inne i klientområdet för kontrollen.
Användaren kan klicka i listvyn, MEN "missa" något av objekten. Dessutom, eftersom listvy kan ändra dess visning beroende på ViewStyle-egenskapen, kan användaren ha klickat på ett objekt, på en artikeltexter, på en artikelsymbol, "ingenstans", på en objektstatusikon, etc..
Obs! Egenskapen ViewStyle bestämmer hur objekt ska visas i listvy: objekten kan visas som en uppsättning rörliga ikoner eller som kolumner med text.
För att kunna hitta det klickade (om det finns ett) objekt när OnClick-händelsen för listvyn avfyras måste du bestämma vilka element i listvyn som ligger under den punkt som anges av X- och Y-parametrarna - det är placering av musen vid "klick".
TListiews GetHitTestInfoAt funktionen returnerar information om den angivna punkten i listvyens klientområde.
För att se till att objektet klickades (eller dubbelklickades) måste du ringa GetHitTestInfoAt och bara reagera om klickhändelsen inträffade på ett faktiskt objekt.
Här är ett exempel på implementering av ListView1: s OnDblClick-händelse:
// hanterar ListView1: s med dubbelklickprocedur TForm.ListView1DblClick(Avsändare: TObject);
var
hts: THitTests;
ht: THitTest;
sht: sträng;
ListViewCursosPos: TPoint;
valdItem: TListItem;
Börja
// placering av muspekaren relaterad till ListView
ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
// dubbelklicka var?
hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
// "felsökning" hittest
Bildtext: = ";
för ht i hts do
Börja
sht: = GetEnumName (TypeInfo (THitTest), heltal (ht));
Bildtext: = Format ('% s% s |', [Bildtext, sht]);
slutet;
// hitta det dubbelklickade objektet
om hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] sedan
Börja
valdItem: = ListView1.Valt;
// gör något med det dubbelklickade objektet!
Bildtext: = Format ('DblClcked:% s', [valdItem.Caption]);
slutet;
slutet;
I händelsehanteraren OnDblClick (eller OnClick) läser du GetHitTestInfoAt-funktionen genom att ge den platsen för musen "inuti" kontrollen. För att få platsen för musen relaterad till listvyen används funktionen ScreenToClient för att konvertera en punkt (mus X och Y) i skärmkoordinater till lokala, eller klientområde, koordinater.
GetHitTestInfoAt returnerar ett värde på THitTests typ. THitTests är en uppsättning av THitTest uppräknade värden.
THitTest-uppräkningsvärdena med deras beskrivning är:
Om resultatet av samtalet till GetHitTestInfoAt är en delmängd (Delphi-uppsättningar!) Av [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] kan du vara säker på att användaren klickade på objektet (eller på dess ikon / statusikon).