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

Résolu
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 8 sept. 2005 à 11:50
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 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.

7 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 sept. 2005 à 14:32
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
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 sept. 2005 à 12:05
quand on vous dit qu'il faut éviter les références croisées entre les formulaires.






Sébastien FERRAND
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
8 sept. 2005 à 12:19
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 sept. 2005 à 12:24
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
8 sept. 2005 à 13:47
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.
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
8 sept. 2005 à 14:37
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() ?
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 sept. 2005 à 14:41
oui, tout simplement

Sébastien FERRAND
0
Rejoignez-nous