Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/09/2011, 13h42   #1
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Par défaut Objets conteneurs et problème de raffraichissement?

Bonjour,

Je suis en train de développer une application Access dans le cadre de mon travail. Tout avance bien, cependant je me heurte à un problème, certes mineur, mais qui m'embête tout de même.

Mon interface doit en fonction de diverses sélections, afficher ou masquer un certain nombre de contrôles tels que des combobox. Cela fonctionne mais, au moment ou j'appelle ma procédure qui m'affiche ou masque mes contrôles, je vois ces derniers apparaitre puis disparaitre brièvement. Comme si j'en demandais trop au programme.

J'avais déjà réalisé une application similaire grâce à un Userform en vba excel et je n'ai jamais eu ce soucis. Pour moi, mis à part l'outil qui diffère, la seule différence notable est que j'utilisais des contrôles "Frame" qui contenaient l'ensemble des contrôles que je souhaitais afficher ou non. Je suppose que cela doit être plus optimisé de masquer un groupe (soit une entité) plutôt que x contrôles indépendant.

J'avais donc une ligne de code:
Code :
me.frame1.visible = true / false
J'en viens donc à ma question de base. J'ai pas mal recherché sur Access mais je ne trouve pas de contrôles correspondant. Ou alors je n'en ai pas compris le fonctionnement (je fais références aux contrôles Cadre d'objet indépendant ou non). Y a-t-il des contrôles qui correspondent à mon besoin?

D'autre part, est-ce que je me trompe en pensant qu'un tel contrôle supprimera mon problème? Si non, y voyez-vous une solution?

Merci d'avance.
Mickaël
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 13h48   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Bonjour,

Je ne pense pas que le placage de cadre change ton problème.

Sur quels événements as-tu mis en place ta préocédure de masquage ?

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 14h09   #3
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Bonjour,

Tes premiers éléments de réponse m'effraient un peu

Pour le moment j'ai englobé l'ensemble dans ma procédure RefreshQuerry qui se déclenche à chaque fois qu'on clique sur une combobox.(après copié collé, je m'aperçois qu'elle commence à être importante cette procédure)

Je te la joint pour que tu vois ce qu'il en est:

Code :
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
Private Sub RefreshQuerry()
Dim req As String
Dim Old As String
Dim Std As String
Dim CreateAttribut
 
If lblAttrib1.Visible = True Then lblAttrib1.Visible = False
If lblAttrib2.Visible = True Then lblAttrib2.Visible = False
If lblAttrib3.Visible = True Then lblAttrib3.Visible = False
If lblAttrib4.Visible = True Then lblAttrib4.Visible = False
If lblAttrib5.Visible = True Then lblAttrib5.Visible = False
If lblAttrib6.Visible = True Then lblAttrib6.Visible = False
If lblAttrib7.Visible = True Then lblAttrib7.Visible = False
If cbAttrib1.Visible = True Then cbAttrib1.Visible = False
If cbAttrib2.Visible = True Then cbAttrib2.Visible = False
If cbAttrib3.Visible = True Then cbAttrib3.Visible = False
If cbAttrib4.Visible = True Then cbAttrib4.Visible = False
If cbAttrib5.Visible = True Then cbAttrib5.Visible = False
If cbAttrib6.Visible = True Then cbAttrib6.Visible = False
If cbAttrib7.Visible = True Then cbAttrib7.Visible = False
 
