Implementering av artikel Klicka / dubbelklicka för TListView

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.

ListView.On Item Click & ListView.On Item Double Click

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:

  • htAbove - ovanför klientområdet.
  • htBelow - under klientområdet.
  • htNowhere - inuti kontrollen, men inte på en artikel.
  • htOnItem - på ett objekt, dess text eller bitmapp.
  • htOnButton - på en knapp.
  • htOnIcon - på en ikon.
  • htOnIndent - på det intryckta området på en artikel.
  • htOnLabel - på en etikett.
  • htOnRight - till höger om en artikel.
  • htOnStateIcon - på en tillståndsikon eller bitmapp som är associerad med ett objekt.
  • htToLeft - till vänster om klientområdet.
  • htToRight - till höger om klientområdet.

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).