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

Composants VCL Delphi Discussion :

Comment rendre un item de combobox non sélectionnable


Sujet :

Composants VCL Delphi

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 223
    Points : 28 213
    Points
    28 213
    Par défaut Comment rendre un item de combobox non sélectionnable
    Hello world !

    J'utilise les TcxCombobox de DevExpress sous Delphi 6

    Je rempli mes items directement depuis le code, mais je souhaite que l'un d'entre-eux soit par la suite non sélectionnable par l'utilisateur.
    Existe-il une solution ?

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pieton
    Velo
    Voiture
    Camion
    Bus
    Train
    Avec par exemple Camion non sélectionnable

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Pour répondre à ta question
    l'idée serait de stocker dans les Objects[] de la propriété Properties.Items tes propres objets permettant lors du OnValidate de controler si l'élément est sélectionnable ou pas
    Jouer sur le OnChange et le OnCloseUp si OnValidate ne suffit pas pour forcer l'ItemIndex à -1 si l'on sélectionne un élément non sélectionnable

    Sur un TComboBox normal, je dessinerais différement l'élément mais DevExpress est riche en propriété en tout genre, il y doit bien y avoir la possibilté d'affecter un TcxStyle


    La solution la plus simple, c'est de ne pas l'afficher mais je comprends le besoin car j'ai fait quelque chose de similaire où il était nécessaire de voir tous les choix possibles même ceux pas sélectionnables
    J'affichais un petit carré de couleur pour différencier les items


    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //---------------------------------------------------------------------------
    void __fastcall TSLiteDVRDahuaTechnology_Generic_CameraConfiguratorForm::cbxChannelDrawItem(TWinControl *Control,
              int Index, TRect &Rect, TOwnerDrawState State)
    {
      TComboBox *ComboBox = dynamic_cast<TComboBox*>(Control);
      if (ComboBox)
        TComboChannelManager::DrawComboChannel(ComboBox, dynamic_cast<TIdentObjChannel*>(ComboBox->Items->Objects[Index]), Rect, State);
    }


    Voir les pseudo classes helpers que j'utilisais pour gérer cela

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    //---------------------------------------------------------------------------
    //         SLiteDVRDahuaTechnology::IHM_Utils::TComboChannelManager         -
    //---------------------------------------------------------------------------
    class TComboChannelManager : public TComboManager
    {
    public:
      // Méthodes publiques
      static void FillComboChannel(TComboBox *ACombo, int AChannelCount, const TIntegerDynArray AAffectedChannels, int ASelectedChannel = 0, int AReservedChannel = 0);
      static void DrawComboChannel(TComboBox *ACombo, TIdentObjChannel* AChannel, TRect &Rect, TOwnerDrawState State, ISLiteDVRDahuaBulkCamerasConfigurationManager* ABulk = NULL);
     
      static void RefreshComboChannelFromBulk(TComboBox *ACombo, ISLiteDVRDahuaBulkCamerasConfigurationManager* ABulk);
    };
     
    //---------------------------------------------------------------------------
    //              SLiteDVRDahuaTechnology::IHM_Utils::TIdentObj               -
    //---------------------------------------------------------------------------
    class TIdentObj : public TObject
    {
    public:
      /*constructor*/__fastcall TIdentObj(const AnsiString AIdent)
        : Ident(AIdent) {}
     
      // Membres Publiques
      AnsiString Ident;
    };
     
    //---------------------------------------------------------------------------
    //           SLiteDVRDahuaTechnology::IHM_Utils::TIdentObjChannel           -
    //---------------------------------------------------------------------------
    class TIdentObjChannel : public TIdentObj
    {
    public:
      // Constructeurs Publiques
      /*constructor*/__fastcall TIdentObjChannel(int AFriendlyChannel)
        : TIdentObj(IntToStr(AFriendlyChannel)),
          FriendlyChannel(AFriendlyChannel) {}
     
      // Membres Publiques
      int FriendlyChannel;
      bool Affected;
      bool Selected;
      bool Reserved;
    };
     
     
     
     
    //---------------------------------------------------------------------------
    //         SLiteDVRDahuaTechnology::IHM_Utils::TComboChannelManager         -
    //---------------------------------------------------------------------------
    using ::SLiteDVRDahuaTechnology::IHM_Utils::TComboChannelManager;
    using ::SLiteDVRDahuaTechnology::IHM_Utils::TIdentObjChannel;
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboChannelManager::FillComboChannel(TComboBox *ACombo, int AChannelCount, const TIntegerDynArray AAffectedChannels, int ASelectedChannel/* = 0*/, int AReservedChannel/* = 0*/)
    {
      for (int i = 1; i <= AChannelCount; i++)
      {
        bool lAffected = false;
        if (AAffectedChannels.Length > 0)
          for (int iaff = AAffectedChannels.Low; ( ! lAffected ) && (iaff <= AAffectedChannels.High); iaff++)
            lAffected = AAffectedChannels[iaff] == i;
     
        TIdentObjChannel* Item = new TIdentObjChannel(i);
        Item->Affected = lAffected;
        int idx = ACombo->Items->AddObject(Item->Ident, Item);
     
        if (AReservedChannel == i)
        {
          ACombo->ItemIndex = idx;
          Item->Reserved = true;
        }
     
        if (ASelectedChannel == i)
        {
          if (AReservedChannel == 0)
            ACombo->ItemIndex = idx;
          Item->Selected = true;  
        }
      }
    }
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboChannelManager::DrawComboChannel(TComboBox *ACombo, TIdentObjChannel* AChannel, TRect &Rect, TOwnerDrawState State, ISLiteDVRDahuaBulkCamerasConfigurationManager* ABulk/* = NULL*/)
    {
      if (ACombo && AChannel)
      {
        TCanvas *ComboCanvas = ACombo->Canvas;
     
        // Choix de la couleur de fond selon sélection
        ComboCanvas->Brush->Color = State.Contains(odSelected) ? clHighlight : ACombo->Color;
        ComboCanvas->Pen->Color = ComboCanvas->Brush->Color;
        // Dessin du fond
        ComboCanvas->Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     
        // Texte
        ComboCanvas->TextOut(Rect.Left + 2, Rect.Top + 1, AChannel->Ident);
     
        // Vérifie l'état du canal
        if (ABulk)
          AChannel->Reserved = ABulk->BulkChannelReservation[AChannel->FriendlyChannel];
     
        // Choix de la couleur indiquant l'affectation d'un canal
        ComboCanvas->Brush->Color = AChannel->Selected ? clSkyBlue : AChannel->Affected ? clWebLightCoral : AChannel->Reserved ? clWebLavenderBlush : clMoneyGreen;
        ComboCanvas->Pen->Color = ComboCanvas->Brush->Color;
     
        // Dessin du pseudo icone d'indication d'état
        int l = Rect.Left + ComboCanvas->TextWidth(AChannel->Ident) + 4 + 2;
        ComboCanvas->Rectangle(l , Rect.Top + 4, l + 8, Rect.Top + 4 + 8);
      }
    }
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboChannelManager::RefreshComboChannelFromBulk(TComboBox *ACombo, ISLiteDVRDahuaBulkCamerasConfigurationManager* ABulk)
    {
      for (int i = 0; i < ACombo->Items->Count; i++)
      {
        TIdentObjChannel* Item = dynamic_cast<TIdentObjChannel*>(ACombo->Items->Objects[i]);
        if (Item)
          Item->Reserved = ABulk->BulkChannelReservation[Item->FriendlyChannel];
      }
    }

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 223
    Points : 28 213
    Points
    28 213
    Par défaut
    A l'heure actuelle, j'ai pris la solution de ne pas l'afficher. Mais effectivement ça pose problème pour les éléments ou c'est justement cet item qui y est renseigné puisque ça apparaît alors vide.

    Moi, je partais sur l'idée de ne pas pouvoir du tout le sélectionner dans la liste, je n'avais pas pensé au traitement sur validation en cas de sélection
    A défaut d'autres solutions, j'étudierais ton idée et essayerais de décortiquer ton code (surtout le traduire en delphi).

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Je ne crois pas que c'est soit possible en natif avec le TcxCombobox.

    • Comme le suggère ShaiLeTroll il faut gérer sur la validation (ou onChange, OnCloseup) pour ne pas accepter les items 'disabled' ET tu dois pouvoir gérer l'affichage de ceux-ci dans l'évènement OnDrawItem.
    • Sinon il y a un composant qui au lieu d'avoir une liste déroulante toute simple, affiche une grille. La grille est une TcxGrill on doit pouvoir gérer l'affichage personnalisé de celle-ci.
    • Ou tu peux aussi créer ton composant peut être en t'inspirant du TcxCheckCombobox (je ne suis pas certain du nom) C'est une combobox avec une liste d'item avec Checkbox. Masquer les checkbox, détourner la propriété pour gérer la notion 'Enabled' des items et griser l'affichage.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/02/2012, 16h48
  2. ComboBox rendre de items non clickables
    Par Bernard B dans le forum Composants VCL
    Réponses: 1
    Dernier message: 03/06/2008, 17h35
  3. [Joomla!] comment rendre un menu visible mais non cliquable dans joomla
    Par tcone dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 08/02/2007, 23h25
  4. Récupérer un élément d'une combobox non sélectionnée
    Par skytofer31 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/12/2006, 14h50
  5. Réponses: 2
    Dernier message: 26/07/2006, 12h32

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