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 :

Utillisation groupe de contrôles TCheckBox


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut Utillisation groupe de contrôles TCheckBox
    Bonsoir

    Je dispose sur une feuille de quelques dizaines de checkbox dont la validation ou la "devalidation" génére ou efface une expression dans un RichEdit.
    Ce qui me donne pour chaque CheckBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      if CheckBox1.Checked=true then  AjouteLigneNoire('mon expression1', OMC_REdit)
         else EffacerLigne('mon expression1',OMC_REdit);
    end;
    (AjouteLigneNoire et EffacerLigne etant 2 procedures annexes)

    Cela me fait quelques centaines de lignes de codes pour pas grand chose me semble t il. Avec un peu de reflexion (ca peut servir ) je pense aux tableaux , je trouve cela plus élégant, tout content je passe donc à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Expression : array [1..95] of String;
    OMC_Check : : array [1..95] of TCheckbox;
    Dans la procedure OnCreate j'affecte mes valeurs dans les tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Expression[1] := 'mon expression1';
    ....
    Expression[95] := 'mon expression95';
    OMC_Check[1] := CheckBox1;
    ....
    OMC_check[95] := CheckBox95;
    je commence donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure Tform1.OMC_Click(i : integer ? )
    begin
      if OMC_Check[i].Checked=true then  AjouteLigneNoire(Expression[i], OMC_REdit)
         else EffacerLigne(Expression[i],OMC_REdit);
    end;
    et la j'ai un grand moment de solitude comment passer l'indice a ma procedure si j'affecte cette procedure a l'evenement Onclick de chaque CheckBox.
    le seul moyen auquel je pense serai de faire pour chaque checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
       OMC_Click(1);
    end;
    soit a nouveau 95 procedures donc mon idée de tableau partirai a la pubelle.

    Quelqu'un aurait une idée, une piste pour m'aider a poursuivre dans cette voie ?
    Par avance merci
    Cordialement

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 633
    Billets dans le blog
    65
    Par défaut
    slt

    et si chaque checkbox avait un Tag egal a ton indice ?

  3. #3
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    je rejoins sergio pour l'utilisation des Tag comme vôtre soucie est de réduire le nombre de lignes je te propose d'affecté une seule procédure onclick pour tous tes checkBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
       OMC_Click((Sender as TCheckBox).Tag);
    end;
    @+ aityahia

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Oui la meilleur solution est d'aller dans l'ongler Evenement de l'inspecteur d'objet, cliquer sur l'evenement "OnClick" et ensuite nomer "a la main" un nom de procedure (CheckBoxClick par exemple). Une fois le nom saisi, un doubleclick permet de renomer/creer le gestionaire d'evenement associé a ce composant.

    Ensuite, en utilisant la combobox de l'inspecteur de proprietees, on peux choisir pour tous les autres composant le meme gestionnaire. (Une selection multiple accelere les choses).

    Uen fois tous les composant associés au meme gestionnaire, la personalisation se fait en utilisant le parametre sender :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Sender = Self.MonCheckBox1 Then TCheckBox(Sender).XXX

  5. #5
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    Citation Envoyé par Clorish Voir le message

    [CODE]If Sender = Self.MonCheckBox1

    clorish je ne vous suis pas très bien la.

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Sender est une variable de type TObject qui pointe vers l'objet qui a declangé le gestionaire. Justement pour les cas qui nous interesse, savoit "QUI" a declenché le gestionnaire en cas d'association multiples.

    Sender etant une adresse, on peut donc la comparer avec tout autres adresses.
    Sender = UnComposantCheckBox signifie que les 2 variable pointent bien vers le meme objet : Celui qui a declanché l'evenement.
    Donc pas besoin de TAG pour differencier les objets qui appellent ce gestionnaire.

    Sender etant defini comme TObject, il ne nous permet d'acceder qu'aux methodes de TObject contenu dans notre objet CheckBox. Donc pour acceder aux autres, il faut le caster : TCheckBox(Sender).UneMethodeDeCheckBox.

    Pour etre plus propre il faudrais s'assurer de l'heritage par un test "If Sender.InheritsFrom(TCheckBox)" avant tout cast .. mais notre test nous assurant que l'objet pointe par Sender est bien identique a l'objet que l'on attends (MonCheckBox1 dans mon exemple) on s'assure par la meme que c'est un TCheckBox (MonCheckBox1 a ete defini comme TCheckBox ....) on peut donc se passer du test "inheritsFrom".

    Voila

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

Discussions similaires

  1. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 12h09
  2. [VB] Possibilité de créer un double groupe de contrôles ?
    Par Laialexela dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/12/2005, 09h03
  3. Réponses: 3
    Dernier message: 27/11/2005, 14h04
  4. [C#] groupes de contrôles
    Par annalady dans le forum C#
    Réponses: 5
    Dernier message: 18/11/2005, 07h25
  5. Réponses: 8
    Dernier message: 01/11/2005, 22h48

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