IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Tutoriel: Empêcher le déplacement de la première colonnes d'un TListView avec la propriété FullDrag à true


Sujet :

C++Builder

  1. #1
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut Tutoriel: Empêcher le déplacement de la première colonnes d'un TListView avec la propriété FullDrag à true
    Il arrive parfois que l'on veut empêcher le déplacement de la première colonnes d'un TListView et autoriser les autres à se déplacer en mettant la propriété FullDrag à true.

    Par exemple dans Microsoft Office Outlook la dernière colonne, Statut, ne peut se déplacer. Je n'ai pas trouver d'exemple avec la première colonne, mais on n'a qu'à penser à une liste avec des cases à cocher que l'on veut garder en toute circonstance en première position.

    Pour arriver à ce résultat on doit d'abord déclarer les éléments suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Classes::TWndMethod OldWindowProc;
        void __fastcall ListViewWndProc(Messages::TMessage &Message);
        bool PreventDrag;
    Dans le constructeur on ajoute ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        OldWindowProc = ListView1->WindowProc;
        ListView1->WindowProc = ListViewWndProc;
        PreventDrag = false;
        ListView1->FullDrag = true; // Permet à toutes les colonnes de bouger
    Finalement, on capte quelques messages envoyés à la list view:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void __fastcall TForm1::ListViewWndProc(Messages::TMessage &Message)
    {
        if(Message.Msg == WM_NOTIFY)
        {
            NMHEADER* pNMHeader = (NMHEADER*) Message.LParam;
            switch(pNMHeader->hdr.code)
            {
                case HDN_BEGINDRAG:
                    if(PreventDrag || pNMHeader->iItem == 0)
                    {   // La première colonne ne doit pas bouger
                        Message.Result = true;
                        PreventDrag = true;
                        return;
                    }
                    break;
                case HDN_ENDDRAG:
                    if(pNMHeader->pitem && pNMHeader->pitem->iOrder == 0)
                    {   // Aucune colonne doit prendre la place de la première
                        Message.Result = true;
                        return;
                    }
                    break;
                case NM_RELEASEDCAPTURE:
                    PreventDrag = false;
                    break;
            }
        }
        OldWindowProc(Message);
    }
    Comment faire, si au lieu d'interdire le déplacement de la première colonne, je veut que se soit la dernière?

    Premièrement on prend le numéro de la colonne en note avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int LastCol = ListView1->Columns->Count - 1;
    Et dans le code plus haut on change les deux "== 0" pour "== LastCol ".

    J'espère que ce code vous sera utile.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    On pourrait aussi utiliser le code suivant qui force la colonne à aller à la deuxième position quand on la drag à la première:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                case HDN_ENDDRAG:
                    if(pNMHeader->pitem && pNMHeader->pitem->iOrder == 0)
                    {   // La première position ne convient pas,
                        // par contre c'est OK pour la deuxième
                        pNMHeader->pitem->iOrder = 1;
                    }
                    break;
    C'est peut-être une meilleure façon de fonctionner que de rien faire.

    Pour ceux qui veuillent aller plus loin, voici la liste complète des notifications que le contrôle d'entête peut recevoir:
    • HDN_BEGINDRAG
    • HDN_BEGINFILTEREDIT
    • HDN_BEGINTRACK
    • HDN_DIVIDERDBLCLICK
    • HDN_DROPDOWN
    • HDN_ENDDRAG
    • HDN_ENDFILTEREDIT
    • HDN_ENDTRACK
    • HDN_FILTERBTNCLICK
    • HDN_FILTERCHANGE
    • HDN_GETDISPINFO
    • HDN_ITEMCHANGED
    • HDN_ITEMCHANGING
    • HDN_ITEMCLICK
    • HDN_ITEMDBLCLICK
    • HDN_ITEMKEYDOWN
    • HDN_ITEMSTATEICONCLICK
    • HDN_OVERFLOWCLICK
    • HDN_TRACK
    • NM_CUSTOMDRAW (header)
    • NM_RCLICK (header)
    • NM_RELEASEDCAPTURE (header)
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

Discussions similaires

  1. [AC-2007] Empécher le déplacement de colonne dans un sous-formulaire ?
    Par marot_r dans le forum IHM
    Réponses: 2
    Dernier message: 27/04/2012, 20h01
  2. [C#][VS 2005]Supprimer la première colonne dans un DatagridView
    Par cmoiscrat dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/06/2006, 15h20
  3. Figer la première ligne et la première colonne d'un tableau
    Par kcizth dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 09/06/2006, 10h48
  4. [JTable] Insertion d'images dans la première colonne
    Par cocolepelo dans le forum Composants
    Réponses: 2
    Dernier message: 29/11/2005, 15h17
  5. where sur la première colonne
    Par r-zo dans le forum Requêtes
    Réponses: 8
    Dernier message: 28/07/2003, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo