2010-11-04 15 views
0

J'ai converti cette application à partir de VB6. J'ai 2 formes. Form1 instancie Form2 via un élément de menu. J'ai des difficultés à terminer Form2 en cliquant sur Fermer (X). Si Form2 est 'inactif', il se ferme bien; mais si je suis dans une boucle traitant n'importe quoi tous les événements se déclenchent, mais il continue le traitement dans Form2. J'ai essayé de jouer avec Dispose, Close, Application.Exit, Application.ExitThread. Ma dernière tentative a été de créer mon propre événement pour retourner à Form1 et de disposer de Form2 - et il frappe, mais Form2 est toujours en cours d'exécution. Quel est le deal? BTW si j'utilise juste Show vs ShowDialog - Form2 clignote et disparaît.Formulaire ShowDialog VB.NET non terminé

Form1 does this 
Dim f2 as Import 
: 
     Hide() 
     f2 = New Import 
     AddHandler f2.die, AddressOf killf2 
     f2.ShowDialog(Me) 
     Show() 

Private Sub killf2() 
     f2.Dispose() 
     f2 = Nothing 
End Sub 

Form2 

Public Event die() 
Private Shadows Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing 
     Dispose() 
     Close() 
     e.Cancel = False 
     RaiseEvent die() 
End Sub 

Répondre

0

Je pense que vous avez vos événements croisés. Vous voulez form1, contenant une instance de form2, pour écouter l'événement form_closing de form2. Ensuite, vous pouvez définir f2 = rien.

Form1 doit contenir entièrement form2.

est ici un exemple:

Public Class MDIMain 
    Private WithEvents _child As frmViewChild 

    Friend Sub viewChildShow() 
     _child = New frmViewChild 
     _child.MdiParent = Me 
     _child.WindowState = FormWindowState.Maximized 
     _child.Show() 
    End Sub 

    Private Sub _child_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles _child.FormClosing 
     _child = Nothing 
    End Sub 

ne pas ajouter quoi que ce soit à Form2, essayez

Dim f2 as Import 
     Hide() 
     f2 = New Import 
     f2.ShowDialog(Me) 
     Show() 

Private Sub f2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles f2.FormClosing 
     set f2 = nothing 
End Sub 

re: votre commentaire il retourne à form2 et continue le traitement suivant dans la le gestionnaire d'événement click

c'est une caractéristique qui va provoquer ce comportement. vous devez vous assurer que me.close ou close me est la dernière instruction de form2, qu'il n'y a rien d'autre à exécuter.

+0

Je viens d'appeler l'événement Form1_FormClosing comme je l'ai copié et collé. Il gère réellement MyBase.FormClosing - for form2. Si ce n'est pas ce que vous vouliez dire - alors comment j'écoute l'événement form_closing de form 2 dans form1 autre que simplement lever un événement et mettre f2 = rien comme je l'ai fait. Merci! –

+0

J'ai essayé peut-être ce que vous faisiez référence –

+0

Dim WithEvents f2 importation –

0

De quelle boucle parlez-vous? L'interface utilisateur (windows) est distincte de tout code en cours d'exécution. Dans votre formulaire de formulaire dérivé de classe, le code est autorisé à s'exécuter, à la fois avant la création du formulaire et après la destruction du formulaire. Si le code tente d'accéder aux objets de l'interface utilisateur, une exception peut se produire, mais rien n'empêche l'exécution de votre code lorsqu'il n'y a pas d'interface utilisateur.

Si vous voulez que votre boucle "for" sorte, vous devez lui envoyer un signal, par ex. en créant une variable membre "quit" booléenne. Définissez "quit = True" lorsque votre formulaire se ferme, puis demandez à votre boucle "for" de vérifier si elle est vraie.