Problème entre passage de Winform (instance supprimée et non référencée à un obj [Résolu]

el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 8 sept. 2005 à 11:50 - Dernière réponse : sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention
- 8 sept. 2005 à 14:41
Salut,



voilà, j'ai un projet avec 3 formes:

_ form_accueil


_ form_liste


_ form_telechargement



au lancement de l'appli, je démarre sur la page accueil. Voici les variables de la classe Form_Accueil :

private
Form_Liste
F_Liste; //instance de ma 2eme fenetre


static
Form_Accueil F_Accueil = new
Form_Accueil();




[STAThread]


static void Main()


{


Application.Run(F_Accueil);


}




private void Form_Accueil_Load(object sender, EventArgs e)


{


F_Accueil = this; //maintenant que j'y pense, c'est inutile


}





Un bouton me permet d'aller à form_liste. J'en crée donc une nouvelle
instance que j'appelle f_liste, et je lui passe un pointeur vers la
form accueil, pour pouvoir y retourner.
private void bt_liste_Click(object sender, System.EventArgs e)


{


F_Liste = new Form_Liste(F_Accueil,ma_connexion_in,ma_connexion_out);


F_Accueil.Hide();


F_Liste.Show();


}


Je cache donc ma forme accueil, et lance la forme liste. Dans celle ci,
je choisis parmi une liste de fichiers, et je peux lancer un
téléchargement. J'appelle alors ma troisième forme, où j'indique
l'avancement du transfert : c'est la forme téléchargement que j'appelle f_dl , à laquelle je renseigne des pointeurs vers f_liste et f_accueil.

Dans la classe form_liste :

private
Form_Telechargement
f_dl = new Form_Telechargement();



private static
Form_Accueil f_Accueil;




private void Form_Liste_Load(object sender, EventArgs e)


{


f_dl.Renseigner_formes_meres(f_Accueil,this); //Je passe les pointeurs des formes mères

}




private void Form_Liste_Closed(object sender, EventArgs e)


{


f_Accueil.Focus();


f_Accueil.Show();


}

Lancement de la nouvelle fenetre (en fait, démarrage du téléchargement)

f_dl.Show();


this.Hide();


f_dl.Activate();



Le problème que j'ai, c'est que tout cela ne marche qu'une fois.
Lorsque la première série de téléchargement est terminée, je ferme la f_dl.

Il se passe alors cela :

this.Show(); //this étant la forme liste

this.Activate();

f_dl.Close();

f_dl.Dispose();

f_dl = null;



Je retombe alors sur la forme liste. Si je décide de fermer la
forme_liste et de revenir à l'accueil, pour ensuite retourner sur la
forme liste, et démarrer un nouveau téléchargement, il pante et me dit
que f_dl n'est pas définie à une
instance d'objet. Il me dit cela alors qu'il a lancé une nouvelle forme
téléchargement (elle apparaît, et elle s'appelle normalement l'instance
f_dl). Donc, les mises à jour des progressbar et des label ne sont plus possibles avec le pointeur f_dl



Voilà mon problème, j'espère que j'ai été assez clair.



Je voudrais donc obtenir des conseils pour savoir s'il vaut mieux
cacher les formes, les tuer, et surtout comment faire pour qu'à chaque
fois que l'on lance une nouvelle fenetre (même au bout de x fois), le
pointeur que l'on a prévu pour cette forme (ici f_dl) pointe bien vers elle.



Merci d'avoir pris le temps de lire ce post.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 sept. 2005 à 14:32
3
Merci
ok... je pense que j'ai compris ce que tu veux faire.

Donc je vais prendre le problème à l'envers.



Tu as un formulaire form_telechargement qui te permet de voir l'état
d'avancement d'un téléchargement, un formulaire form_liste qui liste un
ensemble de fichiers à télécharger et form_acceuil qui ouvre form_liste.



Je ferais comme ceci :

Je laisserai form_telechargement se débrouiller tout seul avec le
téléchargement, ainsi form_liste ne le mettrai plus à jour. L'idée est
de retirer la référence de form_telechargement vers form_liste.

A la fin du téléchargement ou en cas d'erreur, tu pourras déclencher un évènement (Done) que tu intercepteras avec frm_liste.



Dans form_liste, lorsque je choisi un fichier, j'ouvre une nouvelle
form_telechargement à laquelle je passe les informations nécessaire au
téléchargement de mon fichier, je m'abonne aux évènements importants
(Closed, Done...).



Dans form_accueil, je m'abonne à l'évènement Closed de form_liste, et lorsque form_liste se ferme je fais réapparaitre celui ci.



Tu remarqueras que maintenant mes références vont dans ce sens :

form_acceuil --> form_liste --> form_telechargement.

Sébastien FERRAND

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de sebmafate
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 sept. 2005 à 12:05
0
Merci
quand on vous dit qu'il faut éviter les références croisées entre les formulaires.






Sébastien FERRAND
Commenter la réponse de sebmafate
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 8 sept. 2005 à 12:19
0
Merci
Je viens de penser à un truc. Est-ce que j'aurais pas intérêt à
utiliser des fenetres parentes. J'imagines que cela doit avoir certains
avantages de dériver de la fenetre précédente, peut être que l'on peut
passer de l'une à l'autre plus facilement.

Mais si je dérive la 2nde de la 1ere, la 2eme pourra être totalement différente ?



En deux mots, quel est/sont l'intérêt des fenetes parents ? Est-ce que tu penses cela intéressant dans mon cas ?



Merci
Commenter la réponse de el_teedee
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 sept. 2005 à 12:24
0
Merci
dans ton cas... non...

Une fenêtre qui hérite d'une autre... hérite de tout : controles, traitements...



ce que je ne comprends pas c'est pourquoi tu veux que Form_Liste ait un
lien sur Form_Acceuil et Form_Telechargement ait un lien sur les 2
autres.

Ces liens ne servent à rien.


Sébastien FERRAND
Commenter la réponse de sebmafate
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 8 sept. 2005 à 13:47
0
Merci
Oui, c vrai, le lien de f_dl vers l'accueil est inutile, mais je l'avais prévu au début.



En ce qui concerne le lien de f_liste vers f_dl, c'est-à-dire f_dl,
toutes les mises à jour des progressbar et des labels se font dans la
classe form_liste.

f_dl.progressbar1.vlaue = ....

j'ai mis les controles qui sont susceptibles d'être modifiés en public.



Le lien de form_liste vers form_accueil me permet d'activer l'accueil que j'avais caché.



Comment faire alors pour eviter ce que tu appelles références croisées ?



form_accueil <--> form_liste <---> form_telechargement

Une seule fome est active à la fois.
Commenter la réponse de el_teedee
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 8 sept. 2005 à 14:37
0
Merci
Ou la la, ca va me faire modifier tout plein de truc tout ça, mais c kler que ca marchera sans doute mieux.

Dis moi, quand je clique sur "Liste" depuis l'accueil, que faire de l'accueil, juste .hide() ?

et sur le on_closed de la liste, je fais .show() ?
Commenter la réponse de el_teedee
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 sept. 2005 à 14:41
0
Merci
oui, tout simplement

Sébastien FERRAND
Commenter la réponse de sebmafate

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.