Cómo implementar OnClick - Doble Click para TListView en Delphi

El control TListView de Delphi muestra una lista de elementos en columnas con cabeceras de columna y subelementos, o vertical u horizontalmente, con iconos pequeños o grandes.

Al igual que la mayoría de los controles de Delphi, el TListView expone los eventos OnClick y OnDblClick (OnDoubleClick).

Desafortunadamente, si necesita saber en qué elemento se ha hecho clic o se ha hecho doble clic, no puede simplemente manejar los eventos OnClick / OnDblClick para obtener el elemento en el que se ha hecho clic.

El evento OnClick (OnDblClick) para el TListView se dispara cada vez que el usuario hace clic en el control, es decir, cuando el "clic" se produce en algún lugar dentro del área de cliente del control.

El usuario puede hacer clic dentro de la vista de lista, PERO "perder" cualquiera de los elementos. Además, dado que la vista de lista puede cambiar su visualización en función de la propiedad ViewStyle, el usuario puede haber hecho clic en un elemento, en un título de elemento, en un icono de elemento, en "nowhere", en un icono de estado de elemento, etc.

Nota: la propiedad ViewStyle determina cómo se muestran los elementos en la vista de lista: los elementos se pueden mostrar como un conjunto de iconos móviles o como columnas de texto.

ListView.On Item Click y ListView.On Item Doble Click

Para poder localizar el elemento en el que se ha hecho clic (si lo hay) cuando se activa el evento OnClick para la vista de lista, es necesario determinar qué elementos de la vista de lista se encuentran bajo el punto especificado por los parámetros X e Y, es decir, la ubicación del ratón en el momento del "clic".

La función GetHitTestInfoAt de TListiew devuelve información sobre el punto especificado en el área de clientes de la vista de lista.

Para asegurarse de que el elemento ha sido pulsado (o pulsado dos veces) es necesario llamar a GetHitTestInfoAt y reaccionar sólo si el evento de clic se ha producido en un elemento real.

He aquí un ejemplo de implementación del evento OnDblClick de ListView1:

 //handles ListView1's On Double Click

procedure TForm.ListView1DblClick(Sender: TObject) ;

var

  hts : THitTests;

  ht : THitTest;

  sht : string;

  ListViewCursosPos : TPoint;

  selectedItem : TListItem;

begin

  //position of the mouse cursor related to ListView

  ListViewCursosPos := ListView1.ScreenToClient(Mouse.CursorPos) ;

  //double click where?

  hts := ListView1.GetHitTestInfoAt(ListViewCursosPos.X, ListViewCursosPos.Y) ;

  //"debug" hit test

  Caption := '';

  for ht in hts do

  begin

    sht := GetEnumName(TypeInfo(THitTest), Integer(ht)) ;

    Caption := Format('%s %s | ',[Caption, sht]) ;

  end;

  //locate the double-clicked item

  if hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] then

  begin

    selectedItem := ListView1.Selected;

    //do something with the double clicked item!

    Caption := Format('DblClcked : %s',[selectedItem.Caption]) ;

  end;

end;

En el manejador de eventos OnDblClick (u OnClick), lea la función GetHitTestInfoAt proporcionándole la ubicación del ratón "dentro" del control. Para obtener la ubicación del ratón relacionada con la vista de lista, la función ScreenToClient se utiliza para convertir un punto (ratón X e Y) de las coordenadas de la pantalla en coordenadas locales o del área de cliente.

La GetHitTestInfoAt devuelve un valor del tipo THitTests. Los THitTests son un conjunto de valores enumerados por THitTest.

Los valores de enumeración de THitTest, con su descripción, son:

  • htAbove - sobre el área de clientes.
  • htBelow - debajo del área de clientes.
  • htNowhere - dentro del control, pero no en un elemento.
  • htOnItem - en un ítem, su texto o su mapa de bits.
  • htOnButton - en un botón.
  • htOnIcon - en un icono.
  • htOnIndent - en el área sangrada de un elemento.
  • htOnLabel - en una etiqueta.
  • htOnRight - en el lado derecho de un elemento.
  • htOnStateIcon - en un icono de estado o mapa de bits asociado a un elemento.
  • htToLeft - a la izquierda del área de clientes.
  • htToRight - a la derecha del área de clientes.

Si el resultado de la llamada a GetHitTestInfoAt es un subconjunto (Delphi sets!) de[htOnIcon, htOnItem, htOnItem, htOnLabel, htOnStateIcon], puede estar seguro de que el usuario hizo clic en el elemento (o en su icono / icono de estado).

Finalmente, si lo anterior es cierto, lea la propiedad Selected de la vista de lista, devuelve el primer elemento seleccionado (si se pueden seleccionar varios) en la vista de lista. Haga algo con el elemento pulsado / doble pulsado / seleccionado...

Asegúrese de descargar el código fuente completo para explorar el código y aprender a adoptarlo.

(0 votes)