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 :

Modifier la mise en forme d'un formulaire en fonction de l'enregistrement [AC-2003]


Sujet :

IHM

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 15
    Points
    15
    Par défaut Modifier la mise en forme d'un formulaire en fonction de l'enregistrement
    Bonjour,

    J'ai un petit problème avec Access 2003. Je suis en train de faire un formulaire permettant de répondre à un QCM. J'ai donc un formulaire qui est associé à une table Question, qui contient un sous-formulaire associé à une table Choix (en affichage continu). Certaines questions ont une hiérarchisation dans les choix. Pour cela, j'ai défini un champ dans la table Choix qui caractérise le rang du choix. Je voudrais traduire ça par un décalage sur le formulaire, pour que ce soit affiché comme sur l'exemple suivant :

    Rang 1
    Rang 2
    Rang 3
    Rang 3
    Rang 3
    Rang 2
    Rang 2
    Rang 1
    Rang 2
    Rang 2
    Rang 1

    J'ai essayé d'associer à un événement une procédure VBA qui modifie la valeur de la propriété 'Me.Controls("MonControleur").Left' de mes zones de texte et case à cocher, mais je n'arrive pas à obtenir le résultat que je veux. Le seul événement qui produise un effet est "Sur activation" (procédure "Form_Current()"), mais ça affiche tous les choix alignés comme le rang 1, et quand on clique sur un choix de rang 2, tous les choix (rang 1, 2 et 3) se réalignent sur le rang 2.

    J'ai aussi essayé de faire une procédure "Form_Open()" dans mon sous-formulaire (qui se lance donc une fois au démarrage du sous-formulaire), qui parcourt tous les enregistrements du recordset associé, et qui modifie la valeur de 'Me.Controls("MonControleur").Left' mais encore une fois c'est la dernière valeur de la boucle qui est attribué à tous les choix.

    N'y a-t-il pas un événement qui est associé au rendu de chaque enregistrement indépendamment ? Ou alors comment accéder à un contrôleur indépendamment des autres qui portent le même nom ?

    J'espère que ma description est compréhensible. J'espère aussi qu'il est possible de faire ce que je veux, parce que ça fait un petit moment que je cherche. En vous remerciant par avance.

    Rozgann

  2. #2
    Membre actif Avatar de SeaWolf601
    Inscrit en
    Août 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 254
    Points : 256
    Points
    256
    Par défaut
    Hello,

    Si j'ai bien compris tu veux juste une "tabulation" differente si le rang est 1,2 ou 3 ?
    C'est ça ?

    Si c'est ça, une solution que j'utilise est de mettre3 controle sur la ligne, 3 textebox décalées chacune de 1 cm de plus vers la droite que la precedente.
    disont :

    Textbox1 : alignement à gauche : 1cm.
    Textbox2 : alignement à gauche : 2cm.
    Textbox3 : alignement à gauche : 3cm.

    les 3 TextBox doivent être transparentes.

    Une quatrieme Textbox4 invisible contenant le rang.

    et dans chaque textbox, 1,2 et 3. une conditon d'affichage comme source.

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Textbox1 = iif([TextBox4]="Rang1";[Reponse];"")
    Textbox2 = iif([TextBox4]="Rang2";[Reponse];"")
    Textbox3 = iif([TextBox4]="Rang3";[Reponse];"")
    Résultat chaque textbox laissera apparaitre la réponse selon la valeur de la textbox4 qui définit le rang.

    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi !

    Albert Einstein

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta réponse rapide.

    Malheureusement ça ne fonctionne pas.
    Tout d'abord, je n'arrive pas à faire fonctionner ton code. Même avec une syntaxe correcte (les séparateurs entre les parenthèses du iif sont des , et non des ; ), les zones de texte m'affichent des #Nom?

    Je ne sais pas d'où vient le problème mais de toute façon j'aimerais aussi déplacer les cases à cocher qui se trouvent à gauche des zones de texte. Ta méthode repose sur le fait que les zones de texte vides sont invisibles, ce qui n'est pas le cas des cases à cocher... donc ça ne fonctionnera pas.

    Si personne n'a une méthode plus "propre" que celle que tu me proposes, je mettrais une case à cocher statique et je décalerais seulement l'intitulé de la réponse, mais j'aimerais vraiment pouvoir tout décaler.

    C'est vraiment très rigide cette création d'interface avec Access !

    Merci pour ton aide.

  4. #4
    Membre actif Avatar de SeaWolf601
    Inscrit en
    Août 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 254
    Points : 256
    Points
    256
    Par défaut
    tout à fait pour les , à la place des ;
    Pour ce qui est des #nom?, chez moi ça marche, tu as du faire un "Grosdoigt" quelque part.
    Quand aux case à cocher, le probleme c'est qu'acces ne gere pas la mise en forme au cas par cas sur un formulaire continu, donc toutes tes cases à cocher se déplaceront selon la condition.

    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi !

    Albert Einstein

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Je pense à une solution un peu plus barbare pleine de VBA :

    Est-ce que ça fonctionnerait en me passant de sous-formulaire et en générant les cases à côcher et les zones de textes directement en VBA au lancement du formulaire ? Je réccupère les bonnes valeurs avec des requêtes SQL et je positionne mes contrôleurs en fonction de ces requêtes.

    A la fermeture du formulaire, j'enregistre tout dans la table dont j'ai envie avec du SQL. Du coup je me passe de tout ce qui rend Access accessible aux débutants, mais je suis plus limité par ça.

    C'est un peu lourd mais ça devrait passer normalement, non ?

  6. #6
    Membre actif Avatar de SeaWolf601
    Inscrit en
    Août 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 254
    Points : 256
    Points
    256
    Par défaut
    Si tu te passe d'un formulaire continu alors tu peux soit les créer, soit les déplacer soit les cacher ou les faire apparaittre à ta convenance en effet.

    Je te souhaite par avance bon courage avec les boucles sur chaques controles selon la nature du controle.

    Mais ça reste largement possible, tiens nous au courant si t'as besoin d'aide.

    J'avoue être curieux de voir la "tête" du code.

    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi !

    Albert Einstein

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    C'est en effet un peu plus long que de faire avec les outils proposés par défaut, mais au moins j'ai appris plein de choses sur VBA !

    J'ai du garder un sous-formulaire parce que pour ajouter des éléments il faut ouvrir le formulaire en mode création. Donc sous-formulaire qu'on ouvre et qu'on ferme à chaque fois.

    Mais au final ça fonctionne. Pour avoir une idée de ce à quoi ça ressemble, voilà le code qui est lancé pour chaque question. Il y a aussi une procédure qui enregistre les modifications quand on passe à la question suivante.

    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
    Private Sub Construction(ByRef res As Recordset)
        'On ferme d'abord le sous formulaire pour pouvoir l'éditer
        Me.Choix_sous_formulaire.Visible = False
        Me.Choix_sous_formulaire.SourceObject = ""
        'On ouvre le formulaire en mode création, sans l'afficher
        DoCmd.OpenForm "Profil général - Choix", acDesign, , , acFormPropertySettings, acHidden
        'On supprime tous les contrôles qui se trouvent dans le formulaire
        Dim i As Integer
        For i = 1 To Forms("Profil général - Choix").Controls.Count
            DeleteControl "Profil général - Choix", Forms("Profil général - Choix").Controls(0).Name
        Next i
     
        'On crée les contrôles adéquats
        Dim ctl As Control
        Dim Gauche As Integer
        Dim Haut As Integer
        Set DB = CurrentDb()
        Dim rep As Recordset
        For i = 1 To NbChoix
            'Pour chaque enregistrement de la table Choix, on calcule la position que devront avoir les contrôles associés
            Haut = 100 + 300 * (i - 1)
            Gauche = 500 * (CInt(res("Rang_choix")) - 1)
            'On affiche l'intitulé du choix
            Set ctl = CreateControl("Profil général - Choix", acLabel, acDetail, , , 500 + Gauche, Haut, 8000, 300)
            With ctl
                .Name = "Intitulé_choix_" + Str(i)
                .Caption = res("Intitulé_choix")
            End With
            'On affiche la case à côcher associé
            Set ctl = CreateControl("Profil général - Choix", acCheckBox, acDetail, , , 200 + Gauche, Haut, 500, 300)
            ctl.Name = "Choisi_" + Str(i)
            'Si ce choix a été choisi, on coche la case
            Set rep = DB.OpenRecordset("SELECT ID_réponse FROM Réponse WHERE ID_choix =" + Str(res("ID_Choix")) + ";")
            If rep.RecordCount > 0 Then
                ctl.DefaultValue = True
            Else
                ctl.DefaultValue = False
            End If
            res.MoveNext
        Next i
        'On libère la mémoire
        Set ctl = Nothing
        rep.Close
        'On ferme le formulaire
        DoCmd.Close acForm, "Profil général - Choix", acSaveYes
        'On réaffiche le sous formulaire
        Me.Choix_sous_formulaire.SourceObject = "Profil général - Choix"
        Me.Choix_sous_formulaire.Visible = True
    End Sub
    C'est lourd, mais au final j'ai exactement ce que je veux. Si ça peut aider quelqu'un dans le même cas que moi...

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

Discussions similaires

  1. [AC-2007] Modifier la mise en forme d'un formulaire
    Par Beaudelicius dans le forum IHM
    Réponses: 5
    Dernier message: 06/09/2012, 19h00
  2. Mise en forme d'un formulaire PHP
    Par gregius dans le forum Langage
    Réponses: 4
    Dernier message: 08/08/2006, 19h31
  3. mise en forme des sous formulaires
    Par T'chab dans le forum Access
    Réponses: 2
    Dernier message: 11/05/2006, 10h25
  4. [PEAR][HTML_QuickForm] Mise en forme d'un formulaire
    Par Norabfr dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 30/12/2005, 14h41
  5. Réponses: 1
    Dernier message: 16/09/2005, 02h29

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