46 Voix

Delphi/Lazarus: Sélectionner tout avec CTRL+A dans ListView

Conseil de Stefan Trost | Dernière mise à jour le 18/11/2022 | Créé le 26/06/2021

Si vous avez écrit une application en Delphi ou Lazarus contenant un TListView avec quelques entrées, il est assez agréable d'avoir la possibilité de sélectionner tous les éléments du ListView en appuyant sur les raccourcis clavier CTRL et A sur le clavier. Malheureusement, un ListView ne prend pas en charge cela automatiquement.

Mais nous pouvons rapidement y remédier en écrivant le code suivant dans l'événement OnKeyDown de notre 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;

Tout d'abord, ce code vérifie quelles touches ont été enfoncées. Si les touches sont "CTRL" (Shift = [ssCtrl] - la touche Maj est pressée) et "A" (key = ord('A') ou aussi key = 65), nous parcourons toutes les entrées de ListView et définissons la propriété "Selected" de chaque élément sur "true". Pour que la ListView n'est pas dessinée à nouveau après chacun de ces changements individuels, nous appelons .BeginUpdate et .EndUpdate avant et après les éléments passés. Bien sûr, vous pouvez toujours ajouter des conditions pour d'autres touches ou combinaisons de touches.

Important: Pour pouvoir sélectionner plusieurs éléments dans la ListView, nous devons auparavant définir la propriété "MultiSelect" de notre ListView sur "true" (par exemple via l'Object Inspector). Sinon, cette propriété est désactivée par défaut afin qu'un seul élément de ListView puisse être sélectionné en même temps.

Solution plus générale

Dans notre premier exemple de code, nous travaillons directement avec une ListView concrète qui porte le nom ListView1. Vous pouvez le faire de cette manière, mais dans certains cas, une solution plus générale est plus élégante. Par exemple, si nous avons plusieurs ListViews et chacun d'eux devrait réagir à notre combinaison de clés de la même manière. Dans ce cas, nous pouvons écrire une procédure générale que nous pouvons ensuite attribuer à chaque ListView sans avoir à écrire le même code pour plusieurs fois.

Quand le fais de cette façon, nous profitons de la variable "Sender" qui contient une référence à la ListView appel. C'est ainsi que nous savons quel ListView a appelé le code afin que nous puissions continuer à travailler avec cette ListView. Un code général pourrait ressembler à ceci:

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;

Il n'a pas beaucoup changé par rapport au premier code. Au lieu d'accéder directement à "ListView1", cette fois, nous travaillons avec une variable que nous avons appelée "AListView" ici. Afin qu'il n'y ait aucune erreur si la procédure est appelée par un type de contrôle différent, nous vérifions d'abord la première ligne si l'expéditeur est vraiment du type TListView. Sinon, nous nous déversons immédiatement. Si c'est le cas, nous pouvons continuer et sélectionner tous les éléments de la ListView appel en fonction du processus dont nous avons discuté ci-dessus.

RépondrePositifNégatif

Sur l’Auteur

AvatarVous pouvez trouver des logiciels de Stefan Trost sur fr.sttmedia.com. Avez-vous besoin d'un logiciel personnalisé selon vos propres besoins? Écrivez-nous: fr.sttmedia.com/contact
Voir Profil

 

Sujets Connexes

MySQL: Sauts de Ligne dans MySQL

Conseil | 0 Commentaires

VirtualBox: Changer la Date et l'Heure

Tutoriel | 10 Commentaires

La Recherche Askingbox

Info | 0 Commentaires

CSS: Comment inclure CSS dans HTML

Tutoriel | 0 Commentaires

Avis Important

Veuillez noter: Les contributions publiées sur askingbox.com sont des contributions d’utilisateurs et ne doivent pas remplacer les conseils d’un professionnel. Ils ne sont pas vérifiés par des indépendants et ne reflètent pas nécessairement l’opinion de askingbox.com. Apprendre encore plus.

Participer

Posez votre propre question ou écrivez votre propre article sur askingbox.com. Voici comment.