Select Case Querry
    Case "FamilleIP"
        cbCategorie.Visible = True
        lblCategorie.Visible = True
        PNRacine = DLookup("Code", "Famille", "ID= " + cbFamille.Value + "")
        lblPN.Caption = PNRacine
        req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" + PNRacine + "*'"
        CreateAttribut = 0
    Case "Famille"
        cbCategorie.Visible = False
        lblCategorie.Visible = False
        cbSousCategorie.Visible = False
        lblSousCategorie.Visible = False
        PNEntite = DLookup("Code", "Famille", "ID= " + cbFamille.Value + "") & "10"
        lblPN.Caption = PNEntite
        req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" + PNEntite + "*'"
        CodeFamille = cbFamille.Value
        CreateAttribut = 1
    Case "CatégorieIP"
        cbSousCategorie.Visible = True
        lblSousCategorie.Visible = True
        PNCat = DLookup("Code", "Famille", "ID= " + cbCategorie.Value + "")
        lblPN.Caption = PNRacine + PNCat
        req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" + PNRacine + PNCat + "*'"
        CreateAttribut = 0
    Case "Catégorie"
        cbSousCategorie.Visible = False
        lblSousCategorie.Visible = False
        PNCat = "VIDE"
        PNEntite = PNRacine & DLookup("Code", "Famille", "ID= " + cbCategorie.Value + "") & "0"
        lblPN.Caption = PNEntite
        req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" + PNEntite + "*'"
        CodeFamille = cbCategorie.Value
        CreateAttribut = 1
    Case "SousCatégorie"
        PNEntite = PNRacine + PNCat + DLookup("Code", "Famille", "ID= " + cbSousCategorie.Value + "")
        lblPN.Caption = PNEntite
 
        req = "SELECT PN, Status, Standard FROM Piece WHERE PN like '" + PNEntite + "*'"
        CodeFamille = cbSousCategorie.Value
        CreateAttribut = 1
End Select
 
lbPiece.Selected(lbPiece.ListIndex) = False
Call RAZFichePiece
 
'bug a corriger lorsque chkold chkstd sont toutes 2 cochées
Select Case chkOld
    Case -1         'coché
        Old = " AND Status = -1"
    Case 0          'décoché
        Old = " AND Status = 0"
End Select
 
Select Case chkStd
    Case -1         'coché
        Std = " AND Standard = -1"
    Case 0          'décoché
        'Std = " AND Standard = 0"
End Select
 
'MsgBox (req + Old + Std + " ORDER BY PN;")
lbPiece.RowSource = req + Old + Std + " ORDER BY PN;"
 
If CreateAttribut = 1 Then
    cmdCreatePart.Enabled = True
    Call RetrieveAttrib
Else
    cmdCreatePart.Enabled = False
End If
 
 
If lbPiece.ListIndex = -1 Then Exit Sub
 
Call AfficherInfoPiece
 
End Sub
 
 
 
 
Public Sub RetrieveAttrib()
 
Dim i As Integer, j As Integer
Dim Rst As DAO.Recordset
Dim CurrentCBox As String
Dim CurrentLbl As String
 
Form_GPE.cbAttrib1.RowSource = ""
Form_GPE.cbAttrib2.RowSource = ""
Form_GPE.cbAttrib3.RowSource = ""
Form_GPE.cbAttrib4.RowSource = ""
Form_GPE.cbAttrib5.RowSource = ""
Form_GPE.cbAttrib6.RowSource = ""
Form_GPE.cbAttrib7.RowSource = ""
 
'Résultat de la requête permettant de trouver le nombre d'attributs:
j = DCount("IDFamille", "AttributsFamille", "IDfamille =" + CodeFamille)
i = 1
 
Set Rst = CurrentDb.OpenRecordset("SELECT * FROM AttributsFamille WHERE AttributsFamille.IDFamille= " & CodeFamille)
 
Do Until Rst.EOF = True
    CurrentCBox = "cbattrib" & i
    CurrentLbl = "lblattrib" & i
    Form_GPE.Controls(CurrentCBox).Visible = True
    Form_GPE.Controls(CurrentLbl).Visible = True
    Form_GPE.Controls(CurrentLbl).Caption = DLookup("Nom", "Attribut", "ID = " & Rst!IDattribut)
    Form_GPE.Controls(CurrentCBox).RowSource = "SELECT IDAttribut, Valeur FROM ValeurAttributPossible WHERE IDAttribut = " + CStr(Rst!IDattribut) + " ;"
    Rst.MoveNext
    i = i + 1
Loop
 
Rst.Close
 
End Sub
Edit: En relisant ton message, je me dis que j'ai peut être répondu un peu à coté
La plupart des contrôles appellent ma procédure RefreshQuerry après un évènement "Après MAJ".
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 17h28   #4
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Bonjour,

Tu dois tracer ton code pour voir exactement quand le clignotement se produit.
Je ne vois pas de code de réaffichage de tes controles Attribx.

Ps : l'opérateur de concaténation c'est le & et non le +. Si tu as des string avec du numérique il va te faire des additions.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 19h46   #5
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Re,

