Probleme d'ecriture de code [Résolu]

Signaler
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009
-
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009
-
Bonjour a tous

Tout d'abord un grand merci a vous pour ce site qui m'a sortie du petrin plus d'une fois, malheuresement cette fois ci je seche. Je precise que je suis vraiment debutant en macro Access.

 Voila mon probleme : Je souhaite faire reference a un ensemble d'objets ( listbox, bouton de commande etc) qui expose la meme methode "visible". Je ne sais pas comment m'y prendre sans lister un a un chaque objet et de dire
pour chaque objet si je veut qu'il soit visible ou non.

En claire  au lieu de faire

MonObjet.visible = true
MonObjet1.visible = true
.......

Je souterais avoir quelque chose du genre MonGroupeObjet.visible= true
Je crois qu'il faut passe par des classes  mais j'en suis pas sure et je sais pas comment faire.
Merci d'avance pour votre aide.

15 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
l'utilisation de la collection controls selon la position de chacun (1 à 5, 5 à 10, etc.....) n'est malheureusement pas toujours fiable

une solution serait alors de "marquer" les contrôles que tu veux changer, en mode design :
rempli leur propriété TAG, avec n'importe quoi (juste "m" par exemple)
puis dans le for each, ne modifie le visible que des contrôles dont le tag n'est pas vide
++
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
Bonjour,

Plusieurs solutions possible :

1\Tu place tes contrôles dans un panel, et tu joue avec la propriété visible de celui-ci

2\Tu joue avec la collection Controls du formulaire (ce qui implique que tu à fais attention à l'ordre dans lequel tu as placer tes controles):

Ex :

For i = 5 to 10
   Me.controls(i).Visible = False
Next i
  
@+ Mayzz.
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

Bonjour Mayzz,

Pour la premiere solution, je pense que tu parle d'un frame option bouton mais mes controles sont soit des listbox soit des boutons de commande et je ne sais pas s'il est possible de les integrer dans un frame d'options et de les controlés, et pour la deuxieme solution j'y est pas pensé mais pour la lisibilité du code c'est pas terrible

Je me demande s'il est pas possible de creer une classe qui reference l'ensemble des controles que je souhaite inserer et ensuite dans mon code appeler une methode  (par ex: afficher) pour ma classe.
Par contre je ne sais pas du tout comment m'y prendre

Merci Mayzz pour ta reponse et je croi que j'adopterai ta 2ieme solution si je trouve pas exactement ce que je veux.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,

si c'est "tous les contrôles", la 2e proposition de mayzz est la bonne, je ne vois pas le problème de lisibilité

tu peux aussi filtrer par type

(à vérifier pour la syntaxe access) :

sub setVisibility(byval bValue as boolean)
dim ctrl as control 'ou as object
for each ctrl in monformulaire.controls

if (typeof ctrl is msforms.listbox) or (typeof ctrl is msforms.commandbutton) then
ctrl.visible = bValue
endif
next ctrl

set ctrl = nothing
end sub

NB : macro access = VBA , attention aux thèmes, ce n'est pas VB.NET !!

catégorie modifiée


<hr size ="2" width="100%" />
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

Salut pcpt,

justement ce n'est pas tous les controles contenue dans mon formulaire mais seulement 5.

je te remercie pour ton code, je vais essayé de faire une mix de tout ca.
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

la propieté tag je ne la connaissais pas et ca a l'air tres partique
voila ce que j'ai fais donc

Dim ctr As Control

For Each ctr In Me.Form.Controls  If ctr.Tag "appli" Then ctr.Visible False
Next ctr

je me demande si pour le test comparaison si je peux utiliser ce que j'ai fais ou plutot faire ceci If StrComp(ctr.Tag, "appli") 0 Then ctr.Visible False
quelle est le meilleur choix?
petite question a part , pourqoi l'intellsence ne me propose pas la methode visible pour ctr alors que cela fonctionne correctement
Merci encore pour vos aides.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
strcomp donne des options de comparaison plus évoluées et paramétrables que EGAL, pas spécialement utiles ici

le type "control" représentant des objets de différents types, les propriétés peuvent être différentes ou même ne pas exister
l'intellisense ne peut donc pas deviner, en mode conception, le control qui sera représenté en mode execution
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

ok, merci pour ton aide et t'es explications qui m'on été trés utile.
a+
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

Bonjour a tous,

Apres quelque recherche j'ai trouvé exactement ce que je voulais faire. En faite je voulais creer une nouvelle collection d'objet mais je ne savais pas comment l'exprimer.
donc voila un exemple, cela pourra servir a d'autre peut etre:

Dim collEACP As Collection, i As Byte
Set collEACP = New Collection
collEACP.Add Form_Formulaire2.Version
collEACP.Add Form_Formulaire2.Alim

For i = 1 To collEACP.Count
collEACP.Item(i).Visible = False
Next i

Set collEACP = Nothing

Par contre j'ai essayé de faire la meme chose avec la boucle For each mais cela ne fonctionne pas
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
pour c as control

for each c in collEACP
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
Bonsoir,

As-tu essayé comme cela ?

For Each Ctrl In collEACP 
  Ctrl.Visible = False
Next

++
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
Oups désolé pour le post, j'était en first page et j'avais pas vu le tien PCPT ^^ lut au passage ;O) 

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

Salut Mayzz et PCPT,

J'ai compris pourquoi avec la boucle for each ca ne fonctionne pas. En faite lorsque je declare par exemple C as Control , dans la boucle il commence par C=0, or dans l'ajout de mes controls dans la collection CollEACP( methode .add) la premiere valeur est indexé à 1.
Bon ce n'est pas tres grave du moment que cela fonctionne avec une boucle for traditionnelle je suis deja content
Merci pour vos reponses
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,
tant mieux si çà marche

mais pour info, c ne vaut pas 0 (ni même 1)
c est le contrôle
en entrant dans la boucle il représente le premier élément de la collection, qui en effet commence à 1
autrement dit, au premier passage,

c

<==> collEACP.item(1)
++
<hr size="2" width="100%" />
Messages postés
15
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
21 septembre 2009

oui PCPT tu as tout a fait raison , c'est moi qui me suis mal exprimé
Merci encore pour ton aide
a+