Marquage en-tete de colonne dans une TlistView après un tri

cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004 - 7 mai 2004 à 13:53
cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004 - 11 mai 2004 à 10:21
Bonjour,

J’utilise une TlistView avec ViewStyle = vsReport, et j’ai créé une procédure pour trier les éléments de la liste lorsque l’on appelle l’événement OnColumnClick.

:question) J’aimerais savoir s’il est possible d’afficher une image ou un petit symbole (représentant par exemple une flèche vers le haut ou vers le bas) à coté du titre de la colonne utilisée comme référence du tri.

Bref je veux faire la même chose que dans l’explorateur Windows en mode Détails.

J’ai potassé la doc Delphi (6) mais je n’ai rien trouvé concernant cette fonctionnalité pour une TListView

Quelqu’un a-t-il déjà planché sur le problème ?

Merci :)

Dionyzos

6 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
7 mai 2004 à 18:44
Ca peut se faire sans écrire en très peu de lignes de code.

Explications :
1- disposer d'un composant TImageList
2- Charger au moins deux images dans ce composant : un représentant un tri croissant et l'autre un tri décroissant.
3- affecter la propriété SmallImages du TListView avec le composant TImageList.
4- double cliquer sur le composant TListView et enseigner la propriété ImageIndex de la colonne que l'on souhaite voir affublée d'un dessin au démarrage de l'application.

Maintenant, passons au code source.
Pour gérer le clic sur le titre d'une colonne, on dispose de l'évènement OnColumnClick ("Se produit quand l'utilisateur clique sur un en-tête de colonne de la vue liste.").

Voici donc le fameux code tant attendu :
var
  TriAsc: boolean; //sens du tri dans un list view

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
var
  i: integer;
begin
  //Réinitaliser tous les titres des colonnes
  //= effacer les images présentes
  with TListView(Sender) do
    for i := 0 to Columns.Count - 1 do
      Columns[i].ImageIndex := -1;

  if TriAsc then
    Column.ImageIndex := 0
  else
    Column.ImageIndex := 1;
  //Inversion du sens de tri  
  TriAsc := not TriAsc;
end;


Et c'est tout !
Merci Delphi de nous faciliter la tâche à ce point :big)
May Delphi be with you
0
cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004
7 mai 2004 à 19:38
Mille fois merci Delphiprog, et bravo surtout car cela fait au moins 3 mois que j'ai posté cette question sur de multiples forum développement, et personne n'a su répondre,... sauf toi ;-)

Tu es le premier, et en plus tu me donnes la solution complète et non une réponse du genre "regarde dans la doc..." :-
Merci encore pour ta précieuse aide :-D

Je vais essayer ta solution dès Lundi (au boulot).
Je te tiens au courant du résultat.

Dionyzos
"codement votre"
0
cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004
10 mai 2004 à 16:17
Bonjour,

Delphiprog : J'ai testé ta méthode, ca marche très bien :)

Par contre j'ai 2 nouveaux pb :

1) l'image est alignée à gauche, ce qui fait que lorsque je clic sur une colonne pour la trier, le titre de cette colonne se décale vers la droite pour laisser la place à la petite image.
Existe-il une propriété ou une fonction permettant de placer l'image, à droite du texte ?

2) l'image est aussi dessinée devant chaque éléments de la 1ère colonne. Comment empecher cela ?

Merci encore pour ton aide ;)

Dionyzos
0
cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004
10 mai 2004 à 17:07
J'ai trouvé pour le 2ème pb :

Je place le bout de code suivant après avoir rempli ma listeview :

With MaListView do
  for i := 0 to Items.Count - 1 do
    Items.Item[i].ImageIndex := -1;


Et l'image n'apparait plus devant les éléments de la 1ère colonne.
Seul subsiste l'espace correspondant à l'image, mais ca n'est pas génant.

Par contre je seche toujours sur l'alignement des image dans les colonnes ... :sad)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
10 mai 2004 à 20:20
Le plus simple est encore de mettre une image vide dans la position "au repos". autrement dit, au lieu d'affecter -1 à la propriété ImageIndex, tu affectes l'index d'une image "bidon".
Ce qui fait que le composant devrait calculer la position du texte comme s'il y avait une image. 8-)
May Delphi be with you
0
cs_dionyzos Messages postés 7 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 11 octobre 2004
11 mai 2004 à 10:21
En effet ca marche. :big)

Ca fait déjà beaucoup plus propre, en attendant de trouver la méthode permettant d'aligner à droite le symbole...

D'ailleurs, à ce propos, je me demande si les développeurs Delphi qui intègrent dans leur appli un explorateur avec des symbole de tri dans les colonnes, n'utilise pas un autre composant que TListView.

Pour l'instant mes connaissances de Delphi sont encore trop limitées pour pouvoir répondre à cette question. :blush)
0
Rejoignez-nous