33 Votos

Delphi/Lazarus: Seleccionar todo con CTRL+A en ListView

Consejo de Stefan Trost | Última actualización el 18/11/2022 | Creado el 25/06/2021

Si ha escrito una aplicación en Delphi o Lazarus que contiene un TListView con algunas entradas, es muy bueno tener la posibilidad de seleccionar todos los elementos del ListView presionando el atajo de teclas CTRL y A en el teclado. Desafortunadamente, un ListView no lo admite automáticamente.

Pero podemos remediar esto rápidamente escribiendo el siguiente código en el evento OnKeyDown de nuestro ListView:

procedure Tprog.ListView1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState);
var
  i: integer;
begin
  if (Shift = [ssCtrl]) and (key = ord('A')) then begin
     ListView1.Items.BeginUpdate;
     for i := 0 to ListView1.Items.Count - 1 do 
        ListView1.Items[i].Selected := true;
     ListView1.Items.EndUpdate;
  end;
end;

En primer lugar, este código comprueba qué teclas se han pulsado. Si las teclas son "CTRL" (Shift = [ssCtrl] - la tecla Shift se presiona) y "A" (key = ord('A') o también key = 65), revisamos todas las entradas de ListView y establezcamos la propiedad "Selected" de cada elemento en "true". De modo que el ListView no se dibuja nuevamente después de cada uno de estos cambios individuales, llamamos .BeginUpdate y .EndUpdate antes y después de recorrer los elementos. Por supuesto, aún puede agregar condiciones para otras teclas o combinaciones de teclas.

Importante: Para poder seleccionar varios elementos en ListView, tenemos que establecer la propiedad "MultiSelect" de nuestro ListView en "true" antes (por ejemplo a través del Object Inspector). De lo contrario, esta propiedad está deshabilitada de manera predeterminada para que solo un elemento de ListView se pueda seleccionar al mismo tiempo.

Solución más general

En nuestro primer ejemplo de código, trabajamos directamente con una ListView concreta que lleva el nombre ListView1. Puede hacerlo de esta manera, pero en algunos casos una solución más general es más elegante. Por ejemplo, si tenemos varias ListViews y cada una de ellas debe reaccionar a nuestra combinación clave de la misma manera. En este caso, podemos escribir un procedimiento general que luego podemos asignar a cada ListView sin tener que escribir el mismo código para varias veces.

Al hacerlo de esta manera, aprovechamos el variable "Sender" que contiene una referencia a la ListView llamada. Así es como sabemos qué ListView llamó al código para que podamos continuar trabajando con esta ListView. Un código general podría verse así:

procedure Tprog.ListViewKeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState);
var
  AListView: TListView;
  i: integer;
begin
  if not (Sender is TListView) then exit;
  AListView := (Sender as TListView);

  if (Shift = [ssCtrl]) and (key = 65) then begin
     AListView.Items.BeginUpdate;
     for i := 0 to AListView.Items.Count - 1 do
         AListView.Items[i].Selected := true;
     AListView.Items.EndUpdate;
  end;
end;

No ha cambiado mucho en comparación con el primer código. En lugar de acceder a "ListView1" directamente, esta vez trabajamos con una variable que hemos llamado "AListView" aquí. De modo que no habrá ningún error si el procedimiento es llamado por un tipo de control diferente, primero verificamos en la primera línea si el remitente es realmente del tipo TListView. Si no, nos romperemos de inmediato. Si es así, podemos continuar y seleccionar todos los elementos de ListView de acuerdo con el proceso que discutimos anteriormente.

ResponderPositivoNegativo

Sobre el Autor

AvatarPuede encontrar software de Stefan Trost en la pagina es.sttmedia.com. ¿Necesita un software individual según sus propios requisitos? Escribenos: es.sttmedia.com/contacto
Ver Perfil

 

Temas Relacionados

MySQL: Saltos de Línea en MySQL

Consejo | 0 Comentarios

CSS: Cómo incluir CSS en HTML

Tutorial | 0 Comentarios

Aviso Importante

Por favor tenga en cuenta: Las contribuciones publicadas en askingbox.com son contribuciones de los usuarios y no deben reemplazar el asesoramiento profesional. No son verificados por independientes y no reflejan necesariamente la opinión de askingbox.com. Aprende más.

Participar

Haga su propia pregunta o escriba su propio artículo en askingbox.com. He aquí cómo.