OVH Cloud OVH Cloud

Manipulation de propriétés de formulaires et de contrôles en VB

2 réponses
Avatar
Maurice KRAIT
Bonjour,

Je voudrais manipuler en VB les propriétés d'un formulaire et de ses
contrôles connaissant le nom du formulaire sous forme d'une chaîne de
caractères.
Voici la séquence d'instructions que j'ai essayée:

Dim XF As Form
Dim stDocName As String
' stDocName contient le nom du formulaire sous forme d'une chaîne de
caractères,
' par exemple : " Forms![FORMUL1]"
' Je veux accéder au formulaire dont je connais le nom :
XF.Name = stDocName
' Je veux modifier la propriété DataEntry du formulaire concerné
XF.DataEntry = True
' Je veux modifier le contrôle ZONE ( tous les formulaires concernés
ont une zone de texte de ce nom)
XF.[ZONE].Visible = True

Visiblement, ce n'est pas ce qu'il faut faire; la première instruction
(XF.Name = stDocName) est refusée avec l'indication fournie par le
debugging : " Variable objet ou variable de bloc WXith non définie"

Est-ce que quelqu'un pourrait m'indiquer la manière de procéder. Je
suis actuellement bloqué dans mon développement.
J'utilise Access 97.

Merci beaucoup par avance à toute indication de solution.

Maurice

2 réponses

Avatar
Xavier HUE
Bonjour Maurice,

Tu est sur la bonne piste ;-)

Un nom d'objet ne doit pas inclure sa collection!
Dans ton exemple, le formulaire se nomme "FORMUL1".
Sa collection est "Forms".
Cette collection contient seulement les formulaires OUVERT.
Tous les formulaires enregistrés dans la base sont inclus
dans la collection Document.

C'est un peu compliqué, mais en ingurgitant l'aide, ça
passe ;-)

Ceci dit, dans ton exemple, il faudrait faire:
Set XF = Forms(stDocName) (avec StDocName = "FORMUL1")
Puis
XF.DataEntry = True
XF.Controls("ZONE").Visible = True

Etc.

C'est pour faire quoi?
Modifier un formulaire depuis un autre formulaire?
Ou un formulaire se modifiant lui même?
Dans ce dernier cas, tu aurais avantage à utiliser
l'objet "Me" comme suit:

Me.DataEntry = True
Me.ZONE.Visible = True

Espérant t'avoir éclairé.
Cordialement.
Avatar
Maurice KRAIT
Xavier HUE a écrit:

Bonjour Maurice,

Tu est sur la bonne piste ;-)

Un nom d'objet ne doit pas inclure sa collection!
Dans ton exemple, le formulaire se nomme "FORMUL1".
Sa collection est "Forms".
Cette collection contient seulement les formulaires OUVERT.
Tous les formulaires enregistrés dans la base sont inclus
dans la collection Document.

C'est un peu compliqué, mais en ingurgitant l'aide, ça
passe ;-)

Ceci dit, dans ton exemple, il faudrait faire:
Set XF = Forms(stDocName) (avec StDocName = "FORMUL1")
Puis
XF.DataEntry = True
XF.Controls("ZONE").Visible = True

Etc.

C'est pour faire quoi?
Modifier un formulaire depuis un autre formulaire?
Ou un formulaire se modifiant lui même?
Dans ce dernier cas, tu aurais avantage à utiliser
l'objet "Me" comme suit:

Me.DataEntry = True
Me.ZONE.Visible = True

Espérant t'avoir éclairé.
Cordialement.

Merci pour ta réponse.


Tout d'abord, je travaille sur une base de données que je n'ai pas
conçue; La base est multiutilisateurs; cette base comporte un nombre
important de formulaires très similaires , même parfois identiques,
destinés chacun à une équipe d'utilisateurs. Le concepteur ayant eu peur
d'un trop grand nombre d'accès simultanés à un même formulaire avait eu
l'idée de répartir ces accès sur des formulaires différents FORMULx, un
formulaire par équipe. Quoi qu'on puisse penser de cette configuration,
il est difficile de revenir sur ce principe.

On me demande de réaliser une même fonction sur chacun de ces
formulaires FORMULx, entre autres de passer le formulaire FORMULx du
mode"consultation de fiches" en mode "création de nouvelle fiche" avec
détection de possibilité de doublon. Pour celà, depuis chaque formulaire
FORMULx, j'appelle (au sens appel d'un sous-programme, en fait j'ouvre )
un formulaire FP que je voudrais être unique (et non pas un par
formulaire FORMULx) et dans lequel je traite la possibilité de doublons
et , suivant le cas, je rends le contrôle au FORMULx appelant (en
fermant FP), après l'avoir mis ou non en mode DataEntry et modifié
quelques contrôles.

Je procède ainsi : avant d'appeler FP, je stocke dans une zone de
texte NOM de FP le nom du formulaire appelant "FORMULx" par
l'instruction :
Forms![FP]![NOM] = Me.Name
et après traitements dans FP, pour modifier le formulaire appelant avant
d'y retourner , je récupère son nom par :
stDocName = Me.NOM.Text
Je ne sais pas s'il y a un moyen plus élégant que de passer par cette
zone de texte.

Je connais un peu la structure des données, mais comme je n'ai à la
traiter ce genre de problème qu'une fois par an environ en moyenne,
entre deux, j'oublie le peu que je connais, et effectivement je ne
maîtrise pas bien les nuances entre les Forms et les Documents.
J'ai modifié mon programme suivant tes indications et ça marche.
Donc encore merci car je risquais de sécher encore un bout de temps.

Maurice