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

Delphi Discussion :

[CheckListBox] avec un seul item coché ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut [CheckListBox] avec un seul item coché ?
    Bonjour

    Je bute devant un problème tout bête...

    Je cherche la méthode afin d'obtenir dans une CheckListBox qu'un seul item coché possible, oui un seul = celui coché tout simplement.

    J'ai cherché un peu partout, même en compos spécifiques et choux-blanc...

    Je peux très bien bricoler un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
         if CheckListBox1.Checked[0] = true then
      begin
         (tous les autres items décochés)
     
         if CheckListBox1.Checked[1] = true then
      begin
    (tous les autres items décochés, etc.)
    ...
    Mais je ne peux savoir quel sera le nombre d'items d'avance...

    Merci de vos idées !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Ce que tu cherches à faire n'est pas le rôle des checkbox, mais celui des Radiobutton.

  3. #3
    Membre éprouvé
    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 : 54
    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
    Par défaut
    Bonsoir,
    C'est tout de même faisable, si il veut garder le coté 'case a cocher' de la chose.
    Un exemple de code, avec le 'cousin' CBuilder, donc a adapter :
    dans l'évènement OnClickCheck...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TForm::CheckListBoxClickCheck(TObject *Sender)
    {
    for (int i = 0; i < CLB->Items->Count; i ++)
    {
            if ( i != CLB->ItemIndex && CLB->Checked[i] == true )
            {
                    CLB->Checked[i] = false;
            }
    }        
    }
    En espérant t'être utile,
    @ +

  4. #4
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Petit à petit... ;-)
    Bonjour,

    Je viens de trouver une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
      var
         i: integer;
      begin
     
    //------------------
    for i := 0 to N do
    CheckListBox1.Checked[i] := false;
     
    CheckListBox1.Checked[C] := true;
    //ShowMessage(IntToStr(C));
    //------------------
    end;
    Je précise que la variable N représente le nombre total d'items et C, celui cliqué.

    Mais faut encore peaufiner, car cela ne fonctionne que dans un sens

    Merci de vos messages et aide !

    PS : Sunchaser, j'ai tenté la conversion du cousin, mais pas tiré grand-chose, mais c'est tout de même sympa de ta part

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par J-P
    Bonjour,

    Je viens de trouver une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
      var
         i: integer;
      begin
    
    //------------------
    for i := 0 to N do
    CheckListBox1.Checked[i] := false;
    
    CheckListBox1.Checked[C] := true;
    //ShowMessage(IntToStr(C));
    //------------------
    end;
    Je précise que la variable N représente le nombre total d'items et C, celui cliqué.

    Mais faut encore peaufiner, car cela ne fonctionne que dans un sens
    Alors ta blucle n'est pas bonne et devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := 0 to N-1 do
    CheckListBox1.Checked[i] := false;
    Et j'ajoute que je ne comprends pas cette volonté d'utiliser un composant hors de sa destination normale, car je vois au moins trois raisons s'opposant à ta démarche , la troisième étant une conséquence des 2 premières:

    1 - Voir des CheckBox réagir comme des RadioButton va contre les habitudes des utilisateurs.

    2 - Utiliser les standards va dans le sens de la facilité de prise en main d'un nouveau logiciel.

    3 - Compte tenu des 2 raisons précédentes, au lieu de développer ce qui est vraiment utile à ton programme, tu passes du temps à faire quelque chose qui par ailleurs fonctionne parfaitement.

    Si malgré cela tu persistes dans cette voie, je pense qu'il serait plus simple de dériver un RadioButton, en personnalisant sa représentation, plutôt que d'essayer de forcer une exclusivité pour un type de composant non prévu pour, au contraire.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 60
    Par défaut
    Je propose deux autres solutions, afin de ne pas faire de for a chaque clique.

    Socker l'index de la dernière checkbox dans une variable global ou la proriété Tag de la CheckListBox, ainsi, à chaque clique, on décoche l'ancien index, et on coche le nouveau.

    Mais sinon, le TCustomListBox qui est la classe parente de TCheckListBox contient une propriété MultiSelect qu'il suffit de mettre à False.

  7. #7
    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
    Citation Envoyé par thewho
    Bonjour,

    Ce que tu cherches à faire n'est pas le rôle des checkbox, mais celui des Radiobutton.
    c'est a peut prés vrait; mais si il ajoute tros d'element , le checkbox a un assenceur:
    je prpose:
    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, CheckLst;
     
    type
      TForm1 = class(TForm)
        Box1: TCheckListBox;
        procedure Box1ClickCheck(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    var  PoseCheck:integer=-1;
     
    procedure TForm1.Box1ClickCheck(Sender: TObject);
    var  i,j,p:integer;
    begin
         j:=0;
         for i:=0 to box1.Count-1 do
           if (box1.Checked[i]) then
              begin
               inc(j);
               if (i<>PoseCheck) then p:=i;
              end;
         if j>2 then exit;//normalement etat impossible
         if j=0 then
           begin
             Box1.Checked[PoseCheck]:=true;//car il faut au moins une case coché
             exit;// traitement déjà fait
           end;
         if j>1 then Box1.Checked[PoseCheck]:=false;//si c'est pas la premiére coche
         PoseCheck:=p;
         //....
         //traitement
         //....
    end;
     
    end.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/07/2006, 17h29
  2. comment remplir 2 champs avec une seule listbox
    Par Didi17 dans le forum Access
    Réponses: 3
    Dernier message: 19/10/2005, 09h42
  3. plusieurs tables avec un seul DBnavigator et DBGRID
    Par warrior dans le forum Bases de données
    Réponses: 8
    Dernier message: 07/06/2005, 08h12
  4. Plusieurs commandes avec 1 seule R-commande
    Par pouldo dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 01/04/2005, 18h44
  5. [MFC] MDI avec 1 seul document à la fois
    Par bigquick dans le forum MFC
    Réponses: 21
    Dernier message: 03/03/2005, 14h44

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