Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
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 08/02/2011, 10h56   #1
Membre habitué
 
Inscription : juillet 2010
Messages : 117
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2010
Messages : 117
Points : 140
Points : 140
Par défaut Différence entre 2 appels de formulaires

Bonjour le forum.

Dans un développement j'ai rencontré un message d'erreur : "Erreur d'exécution 7 : Mémoire insuffisante". L'erreur est survenu lors de l'appel à un formulaire. J'ai changé de type d'appel et n'ai maintenant plus de message d'erreur.
Cependant, je souhaiterais comprendre la différence exacte entre les deux écritures.

Voici le code utilisé qui génère l'erreur :

Code :
Msgbox Form_MonFormulaire.Name
Et le code qui lui ne génère pas d'erreur :

Code :
Msgbox Forms!MonFormulaire.Name
Je crois avoir compris que la seconde écriture fait appel au formulaire en tant qu'objet de la collection Forms. Concernant la première, c'est beaucoup moins clair pour moi...Est-ce qu'il essaie de placer le contenu de la propriété directement en variable sans avoir fait un appel concret au formulaire avant ?

Voilà, si quelqu'un pouvait m'éclairer au sujet des différences qu'il existe entre ces deux codes, ça me serait sans doute d'une grande aide.

Bien cordialement,
__________________
"Je suis capable du meilleur comme du pire, mais dans le pire, c'est moi le meilleur" Coluche.
Manhexter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 14h02   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Bonjour

Humm, je vais tenter de t'expliquer...

La propriété Forms retourne une référence à la collection Forms avec toutes ses propriétés connexes...
L'objet Form_NomDFormulaire est le nom de classe du formulaire lui-même et déclenche notamment les événements qu'il contient comme par exemple Form_Load() si tu cherches à l'exploiter ainsi que tu le fais en essayant d'obtenir son nom (s'il est fermé biensûr).

Pour l'exemple, créé un formulaire vierge et écris l'événement suivant :
Code :
1
2
3
Private Sub Form_Load()
    MsgBox "Form_Load() est déclenché...", , Me.Name
End Sub
Enregistre le sous Formulaire1 et dans la fenêtre de débogage, tapes :
Il te retourne :
Formulaire1

Maintenant, ferme le formulaire en question et place ton curseur dans la fenêtre de débogage derrière le .Name
Appuies sur entrée : cela déclenche l'événement alors Form_Load() avec le MsgBox() qu'il contient... puis te donne le nom, bien évidemment...

User de Forms![NomDFormulaire] réfère à la collection des formulaires ouverts uniquement. Tu peux user de cette syntaxe pour récupérer par exemple la valeur d'un contrôle :
Code :
MaValeur = Forms!Formulaire1!Control1
Tu ne peux pas exploiter Forms pour, par exemple, déclencher des événements ou récupérer la valeur d'une propriété déclarée au sein de la classe du formulaire.

Ceci étant dit, si tu nous précises que c'est de la culture perso, c'est très bien - maintenant, si tu souhaites faire quelque chose qui n'aboutie pas, on peut certainement t'aider.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 15h40   #3
Membre habitué
 
Inscription : juillet 2010
Messages : 117
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2010
Messages : 117
Points : 140
Points : 140
Bonjour Argyonet et merci beaucoup pour la réponse.

En prenant tes indiquations comme point de départ, voici les manipulations de test que j'ai faites :

1 - Création du formulaire vierge et de son évènement Load comme tu l'as indiqué
2 - Copie de ta ligne dans la fenêtre de debogage.
3 - Déclenchement de l'ordre dans le débogage en appuyant sur entrée => j'ai bien le déclenchement de l'évènement si mon formulaire est fermé.
4 - Déclenchement une seconde fois de l'ordre dans le debogage => Pas d'évènement Load déclenché : j'en déduis que le formulaire est toujours chargé (sans pour autant être ouvert de manière visible).
5 - Ouverture classique du formulaire par double clic => j'ai un déclenchement d'évènement Load
6 - Fermeture normale du formulaire ouvert puis exécution de l'ordre => déclenchement de l'évènement Load : le formulaire a donc été déchargé lorsque je l'ai fermé.
7 - Ajout de l'évènement UnLoad sur le formulaire avec le même code que pour Load et reprise des étapes ci-dessus => l'évènement UnLoad ne s'est effectivement déclenché que lors de la fermeture manuelle du formulaire

Ce que j'en comprends, c'est que l'appel à l'objet Form_NomDFormulaire charge le formulaire en mémoire mais sans l'ouvrir. Ce chargement permet d'accéder à ses propriétés. Cependant, à moins d'une ouverture et d'une fermeture (ou d'un ordre dans le code j'imagine) celui-ci reste chargé.
Dans le cas d'une exécution qui appellerai de la sorte une dizaine de formulaire, il peut donc être logique de se retrouver avec une surcharge d'utilisation mémoire. Je comprends mieux la venue de ce message.

D'un point de vue implémentation j'en conclus donc qu'il vaut mieux :
1 - Utiliser Forms pour accéder aux objets et propriété d'un formulaire (quite à l'ouvrir en caché au préalable et le refermer par la suite)
2 - Reserver l'emploi de Form_NomDFormulaire au déclenchement d'évènements et à l'accès à des variables qui seraient déclarées dans cette classe.

Citation:
Ceci étant dit, si tu nous précises que c'est de la culture perso, c'est très bien - maintenant, si tu souhaites faire quelque chose qui n'aboutie pas, on peut certainement t'aider.
En fait, j'en suis à la phase de recette d'une application de facturation que j'ai développée sur Access pour ma société. J'y fais énormément de manipulation de formulaires et de leurs contrôles avec créations de formulaires dynaimique et autres. C'est cette phase de recette et l'utilisation importante de l'application qui m'ont donc amménés à venir poser cette question. C'est donc aussi bien une question de culture personnelle que d'amélioration d'un développement.

Si tu pouvais me confirmer que j'ai bien compris, je ferais le petit clic sur Résolu ^^.

Merci encore pour ta réponse.
__________________
"Je suis capable du meilleur comme du pire, mais dans le pire, c'est moi le meilleur" Coluche.
Manhexter est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h51.


 
 
 
 
Partenaires

Hébergement Web