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

IHM Discussion :

Fonction qui coche elements formulaire


Sujet :

IHM

  1. #1
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut Fonction qui coche elements formulaire
    Bonjour,

    J'utilise frequemment des systemes qui vont me cocher des cases dans mes formulaires.

    Ma demarche est de construire une fonction qui cochera.

    1°/ Creer des constantes avec les noms de mes controles et formulaires. Quand j'appel ma fonction setConst(), ca me retournera donc la valeur stockées en constante

    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
    Option Explicit
     
    'Constantes
     
    'FORMULAIRES
        'TRANSACTION
        Public Const SAVE As String = "[Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE]"
        Public Const SAVE2 As String = "[Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE2]"
     
     
     
    Public Function setConst(id As String) As Variant
     
        Select Case id
     
            'FORMULAIRES
                'TRANSACTION
     
            Case "SAVE"
                setConst = SAVE
            Case "SAVE2"
                setConst = SAVE2
     
        End Select
     
     
    End Function
    2°/un Sub qui a pour but de cocher l'élément (cest la que ca foire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub Coche(id As String, Action As Boolean)
     
    Dim vControle As Variant
     
        vControle = setConst(id) 'je recupere le nom du controle
     
        vControle = Action ' je lui affecte true ou false
     
    End Sub

    3°/ J'appel mon sub


    Je n'ai pas d'erreur mais il ne se passe rien.

    Je pense qu'il se contruit bien ce que que je souhaite dans le code:

    la finalité étant d'avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE] = True
    Mais il ne doit pas voir le nom du controle comme du code, mais comme un string, enfin je sais pas trop, ou sinon il affecte à vControle le string du controle puis derriere il lui affecte true, mais il ne retourne pas la commande à exectuer, j'ai essayer des set et return, mais je ne maitrise pas.

    MErci encore

  2. #2
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,

    Il devrait y avoir plus simple.

    Une fonction qui reçoit en paramètre le nom du formulaire.
    Puis parcours des contrôles du formulaire. Si le controle est une case à cocher alors on met à True.

  3. #3
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    Il peux y avoir plusieurs coches sur un meme formulaire ou sous formulaire.

    Je suis encore plus incapable de construire cette fonction.

    ma question est tout simplement: peux on exécuter une string.

    C'est à dire 'retourner' une string 'pour le code' (pour vba

    j'ai trouvé la fonction Eval()

    j'ai fait ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub Coche(id As String, Action As Boolean)
     
     
    Dim vControle As String
     
     
        vControle = setConst(id) & " = " & Action
     
     
        Eval (vControle)
     
    End Sub
    j'ai une erreur: impossible de trouver le nom "vrai" entré dans l'expression

  4. #4
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    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
    Sub majCaseaCocher(frm As Form)
     
        Dim Ctrl As Control
     
        For Each Ctrl In frm.Controls
            If Ctrl.ControlType = acCheckBox Then
                MsgBox "case à cocher"
            End If
        Next
     
    End Sub
     
    Sub testcaseacocher()
     
    majCaseaCocher [Forms]![NomFormulaireàTester]
     
    End Sub

  5. #5
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    mais cette fonction m'obligerais à déclarer 2 constantes, chez moi.

    Le nom du formulaire et le nom de la case que je souhaite cocher.

    Comme je peux avoir plusieurs coche sur un meme formulaire....

    il n'y a pas de solutions avec le Eval()? j'ai bcp tester et jai pas trouver.

  6. #6
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Tu peux ajouter un paramètre à la fonction. Le nom de la case à cocher par exemple.

    Et puis il me semble que tu déclares déjà 2 constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Const SAVE As String = ...
    Public Const SAVE2 As String = ....

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Là tu travailles sur des chaines de caractères. A tout déclarer en variant, y a plus rien qui fonctionne.

    De toute façon, tu ne peut pas accéder à un contrôle comme cela. Et l'utilité de développer une fonction générique sur une seule chaine est plus que discutable.

    Soit tu accèdes au contrôle directement dans ta fonction, soit tu revoir l'entête de la fonction pour avoir quelque chose de plus précis où l'on spécifie le nom du formulaire, le nom du contrôle et le nom optionnel du sous formulaire.

    De toute façon, en plaçant la fonction dans le code du formulaire, le problème ne se pose même plus puisque tu feras directement référence au formulaire avec Me. Il ne restera plus qu'à appeler le nom du contrôle.

  8. #8
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    La fonction est dans une procédure, non pas dans le formulaire...

    Justement, je souhaiterai eviter d'avoir à appeler plus de 1 parametre dans ma fonction. Meme si je devais appeler les 2,3 parametres, je ne sais pas comment transformer un string en expresion à executer, avec le eval() ca fonctionne pas.

    Pour moi l'idéal:

    1°/ declarer une constante globale indiquant le form, le sous form et le controle.

    2°/ une fonction qui appel la constante du controle avec form et sous form, et la valeur à mettre, true or false.

    Coche(maConst As String, MaVal As Boolean)
    monForm = GetValConst(maConst)

    attribue a monForm la valeur MaVal

  9. #9
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    La fonction est dans une procédure, non pas dans le formulaire...
    Dans un module plutot non ?

    Pour le reste ça me parait bien complexe du fait qu'il est possible d'imbriquer jusqu'à 7 niveaux de formulaires sous certaines versions d'Access.

    Donc l'extraction des noms de contrôle est complexe.

    Aprés tu peux bidouiller un truc genre : la constante est définie par :

    NomForm,NomSousForm,NomControle

    Et tu n'as plus quà splitter la chaine dans un tableau T() et l'objet control sera obtenu par

    Set Ctl=Forms(T(0)).Controls(T(1)).Form.Controls(T(2))

    Avec la gestion d'erreur qui va bien :

    Cas d'existence du formulaire, du sous form, etc...

    Perso je trouve ça plutot inutile sans compter que c'est moins clair au deboggage.

    Je prefere voir l'appel direct de mes contrôles plutot que de switcher dans un module pour connaitre son nom, puis une fonction pour sa valeur, etc.

    Justement, je souhaiterai eviter d'avoir à appeler plus de 1 parametre dans ma fonction
    Et la valeur à modifier, tu la mets où ?

  10. #10
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    oui tu as raison, il me faut 2 appels.

    Mais ca me semble bien compliquer de splitter ma constantes en 3, d'autant plus que je ne sais pas le declarer.

    Ce que je ne comprends pas:

    Si je met ca dans mon formulaire, ca fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE] = True

    J'arrive à recreer une string qui me donne exactement cette ligne.

    La seule chose est que je veux qu'il l'execute cette string.
    A partie du moment ou j'arrive à avoir ce resultat, peu importe comment je l'ai eu, n'y as t'il pas moyen de l'exectuer?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    StringAExecuter = "[Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE] = True"
     
    Comment executer StringAExecuter, sachant que si je met Eval(StringAExecuter), ca ne passe pas

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Non.

    Un string est une string,
    un control, un control.

  12. #12
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    c'est complètement aberrant ...
    je te conseille vraiment de te pencher sur la solution de Tofalu, Split() n'est pas bien compliqué.

    Citation Envoyé par hugo69
    ../..
    La seule chose est que je veux qu'il l'execute cette string.
    A partie du moment ou j'arrive à avoir ce resultat, peu importe comment je l'ai eu, n'y as t'il pas moyen de l'exectuer?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    StringAExecuter = "[Forms]![2Transactions]![2Transactions_SF].[Form]![SAVE] = True"
     
    Comment executer StringAExecuter, sachant que si je met Eval(StringAExecuter), ca ne passe pas
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  13. #13
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    Ok, je n'avais pas bien compris le split.

    Voic donc ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub Coche(frm As String)
    Dim T() As String
    Dim Ctl As Variant
    T() = Split(setConst(frm), ",")
     
    Set Ctl = Forms(T(0)).Controls(T(1)).Form.Controls(T(2))
    Ctl = True
    End Sub
    setConst me retourne la valeur de la constante.
    Si je fais un msgBox t(0), t(1) et t(2), j'ai bien les bonnes valeurs.
    Par contre si je lance ma procédure, rien ne se passe, pas de message d'erreur, pas de coche ni rien.

    Ou me suis trompé?

  14. #14
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Encore du variant ...

  15. #15
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    Ca y est j'ai trouver:

    Ca fonctionne , merci beaucoup pour votre patience que j'ai mis à rude epreuve.

    Si je ne met pas variant, je met quoi? String?

  16. #16
    Membre régulier Avatar de hugo69
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    512
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 512
    Points : 122
    Points
    122
    Par défaut
    Voici la soluce complète pour ceux qui pourraient etre interessés.

    1/On declare les constantes, (si pas de sous formulaires, on fini par une virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Const SAVE As String = "[2Transactions],[2Transactions_SF],[SAVE]"
        Public Const SAVE2 As String = "[2Transactions],[test],"
    2/On fait une fonction qui recupere la valeur des constantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function setConst(id As String) As Variant
     
        Select Case id
     
            Case "SAVE"
                setConst = SAVE
            Case "SAVE2"
                setConst = SAVE2
     
        End Select
     
     
    End Function
    3/On fait une fonction qui a pour mission d'attribuer la valeur à la check box:

    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
    Public Sub Coche(frm As String, Action As Boolean)
     
    Dim T() As String
    Dim Ctl As Variant
     
        'on met les noms de formulaire, sous-formulaire et control dans un tableau
        T() = Split(setConst(frm), ",")
     
        If T(2) = "" Then
     
            'si t2 est null, on a pas de sous-formulaire
            Set Ctl = Forms(T(0)).Controls(T(1))
     
        Else
     
            'On construit le controle formulaire
            Set Ctl = Forms(T(0)).Controls(T(1)).Form.Controls(T(2))
     
        End If
     
        'on attribue la valeur
        Ctl.Value = Action
     
    End Sub

    4/On appel le sub dans notre formulaire:


    Merci à tous

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

Discussions similaires

  1. [XQUERY] fonction qui retourne un element
    Par mflat2 dans le forum XQUERY/SGBD
    Réponses: 0
    Dernier message: 27/06/2010, 11h25
  2. fonction qui modifie un formulaire dans la fenetre mere
    Par dirty_harry dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 04/06/2009, 14h53
  3. Réponses: 4
    Dernier message: 02/06/2009, 15h49
  4. fonction qui calcule le nombre de checkbox cochés
    Par namstou3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2007, 13h55
  5. Variable qui évolue en fonction des choix dans formulaire
    Par stefou007 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/09/2005, 22h40

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