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 :

Problème avec des checkbox


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut Problème avec des checkbox
    Bonjour,

    Je créé une application contenant plusieurs Tablesheets, comprenant elles-mêmes plusieurs checkboxes, se trouvant dans différents TGroupbox.

    Chaque checkbox porte un nom en fonction de l'onglet où elle se trouve. Par exemple, :
    Onglet Ecrire :
    Checkbox1 nom : P1EcrireC1
    Checkbox2 nom : P1EcrireC2
    Checkbox3 nom : P1EcrireC3
    ...

    Je voudrais savoir comment il est possible que lorsque je clique sur une chekbox, un compteur s'incrémente (et se décrémente si je reclique dessus) sans avoir à programmer la même routine pour chaque checkbox, et pour chaque Tgroupbox.

    J'ai réalisé une routine de ce genre, mais cela ne semble pas fonctionner :
    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
     
    procedure Tmatieres.EcrireContextPopup(Sender: TObject; MousePos: TPoint;
      var Handled: Boolean);
      var compteurecrire, i : integer;
    begin
    compteurecrire := strtoint(edit2.Text);
    for I := 0 to ControlCount - 1 do
    begin
        if Ecrire.controls[i].checked = true then
    begin
      compteurecrire := compteurecrire + 1;
      edit2.Text := inttostr(compteurecrire);
    end;
    end;
    end;
    Merci pour votre aide éventuelle.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 675
    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 675
    Points : 25 487
    Points
    25 487
    Par défaut
    Il suffit de mettre le même gestionnaire d'évèmenent OnClick pour toutes les CheckBox et utiliser le Sender pour savoir sur quelle CheckBox on a cliqué ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.CompteurCheckBoxClick(Sender: TObject);
    begin
      if Sender is TCheckBox then
        if TCheckBox(Sender).Checked then // le = true est implicite !
          Inc(compteurecrire)
        else
          Dec(compteurecrire);
    end;

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    salut;

    je crois qu'il faut faire ça au niveau de l'évènement onCheked (pourvu que je me souviens).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure btCheked(Sender : Object)
    begin
      if bt.Cheked then inc(i) else dec(i);
    end;
    autre chose ta variable (compteur) est locale donc écrasement à chaque appel de la procédure donc pas de résultat escompté.

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Il suffit de mettre le même gestionnaire d'évèmenent OnClick pour toutes les CheckBox et utiliser le Sender pour savoir sur quelle CheckBox on a cliqué ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.CompteurCheckBoxClick(Sender: TObject);
    begin
      if Sender is TCheckBox then
        if TCheckBox(Sender).Checked then // le = true est implicite !
          Inc(compteurecrire)
        else
          Dec(compteurecrire);
    end;
    c'est mieux que ma solution. bravo ShaiLeTroll

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Merci Shai le Troll. Toujours fidèle au poste à ce que je vois. Et tant mieux pour les débutants dans mon genre!....

    Une chose que je ne comprends pas (néophyte que je suis).

    Le nom de ta procédure :
    procedure Tmatieres.CompteurCheckBoxClick(Sender: TObject);

    CompteurCheckboxClick, fait référence à un objet?

    Merci d'éclairer ma lanterne.

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par breizh44 Voir le message
    Merci Shai le Troll. Toujours fidèle au poste à ce que je vois. Et tant mieux pour les débutants dans mon genre!....

    Une chose que je ne comprends pas (néophyte que je suis).

    Le nom de ta procédure :
    procedure Tmatieres.CompteurCheckBoxClick(Sender: TObject);

    CompteurCheckboxClick, fait référence à un objet?

    Merci d'éclairer ma lanterne.
    Si je puis me permet Troll,
    ceci est un évenement que tu placera sur chaque check box dans l'évenement OnClick.

    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    donc, je mets dans l'événement OnClick de chaque checkbox CompteurCheckBoxClick.
    Mon code ressemble à ça désormais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure Tmatieres.CompteurCheckBoxClick(Sender: TObject);
    var compteurecrire : integer;
    begin
    edit2.Text := inttostr(compteurecrire);
      if Sender is TCheckBox then
        if TCheckBox(Sender).Checked then
           Inc(compteurecrire)
                       else
        Dec(compteurecrire);
        end;
    Mais ma valeur de compteur ne s'incrémente, ni ne se décrémente. Où dois-je l'initialiser?

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par breizh44 Voir le message
    donc, je mets dans l'événement OnClick de chaque checkbox CompteurCheckBoxClick.
    Mon code ressemble à ça désormais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure Tmatieres.CompteurCheckBoxClick(Sender: TObject);
    var compteurecrire : integer;
    begin
    edit2.Text := inttostr(compteurecrire);
      if Sender is TCheckBox then
        if TCheckBox(Sender).Checked then
           Inc(compteurecrire)
                       else
        Dec(compteurecrire);
        end;
    Mais ma valeur de compteur ne s'incrémente, ni ne se décrémente. Où dois-je l'initialiser?
    Si tu a besoin de connaitre ton incrémentation ailleur que dans cette procédure retire le
    Var compteurecrire: integer;

    Et déclare la en variable global cela signifie donc que ta variable compteurecrire sera incrémenter ou décrémenter quelque soit le checkbox de ton Tabsheet utiliser.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Je crois que je me suis mal exprimé depuis le départ.

    En fait, j'ai une forme contenant Un Tablesheet, comprenant lui même des tablesheet dans chacune de ses pages.

    Dans ces pages, j'ai des controlgroupbox, contenant des checkbox.

    Ce que je désire faire c'est savoir combien de checkbox sont validées, par pages des tablesheet. Et donc, voila pourquoi, j'ai un compteur différent à chaque onglet de mon tablesheet.

    J'avais écrit au début un truc dans cegenre là :

    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
     
    procedure Tmatieres.P1LireC1Click(Sender: TObject);
    var compteurlire : integer;
    begin
    compteurlire := strtoint(edit1.Text);
    if P1LireC1.checked = true then
    compteurlire := compteurlire+ 1  ;
    edit1.text := Inttostr(compteurlire);
    if (P1LireC1.Checked = False) then
    if compteurlire > 0 then
    compteurlire := compteurlire - 1;
    edit1.text := Inttostr(compteurlire);
    end;
     
    procedure Tmatieres.P1LireC2Click(Sender: TObject);
    var compteurlire : integer;
    begin
    compteurlire := strtoint(edit1.Text);
    if P1LireC2.checked = true then
    compteurlire := compteurlire+ 1  ;
    edit1.text := Inttostr(compteurlire);
    if (P1LireC2.Checked = False) then
    if compteurlire > 0 then
    compteurlire := compteurlire - 1;
    edit1.text := Inttostr(compteurlire);
    end;
     
    // et ainsi de suite pour toutes les checkboxes de l'onglet concernés.
    Vu que j'ai plus de 300 checkboxes, réparties en diverses groupe, la taille au final de mon programme va être démentielle !...

    Dois-je faire un CompteurCheckBoxP''Nom_de-l-onglet''Click pour chaque onglet et donner un nom de compteur différent?

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 675
    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 675
    Points : 25 487
    Points
    25 487
    Par défaut
    Si tu veux le savoir par Onglet c'est assez simple, si tu as la propriété Tag de libre dans tes TTabSheet, tu peux l'utiliser comme Compteur ... tu n'auras plus qu'à lire chaque TabSheet.Tag pour savoir combien de CheckBox sont cochées par onglet ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.CompteurCheckBoxClick(Sender: TObject);
    begin
      if Sender is TCheckBox then
        if TCheckBox(Sender).Checked then // le = true est implicite !
          Inc(GetTabSheet(TCheckBox(Sender)).Tag)
        else
          Dec(GetTabSheet(TCheckBox(Sender)).Tag);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function GetTabSheet(CheckBox: TCheckBox): TTabSheet;
    var
      Control: TControl;
    begin
       Control := CheckBox;
       repeat
          if Assigned(Control) then
             Control := Control.Parent;
       until not Assigned(Control) or (Control is TTabSheet);
     
       if Control is TTabSheet then
         Result := TTabSheet(Control);
    end;

  11. #11
    Membre émérite 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
    Points : 2 771
    Points
    2 771
    Par défaut
    ou, sans
    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 TFPrincip.Button1Click(Sender: TObject);
    var  n,i,j:integer;
         TS:TTabSheet;
    begin
         caption:='';
         for n:=0 to ComponentCount-1 do
           if Components[n] is TTabSheet then
           begin
             ts:=TTabSheet(Components[n]);
             j:=0;
             for i:=0 to ts.ControlCount-1 do
               if ts.Controls[i] is TCheckBox then
                  if TCheckBox(ts.Controls[i]).Checked then
                     inc(j);
             caption:=caption+'nbr en '+ts.Name+': '+inttostr(j)+' / ';
           end;
    end;

    [Edit] pourquoi tout ces chekbox? c'est pour des droit d'accées ou questionnaire, ou quoi exactement si c'est possible?

  12. #12
    Membre du Club Avatar de tomy_libre
    Enseignant
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 48
    Points
    48
    Par défaut

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Merci Shai Le Troll,

    Je déchiffre ton code....

    Le débogueur me mets l'erreur suivante :

    [Pascal Avertissement] matiereseval.pas(620): W1035 La valeur de retour de la fonction 'GetTabSheet' peut être indéfinie
    [Pascal Erreur] matiereseval.pas(627): E2064 La partie gauche n'est pas affectable
    [Pascal Erreur] matiereseval.pas(629): E2064 La partie gauche n'est pas affectable
    [Pascal Erreur fatale] Logival.dpr(8): F2063 Impossible de compiler l'unité utilisée 'matiereseval.pas'

    D'où cela provient-il?

    PS : Pour réopndre à la question d'Edam, toutes ces checkbox sont en fait des compétences à évaluer. Chaque utilisateur fait son choix des compétences qu'il doit faire évaluer, et ceci dans différentes matières (d'où mes tabsheet comprenant eux-mêmes d'autres Tabsheets).
    Le choix d'une ou plusieurs comppétences me créera un tableau avec en titre de colonnes les dites compétences.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 675
    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 675
    Points : 25 487
    Points
    25 487
    Par défaut
    je n'ai pas essayé, remplace Inc et Dec par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with GetTabSheet(TCheckBox(Sender)) do
      Tag := Tag + 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with GetTabSheet(TCheckBox(Sender)) do
      Tag := Tag - 1;
    Sinon la solution d'Edam est plus intelligente, tu peux recalculer le nombre de points à la fin ... au lieu de le faire en temps réel ...

  15. #15
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    essaie
    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.CompteurCheckBoxClick(Sender: TObject);
    var
      Control: TControl;
    begin
       if Sender is TCheckBox then
       begin
           Control :=TControl(Sender);
     
            while (Control <> nil) and not(Control is TTabSheet) do
                 Control := Control.Parent;
     
          if Control is TTabSheet then
           begin
            if TCheckBox(Sender).Checked then
                Control.Tag:=Control.Tag+1
               else
                Control.Tag:=Control.Tag-1;
           end;
     
        end;
    end;
    une autre solution installe ce composant dérivé de CheckBox
    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
    unit Checkssss;
    interface
    uses
      SysUtils, Classes, Controls, StdCtrls,ComCtrls;
    type
      TCheckssss = class(TCheckBox)
     protected
        procedure Click();override;
      public
        constructor Create(AOwner:TComponent);override;
     
    end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Exemples', [TCheckssss]);
    end;
    {Forms.GetParentForm}
    function GetParentTabSheet(Control: TControl):TTabSheet;
    begin
      while (Control <> nil) and not(Control is TTabSheet) do
            Control := Control.Parent;
     
        if Control is TTabSheet then
          Result := TTabSheet(Control) else
          Result := nil;
    end;
     
    constructor TCheckssss.Create(AOwner:TComponent);
    begin
       inherited Create(AOwner);
       Caption:=Format('%s',[AOwner.Name]);
    end;
     
    procedure TCheckssss.Click();
    var
       ParentPage:TTabSheet;
    begin
        ParentPage:=GetParentTabSheet(Self);
      if Assigned(ParentPage) then
       with ParentPage do
        if Checked then
           Tag:=Tag+1
           else
           Tag:=Tag-1;
     
      inherited;
    end;
     
    end.
    mais il faut que tu change tout tes CheckBox par ceci

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/04/2015, 11h57
  2. [WD14] Problème d'accès natif avec des checkboxes
    Par Baboulinet_ dans le forum WinDev
    Réponses: 8
    Dernier message: 04/02/2013, 09h05
  3. [Tableaux] Problème de foreach avec des checkboxes
    Par nanor21 dans le forum Langage
    Réponses: 10
    Dernier message: 15/05/2006, 01h04
  4. Problème simple avec des checkbox
    Par nanor21 dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2006, 00h26
  5. Problèmes avec des vues
    Par dady dans le forum MFC
    Réponses: 22
    Dernier message: 09/01/2004, 16h26

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