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 :

ComboBox et idée saugrenue


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Par défaut ComboBox et idée saugrenue
    Bonjour tout le monde,

    J'ai une question à vous soumettre : y a-t'il un moyen de rendre certains items d'un combobox inutilisables. Je voudrais que certains items soient grisés et ne puissent être utilisés mais en restant visibles. Est-ce posible ?

    Dans l'affirmative, comment pourrais-je m'y prendre pour faire cela ?

  2. #2
    Membre éprouvé Avatar de XristofGreek
    Inscrit en
    Août 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 164
    Par défaut
    Personnellement, ça m'étonnerait fort que ce soit possible parce je n'ai jamais vu ça sous Windows.
    Ceci dit c'est une idée interessante il faudrait en parler à Microsoft ou au concepteur de Delphi.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Houlà... Je vois bien une solution, mais à mon avis, il faudra réécrire un nouveau composant...

    En fait, tu peux dessiner comme tu le veux tes composants, en modifiant la propriété Style en OwnerDraw : ça, ça va te permettre de "griser" certaines lignes ou pas en fonction d'une propriété tableau indexée sur la propriété Items (tu devrais pouvoir utiliser la propriété Objects du TStrings pour ça). Mais ça demande à rajouter un tel comportement au TComboBox qu'un nouveau composant me semble nécessaire.
    Tu devrais également pouvoir t'en sortir en surchargeant la méthode DrawItem de TCustomComboBox, si tu veux partir d'un cran plus haut.

    Ensuite, sur changement, tu vas surcharger la méthode Change (ou même Changed, suivant ce qui sera nécessaire), qui génère l'évènement OnChange. Si l'item sélectionné est "grisé", alors tu reviens au précédent, ou tu prends l'item non-grisé le plus proche, ou tu te contentes de ne pas générer l'évènement, suivant tes choix.

    Est-ce suffisament clair pour toi ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre chevronné Avatar de chtiot
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 385
    Par défaut
    apparemment su torry.net tu devrais trouver quelque chose pour faire ce que tu veux :

    http://www.torry.net/pages.php?id=134

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 815
    Par défaut
    Salut , le composant checklistbox ne ferai t il pas l'affaire ?? , tu peux agir sur les enabled , checked ... de chaque items de ta liste !
    tu peux toujours associer ce composant a un Tedit et jouer sur la taille de la listebox pour creer un combo artificiel.

    Bye

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Par défaut
    Je viens de faire un test et ce n'est pas si compliqué que ca :
    Suffit d'utiliser :
    - un tableau integer : celui-ci aura tous les ItemsIndex devant être désativé.
    - Ue var Integer récupérant le dernier ItemIndex de Combobox avant changement.

    Et c'est tout :

    Exemple

    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
     
    ......
    var
      Form1: TForm1;
      Prev_Index : Integer;
     ....
    procedure TForm1.ComboBox1Select(Sender: TObject);
    begin
    If Combobox1.ItemIndex mod 2 = 0 then
    Combobox1.ItemIndex := Prev_Index  ;
    end;
     
    procedure TForm1.ComboBox1DropDown(Sender: TObject);
    begin
    Prev_Index :=  Combobox1.ItemIndex ;
    end;
     
    .......
    Voici un maigre exemple qui donne pas la sélection aux ItemIndex divisibles par 2.

    Avec quelques lignes de code en plus pour dessiner la liste et le tour est joué.

    C'est bien de celà qu'on parle là ?

  7. #7
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Ben, là j'ai une solution.

    Prends une fiche avec :
    - 1 TComboBox
    - 1 TEdit
    - 1 BTButton

    Dans la propriété Items de ta TComboBox tu écris par exemple :
    (voir propriété Names et Values de la classe TStringList pour comprendre : à gauche du signe egal, ce sont les Names à droite les values)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Texte1=O
    Texte2=N
    Texte3=O
    Texte4=O
    Texte5=N
    Texte6=N
    Les parties Names serviront à remplir la liste
    Les parties Values serviront d'indicateur : O pour dire que l'item est actif, N dans l'autre cas...

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Sockets, StdCtrls;
     
    type
      TForm1 = class(TForm)
        ComboBox1: TComboBox;
        Edit1: TEdit;
        Button1: TButton;
        procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
          Rect: TRect; State: TOwnerDrawState);
        procedure ComboBox1DropDown(Sender: TObject);
        procedure ComboBox1Select(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure Desactiver(Index:integer);
        function TrouverNouvelIndex:integer;
      end;
     
    var
      Form1: TForm1;
      Prev_Index : Integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
      with (Control as TComboBox).Canvas do
      begin
        FillRect(Rect);
        if Index >= 0 then
        begin
          if (Control as TComboBox).Items.ValueFromIndex[index]='O'
          then font.Color:=clblack else Font.Color:=clDkGray;
           TextOut(Rect.Left + 2, Rect.Top, (Control as TComboBox).Items.Names[Index]);
        end;
      end;
    end;
     
    procedure TForm1.ComboBox1DropDown(Sender: TObject);
    begin
      Prev_Index:=Combobox1.ItemIndex ;
    end;
     
    function TForm1.TrouverNouvelIndex:integer;
    var i,NewIndex:integer;
    begin
      with Combobox1 do
      begin
        If Items.ValueFromIndex[ItemIndex]='N' then
        begin
          if Items.ValueFromIndex[Prev_Index]='O'
          then NewIndex:=Prev_Index
          else begin
                 NewIndex:=-1;
                 while ((i<Items.count) and (Items.ValueFromIndex[i]='N')) do inc(i);
                 if i<Items.count then NewIndex:=i;
               end;
          ItemIndex:=NewIndex;
        end;
        result:=ItemIndex;
      end;
    end;
     
    procedure TForm1.ComboBox1Select(Sender: TObject);
    begin
      TrouverNouvelIndex;
      //exemple
      Edit1.text:=Combobox1.items.Names[Combobox1.ItemIndex];
    end;
     
    procedure TForm1.Activer(Index:integer);
    begin
      Combobox1.Items.ValueFromIndex[Index]:='O';
    end;
     
    procedure TForm1.Desactiver(Index:integer);
    begin
      Combobox1.Items.ValueFromIndex[Index]:='N';
      TrouverNouvelIndex;
      //exemple
      Edit1.text:=Combobox1.items.Names[Combobox1.ItemIndex];
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Desactiver(ComboBox1.ItemIndex);
    end;
     
    end.
    ça te va ?

  8. #8
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Si tu veux surligner les items indisponibles en rouge, tu as aussi

    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
     
    procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    var OldBrushColor:TColor;
    begin
      with (Control as TComboBox).Canvas do
      begin
        OldBrushColor:=Brush.Color;
        if Index >= 0 then
        begin
          if (Control as TComboBox).Items.ValueFromIndex[index]='O'
          then Brush.Color:=OldBrushColor else Brush.Color:=clRed;
          FillRect(Rect);
           TextOut(Rect.Left + 2, Rect.Top, (Control as TComboBox).Items.Names[Index]);
        end;
      end;
    end;

  9. #9
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    moi j'apte pour portu et Mac LAK
    +portu: si la ligne sélectionné et dans le tableau des intérdit alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     combobox.itemindex:=-1;

  10. #10
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par edam
    moi j'apte pour portu et Mac LAK
    +portu: si la ligne sélectionné et dans le tableau des intérdit alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     combobox.itemindex:=-1;

    Ben quoi... mon truc fait exactement ce qu'il souhaite nan ?

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  3. Réponses: 1
    Dernier message: 13/01/2003, 09h26
  4. combobox et readonly
    Par Mac leod dans le forum C++Builder
    Réponses: 6
    Dernier message: 28/11/2002, 10h27
  5. combobox->text
    Par clovis dans le forum C++Builder
    Réponses: 18
    Dernier message: 21/06/2002, 15h43

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