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 :

Multiselection StringGrid [FAQ]


Sujet :

C++Builder

  1. #1
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 24
    Points : 52
    Points
    52
    Par défaut Multiselection StringGrid
    Salut les developpez,

    J'aurais voulu savoir s'il était possible de selectionner plusieurs cellules dans un StringGrid ?
    Je connais l'option goRangeSelect, mais c'est pas ce que je cherche. J'aimerais faire la selection de cette façon Ctrl+Click.

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut,
    Une méthode un peu bourrin consisterait à tester la touche du clavier 'Ctrl' à chaque clic dans la StringGrid et d'enregistrer la case active pour ton opération.

  3. #3
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 24
    Points : 52
    Points
    52
    Par défaut
    Salut,

    De toutes manieres, avec un StringGrid je crois qu'il n'y pas d'autre moyen que de faire du bourin. T'as technique n'est pas idiote, mais le problème va venir du faite que lorsque le user va faire sa multiselection, en visu on n'aura que le dernier selectionner. Sauf si les cellules sont cote à cote.


    Mais bon ... C'est pas grave car je me suis demerdé autrement. J'utilise un TListBox à la place. Il permet la multiselection.

    Si je trouve une solution, je repasserais par là.

    Merci quand même pour ta réponse

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    J'ai testé un petit truc :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    void __fastcall TForm1::StringGrid2DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
    if (!pListeIndex == NULL)
    {
            for (int i = 0; i < pListeIndex->Count; i ++)
            {
                    if (StrToInt(pListeIndex->Strings[i]) == ARow)
                    {
                            StringGrid2->Canvas->Brush->Color = clMaroon;
                            StringGrid2->Canvas->FillRect(Rect);
                    }
            }
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::StringGrid2Click(TObject *Sender)
    {
    if (MultiSelect == true)
    {
            pListeIndex->Add(Form1->StringGrid2->Row);
            StringGrid2->Repaint();
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::StringGrid2KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if (Key == VK_CONTROL)
    {
            MultiSelect = true;
            if (pListeIndex == NULL)
            {
                    pListeIndex = new TStringList();
            }
    }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::StringGrid2KeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if (Key == VK_CONTROL)
    {
            MultiSelect = false;
            if (!pListeIndex == NULL)
            {
                    pListeIndex->Clear();
            }
    }
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::StringGrid2MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    StringGrid2->SetFocus();
    }
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private:    // Déclarations de l'utilisateur
            TStringList *pListeIndex;
            bool MultiSelect;
    Ce qui, je pense, devrais solutionner :
    mais le problème va venir du faite que lorsque le user va faire sa multiselection, en visu on n'aura que le dernier selectionner. Sauf si les cellules sont cote à cote.
    enfin, si j'ai bien tout compris...
    En espérant t'aider...
    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre du Club

    Inscrit en
    Août 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 24
    Points : 52
    Points
    52
    Par défaut
    Salut,

    C'est exactement ce dont j'avais besoin. J'avais pensé à un truc comme ca, mais je me disais que c'etait un peu trop tordu . En fin de compte je trouve pas mieux.

    J'ai repris ton code en le modifiant un peu pour l'adapter au mieux de mes besoins. Donc si ca interesse quelqu'un je le mets ici

    Dans fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private:    // Déclarations de l'utilisateur
            TStringList *pListeIndex;
            bool MultiSelect;
    Dans le fichier .cpp
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        MultiSelect = false;
        pListeIndex = NULL;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
        if(pListeIndex != NULL)
            delete pListeIndex;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
        TStringGrid *strGrid = (TStringGrid*)Sender;
     
        AnsiString AnsiStr = strGrid->Cells[ACol][ARow];
     
        if (pListeIndex != NULL)
        {
            if(pListeIndex->IndexOf(ARow) != -1)
            {
                strGrid->Canvas->Brush->Color = clHighlight;  // colorie la ligne pour indiquer qu'elle est selectionnée
                strGrid->Canvas->Font->Color = clWhite;  // on passe la font de noir à blanche
                strGrid->Canvas->FillRect(Rect);
                strGrid->Canvas->TextRect(Rect, Rect.Left+2, Rect.Top+2, AnsiStr);
            }
            else  // on est plus en mode multi selection
            {   on affiche une font blanche dans la ligne selectionnée et noir pour les autres
                if(ARow == strGrid->Row)
                    strGrid->Canvas->Font->Color = clWhite;
                else
                    strGrid->Canvas->Font->Color = clBlack;
            }
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1Click(TObject *Sender)
    {
        TStringGrid *strGrid = (TStringGrid*)Sender;
     
        if (MultiSelect == true)
        {
            pListeIndex->Add(strGrid->Row);
        }
        else
        {
            if(pListeIndex != NULL)
                pListeIndex->Clear();
        }
        strGrid->Repaint();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        if (Key == VK_CONTROL)
        {
            MultiSelect = true;
            if (pListeIndex == NULL)
            {
                pListeIndex = new TStringList();
            }
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1KeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
        if (Key == VK_CONTROL)
        {
            MultiSelect = false;
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
        ((TStringGrid*)Sender)->SetFocus();
    }
    //---------------------------------------------------------------------------
    Merci à vous deux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] [0.9.31/fpc 2.4.5] StringGrid : Multiselect et MouseWheel
    Par Invité dans le forum Lazarus
    Réponses: 2
    Dernier message: 19/10/2011, 10h08
  2. [Lazarus] [0.9.26.2] StringGrid : multiselect
    Par Invité dans le forum Lazarus
    Réponses: 2
    Dernier message: 03/08/2009, 09h49
  3. [Delphi 6] Stringgrid et Multiselect
    Par KrusK dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/07/2005, 09h11
  4. [Canvas] Listbox, couleur et multiselect
    Par rbag dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/09/2002, 13h02
  5. StringGrid et colonnes
    Par Delph dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/08/2002, 11h35

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