Implementación en clic de elemento / doble clic para TListView

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

Como la mayoría de los controles de Delphi, TListView expone el Al hacer clic y OnDblClick (OnDoubleClick) eventos.

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

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

El usuario puede hacer clic dentro de la vista de lista, PERO "omitir" cualquiera de los elementos. Además, dado que la vista de lista puede cambiar su visualización dependiendo de la propiedad ViewStyle, el usuario podría haber hecho clic en un elemento, en un título de elemento, en un icono de elemento, "en ninguna parte", 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 & ListView. On Item Double Click

Para poder ubicar el elemento seleccionado (si hay uno) cuando se activa el evento OnClick para la vista de lista, debe determinar qué elementos de la vista de lista se encuentran debajo del punto especificado por los parámetros X e Y: ese es el ubicación del mouse en el momento del "clic".

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

Para asegurarse de que se hizo clic en el elemento (o doble clic), debe llamar a GetHitTestInfoAt y reaccionar solo si el evento de clic se produjo en un elemento real.

Aquí hay un ejemplo de implementación del evento OnDblClick de ListView1:

 // maneja ListView1's con doble clicprocedimiento TForm.ListView1DblClick(Remitente: TObject);
var
  hts: THitTests;
  ht: THitTest;
  sht: cuerda;
  ListViewCursosPos: TPoint;
  selectedItem: TListItem;
empezar
  // posición del cursor del mouse relacionada con ListView
  ListViewCursosPos: = ListView1.ScreenToClient (Mouse.CursorPos);
  // haz doble clic donde?
  hts: = ListView1.GetHitTestInfoAt (ListViewCursosPos.X, ListViewCursosPos.Y);
  // prueba de éxito de "depuración"
  Título: = ";
  para ht en hts hacer
  empezar
    sht: = GetEnumName (TypeInfo (THitTest), Integer (ht));
    Título: = Formato ('% s% s |', [Título, sht]);
  final;
  // localiza el elemento con doble clic
  Si hts <= [htOnIcon, htOnItem, htOnLabel, htOnStateIcon] luego
  empezar
    selectedItem: = ListView1.Selected;
    // hacer algo con el elemento de doble clic!
    Título: = Formato ('DblClcked:% s', [selectedItem.Caption]);
  final;
final;

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

GetHitTestInfoAt devuelve un valor de PRUEBAS tipo. The THitTests es un conjunto de PRUEBA valores enumerados.

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

  • htAbove - por encima del área del cliente.
  • htBajo - debajo del área del cliente.
  • htNada - dentro del control, pero no en un artículo.
  • htOnItem - en un elemento, su texto o su mapa de bits.
  • htOnButton - en un botón.
  • htOnIcon - en un icono.
  • htOnIndent - en el área sangrada de un artículo.
  • htOnLabel - en una etiqueta.
  • htOnRight - en el lado derecho de un artículo.
  • htOnStateIcon - en un icono de estado o mapa de bits asociado con un elemento.
  • htToLeft - a la izquierda del área del cliente.
  • htToRight - a la derecha del área del cliente.

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