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 :

Combobox dans une TStringGrid - problèmes d'affichages [Débutant(e)]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut Combobox dans une TStringGrid - problèmes d'affichages
    bonjour,

    J'ai 2 questions :

    1-
    j'ai inséré une combobox dans un TStringGrid selon le code fourni ici :
    http://www.developpez.net/forums/showthread.php?t=85126

    Voici mon code :
    Code c++ : 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
     
    //---------------------------------------------------------------------------
    void __fastcall TfForm::StringGridDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
        TCanvas *canvasGrid;
        int tW, curCol;
     
        canvasGrid = StringGrid->Canvas;
        curCol = LOWORD((DWORD)ComboBox->Tag);
     
        if (ACol!=0 && ACol!=1 && ARow==0)
        {
            tW = canvasGrid->TextWidth("XXXX") + GetSystemMetrics(SM_CXVSCROLL);
     
            if (StringGrid->ColWidths[ACol]<tW)
                StringGrid->ColWidths[ACol] = tW;
     
            if (StringGrid->ColWidths[ACol]>100)
                StringGrid->ColWidths[ACol] = 100;
        }
     
     
        if (ComboBox->Visible && ACol!=0 && ACol!=1 && ARow==0 && curCol==ACol)
        {
            ComboBox->Left = StringGrid->Left + Rect.Left + StringGrid->GridLineWidth + 1;
            ComboBox->Width = (Rect.Right - Rect.Left);
        }
     
     
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TfForm::StringGridSelectCell(TObject *Sender, int ACol,
          int ARow, bool &CanSelect)
    {
        TRect Rect;
        int min, index;
     
     
        Rect = StringGrid->CellRect(ACol, ARow);  //Coordonnées de la cellule cliquée
     
        ComboBox->Visible = false;
     
        ComboBox->Top =  StringGrid->Top + Rect.Top + StringGrid->GridLineWidth + 1;
        ComboBox->Left = StringGrid->Left + Rect.Left + StringGrid->GridLineWidth + 1;
     
        ComboBox->Height = (Rect.Bottom - Rect.Top);
        ComboBox->Width = (Rect.Right - Rect.Left);
     
        min = ComboBox->Canvas->TextWidth("XXXX") + GetSystemMetrics(SM_CXVSCROLL); // largeur de la combo
        if (ComboBox->Width < min)
            ComboBox->Width = min;
     
        index = ComboBox->Items->IndexOf(StringGrid->Cells[ACol][ARow]);
     
        if (index>=0)
            ComboBox->ItemIndex = index;
        else
            ComboBox->ItemIndex = -1;
     
        ComboBox->Tag = MAKELONG (ACol, ARow);
     
        ComboBox->Visible = true;   // Combo visible
        ComboBox->BringToFront();   // 1er plan
     
    }

    J'arrive à gérer le redimensionnement de la combobox si l'utilisateur redimensionne la cellule, par contre j'ai 2 soucis :
    1. si l'utilisateur fait un scroll, la combo ne se suit pas la colonne dans laquelle il se trouve (scroll.jpg). Dans la copie d'écran fournie en pièce jointe, la combo était dans la cellule 4 avant le scroll.
    2. si l'utilisateur agrandit la colonne au delà de la longueur de la grille, la combo sort de la grille (deborde.jpg)


    Comment je peux gérer le scroll et le débordement ?



    --------------------------------------
    2-
    J'avais envisagé une seconde solution en ajoutant dans la fonction StringGridSelectCell cette ligne et modifié le code qui détermine le Heigth, Width, Top et Left de la Combo:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        ComboBox->Parent = StringGrid;
    cela fonctionne très bien sauf que la Combo ne se déroule plus

    Je dois avouer que cette solution me convient danvantage... si je savais comment dérouler la Combo.
    Comment je peux dérouler la Combo dans ce cas ?



    de vos suggestions

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    J'ai résolu le problème en rajoutant cette variable :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        TRect R;
        R = StringGrid->CellRect(curCol, curRow);
    Je vérifie ensuite R.Left et R.Right.
    Si R.Left est inférieur à la largeur des fixedCol ou si R.Right est supérieur à la largeur de la grille (je soustrais à cette valeur l'épaisseur de la bordure de la grille), je cache la combobox.



    Dans le cas où la combo est le parent de la grille, pour que la liste s'affiche il faut donner une valeur à Height supérieure à la hauteur de la cellule cliquée.
    Cependant, j'ai rencontré un problème : les événements de la ComboBox (onChange dans mon cas) ne sont plus gérés.

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

Discussions similaires

  1. problèmes sur un combobox dans une classe appelée
    Par francky74 dans le forum JDBC
    Réponses: 9
    Dernier message: 02/04/2014, 13h09
  2. Réponses: 5
    Dernier message: 16/03/2010, 09h58
  3. Réponses: 4
    Dernier message: 29/07/2009, 11h02
  4. Affichage combobox dans une boite de dialogue
    Par Tof_06 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 05/02/2008, 12h22
  5. Centrer le texte dans une TStringGrid
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/06/2004, 11h01

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