[Resolu] Marquer le titre d'une colonne après un tri dans une ListView

Marquer le titre d'une colonne après un tri dans une ListView [Resolu] - Delphi/Pascal - Programmation

Marsh Posté le 24-02-2004 à 11:20:52    

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.
 
Mon problème est le suivant :
 
Après que l'utilisateur ait cliqué sur l'une des en-têtes de colonne d'une ListView, comment faire pour que le titre de cette même colonne change ? Par exemple le titre de la colonne passe en caractère gras, ou une petite image s'affiche à coté du titre pour indiquer que le tri a été fait par rapport à cette colonne.
 
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 ?  :ange:
 
Merci  :)


Message édité par Dionyzos le 07-03-2005 à 15:22:53
Reply

Marsh Posté le 24-02-2004 à 11:20:52   

Reply

Marsh Posté le 10-05-2004 à 18:03:03    

Alléluia !!! J’ai la solution grâce à  Delphiprog :)
 
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.
 
Et voici la procédure permettant de gérer l’événement OnColumnClick :
 

var
  TriAsc: boolean; // variable globale déterminant le sens du tri dans un ListView
 
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;


 
La petite image va maintenant s’afficher devant le titre de la colonne sur laquelle on a cliqué.
Le problème est qu’elle s’affiche également devant chaque éléments de la première colonne.
 
Pour empêcher cela, il faut placer le bout de code suivant à la fin de la procédure qui permet de remplir la TlistView :
 

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


 
Et voilà le petit symbole graphique indiquant le sens de tri de la colonne cliquée, apparaît uniquement sur l’en-tête de la colonne :wahoo:  
 
 
Par contre il reste un petit détail gênant : Lorsque le symbole apparaît dans l’en-tête de la colonne, celui-ci est placé à gauche du titre, ce qui fait que le titre se décale vers la droite pour laisser la place à l’image du symbole.
C’est pas très esthétique :(
 
J’espère que cette solution servira à quelqu’un d’autre que moi ;)
 
Dionyzos


Message édité par Dionyzos le 18-07-2005 à 17:49:33
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed