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

Lazarus Pascal Discussion :

Exclusion d'un groupe de CheckBox comme des Radiobutton [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 286
    Points : 288
    Points
    288
    Par défaut Exclusion d'un groupe de CheckBox comme des Radiobutton
    Bonjour à tous,

    Bah, je sais vous allez me dire pourquoi faire compliqué quand on peut faire simple! Ben le RadioButton ne me plait pas, je trouve plus joli les petites cases à cocher. Mais voilà, il faut qu'elle se comportent comme des boutons radio, donc un seul choix possible. Je pensais y arriver en faisant appel à l'identification centralisée des composant sur la fenêtre, mais ça coince.

    Nom : Img1.jpg
Affichages : 85
Taille : 27,7 Ko

    Tous les évènements des cases à cocher sont centralisées sur le Séparateur Tab (c'est une petite appli de conversion de fichier CSV)

    L'algorithme semble fonctionner:
    1. Je parcours tous les composants de la fenêtre
    2. Lorsque j'identifie une CheckBox, je regarde son nom pour voir s'il correspond à celui de l'évènement
    3. Si c'est le Bon Nom -> CS
    4. mini boucle d'action pour checker la case sélectionnée et Décherckher les autres

    Problème:
    Le code ci-dessous est bon avec l'affichage des composants à Décocher, mais si à la place je mets l'action TCheckBox(FindComponent(NomCheckSepar[i])).Checked := False; ça plante (En rouge dans le code) => Voir ci-Dessous


    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
    procedure TForm1.CkBTabClick(Sender: TObject);
        Const NomCheckSepar : array[0..4] of String = ('CkBTab','ChBSapce','ChBPtComma','ChBComma','ChBOther');
        Var C, i  : word;
               CS : String;// nom de la checkBox choisie
    begin
      For C := 0 To ComponentCount -1 do
      begin
        if Components[C] is TCheckBox then
        begin
           if Components[C].Name = TCheckBox(Sender).Name then
           begin
              CS := TCheckBox(Sender).Name;
              For i := 0 to 4 do
              if CS = NomCheckSepar[i] then TCheckBox(FindComponent(CS)).Checked := true
                                                     else  Showmessage(NomCheckSepar[i]); //TCheckBox(FindComponent(NomCheckSepar[i])).Checked := False;
              break;
          end;
        end;
      end;
    end;
    Nom : Img2.jpg
Affichages : 84
Taille : 47,6 Ko

    ça vient peut être du nom du composant, je n'ai pas retrouvé le type des noms de composant, j'ai mis du string...

    Merci, pour ceux qui sont un peu tordu comme moi, Lol
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour ! J'ai trouvé cette solution, qui fonctionne chez moi.

    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
    var
      Force: boolean = FALSE;
     
    procedure TForm1.CheckBox1Change(Sender: TObject);
    var
      C: integer;
    begin
      if Sender is TCheckBox then
      begin
        if Force then
          Exit;
     
        if not TCheckbox(Sender).Checked then
          TCheckbox(Sender).Checked := TRUE
        else
        begin
          Force := TRUE;
     
          for C := 0 To ComponentCount - 1 do
            if (Components[C] is TCheckBox) and (Components[C] <> Sender) and TCheckbox(Components[C]).Checked then
              TCheckbox(Components[C]).Checked := FALSE;
     
          Force := FALSE;
        end;
      end;
    end;
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonsoir,
    Si tes CheckBoxes sont dans une GroupBox, ce type de code fonctionne sur le OnMouseUp :
    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
    procedure TForm1.CheckBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Clicked: TCheckBox;
      GroupBox: TGroupBox;
      Brother: TControl;
      i: integer;
    begin
      Clicked := TCheckBox(Sender);
      GroupBox := TGroupBox(Clicked.Parent);
      for i := 0 to GroupBox.ControlCount-1 do
      begin
        Brother := GroupBox.Controls[i];
        if Brother is TCheckBox then
        begin
          TCheckBox(Brother).Checked := ( Brother = Clicked );
        end;
      end;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 286
    Points : 288
    Points
    288
    Par défaut
    Merci tourlourou Roland vos solutions fonctionnent!
    Je programme en Lazarus 3.2.2 sous windows 10 pro

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2011, 15h17
  2. [checkbox] Récupération des valeurs de checkbox
    Par chng001 dans le forum Struts 1
    Réponses: 13
    Dernier message: 07/09/2009, 20h31
  3. [JPEG] Traiter des Jpg comme des Bmp : Canvas
    Par Clorish dans le forum Langage
    Réponses: 9
    Dernier message: 20/07/2005, 11h14
  4. [struts] [checkbox] récupération des valeurs cochées
    Par abourell dans le forum Struts 1
    Réponses: 16
    Dernier message: 10/06/2005, 20h58

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