Je masque les contrôle avant leur éventuelle utilisation entre les lignes 7 à 20.
Et je les affiche dans la Sub "RetrieveAttrib", si besoin est, lignes 127-128.

En tous cas, merci pour l'info sur les + et &. Je pensais qu'ils avaient exactement la même signification. Je vais tâcher de les corriger
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 20h03   #6
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Personnellement je chercherais à faire l'affichage et le masquage au même moment. J'éviterai également les fonctions de domaine (Dlookup, Dcount...) et je mettrai en place une solution DAO (recordset).

Je ne mettrais pas les rowsource à vide, puisque si la combo n'est pas utilisée elle sera cachée et si elle ne l'est pas la nouvelle rowsource s'y substituera.
Lorsque je veux cacher afficher, je me sert régulièrement de cette astuce.

Code :
me.moncontrole.visible = (condition renvoyant True ou False)
Maintenant comment mettre tout ça en pratique dans ton cas :

Utilise une boucle For pour parcourir tes combos au lieu de parcourir tes enregistrements. Tu pourras ainsi grace à un findfirst trouver l'enregistrement et mettre un not nomatch comme condition au visible de ta combo.

Regarde le tuto sur DAO pour mettre en application cette méthode.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2011, 20h24   #7
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Re,

Je vais réfléchir à la solution proposée. Est-ce que selon toi, mon problème pourrait venir de tout ça?

Quoiqu'il en soit, il est vrai que je me suis contenté d'un Dlookup au détriment du Recorset car il génère moins de code. En gros, j'avoue l'avoir fait comme ça par fénéantise.

Ta remarque sur le fait de remettre les rowsource à vide est pertinante. Je l'avais fait avant de m'occuper de masquer les cbox. Mais comme tu me l'as justement fait remarqué, je vais pouvoir alléger mon code à ce niveau.

En revanche, excuse moi, mais je n'ai pas compris ton astuce. Du moins, je n'y vois pas de différence par rapport à ce que j'ai fait. (On mettra ça sur le dos de la fatigue )

Juste une petite note concernant le fait que je parcours mes enregistrements. En fait, l'état de mes combo dépent de sélections faites précédemment, et du contenu trouvé. Si je bouclais sur mes combobox, j'ai l'impression que ça revient au même. (en tous cas d'un point de vue logique)

Est-ce meilleur d'un point de vue code?

En tous cas merci pour ton aide.
Cordialement,

Mickaël
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 08h12   #8
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Bonjour,

Si tu boucle sur tes combos tu n'y passe qu'une fois et c'est lors de ce passage unique que tu définis la source et si elle est visible ou non.

L'astuce consiste à utiliser d'une part un findfirst pour trouver l'enregistrement (par opposition au dlookup) et de vérifier s'il existe pour afficher/cacher la combos et y mettre la source.

Code :
1
2
3
4
5
6
7
8
for i = 1 to 4
    rst.findfirst "expression de recherche"
    me.controles("combo" & i).visible=not rst.nomatch
    select case...
        ... création de la source
    end select
    me.controles("combo" & i).rowsource = "source"
next
Au sujet de fonction de domaine il faut savoir qu'elles sont très lourde pour le moteur de base de données. Elles doivent être utilisées pontuellement.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 11h21   #9
Nouveau Membre du Club
 
Homme Mickaël
Dessinateur industriel
Inscription : décembre 2010
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Localisation : France

Informations professionnelles :
Activité : Dessinateur industriel
Secteur : Industrie

Informations forums :
Inscription : décembre 2010
Messages : 61
Points : 31
Points : 31
Bonjour,

Merci pour ces explications.
Je n'avais jamais vu cette manière de faire:

Code :
    me.controles("combo" & i).visible=not rst.nomatch
Et je trouve ça vraiment très bien, dans mon cas entre autre.
Effectivement, vu comme ça, mon code sera simplifié. Et avec un peu de chance plus optimisé au niveau du raffraichissement. Dès que j'ai un moment, je vais mettre en oeuvre cette solution.

Vu ce que tu m'en dit, je crois que je vais, au fur et à mesure, supprimer chaque fonctions de domaine de mon code.

Je laisse pour le moment le sujet ouvert le temps de tester pour voir si cela à réellement un impact sur mon problème.

En attendant, merci pour tes conseils
Vhalar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h43.


 
 
 
 
Partenaires

Hébergement Web