Object was unloaded (Error 364)

Signaler
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Messages postés
206
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
13 février 2021
-
Bonjour,
J'ai 2 Forms qui doivent s'exécuter consécutivement.
FormA.Load fait Load B puis Exit Sub
FormB.Load fait Unload A
99,9 fois sur cent ça fonctionne très bien, je viens d'avoir erreur 364 sur "Load A".
Selon Microsoft : A form with an Unload statement in its _Load procedure was implicitly loaded.
Je ne comprends pas ce que ça veut dire, si quelqu'un pouvait m'expliquer.
Merci

3 réponses

Messages postés
206
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
13 février 2021
7
Salut Hervé,
Par expérience, je déconseille une exécution de code direct sur le procès "Form_Load" car il peut se déclencher sur une simple initialisation au niveau objet.

Tu prends l'exemple Form2!textbox.text="hello world"...
Tu actives directement la Form2 ... et la procédure Form_Load en tâche de fond !
Avant même de faire un chargement de la form.

Cette procédure n'est utiliser que pour initialiser l'aspect visuel et initialisation des objets (menus popup, textbox...) de la form, et non pour lancer une automatisation active (dessins de pixels dans une picturebox...).

Donc, dans cette form, tu crées une procédure en public sub, qui lancera l'automation, après ton chargement de fenêtre.

On pourra faire un unload, mais tu perds toutes les infos de la fenêtre.
Le mieux est de charger la feuille au début de ton code, et de la cacher ... puis de la réactiver en visible, au lieu du unload habituel!
En plus, en invisible, tu peux envoyer des infos à partir d'un fenêtre externe, et de passer des variables, mais là aussi, un objet n'est pas une variable "public" et n'est pas un codage très propre.

Pour les automations actives comme les object_click(), tu dois utiliser un timer, car dans le Form_Load, il te sera impossible de lancer une action sur un objet, car elle n'est pas chargée (active) dans sa totalité, d'où le "hide" et le "visible" qui rend la fenêtre active en permanence.

Donc, Form_load avec le moins de chose possible, et un Form!go en "public sub" dans la form d'activation... après tu peux faire un unload (ou hide) de la form esclave quand tu veux...
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
Réponse tardive car je ne reçois pas les notifications de réponse sur ce site.
J'ai du mal à comprendre ta réponse, je ne vois pas comment je pourrais faire autrement, un peu d'explication.

FormB est une sorte de menu comprenant 17 boutons qui appellent chacun une Form qui contient un module de calcul.
Cette FormB ne peut être activée que si l'utilisateur est enregistré (dans le registre).

Par conséquent le programme démarre avec FormA
- si l'utilisateur est enregistré FormA n'a rien d'autre à faire que Load FormB;
- sinon elle demande de s'enregistrer (pseudo, adresse mail, ...) puis Load FormB;
dans les 2 cas FormB Unload FormA.

C'est au moment où FormA fait Load FormB que j'obtiens exceptionnellement (un seul cas en fait) 364:Object was unloaded
je ne comprends toujours pas la raison.
Messages postés
206
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
13 février 2021
7
Salut Hervé,
Il est difficile de te répondre sans les codes, mais tout dépend si la Form B a un tread sur la Form A...
En deux mots, ta Form B peut être l'esclave de la Form A.
Dans ce cas, il te sera impossible de fermer cette fenêtre.
Je te conseil donc de faire un Form.hide sur la A.
Regarde la configuration de ta Form A, et peaufine les paramètres, car parfois certaines combinaisons de types de form peuvent être en priorité plus ou moins grande sur d'autres.
Evite de rafraichissement automatique des form pour éviter que la form fermée ne se recharge intempestivement lors du chargement de la seconde fenêtre.
Revoie les priorités de fermeture avec ouverture A et fermeture B (ou cacher la fenêtre) et fait des DoEvents pour valider l'action.
Fait les tests sans Anti-virus, car il ajout des temps de latence au chargement des OCX... car tu devra ajouter un temps d'attente pour que les fichiers soient validés par l'antivirus.

Mais sache que de nouveaux problèmes aléatoires peuvent survenir avec les nouveaux systèmes et les applications de sécurité.

Teste les différentes options de compilation si le problème persiste.

Voilà amuse-toi bien.