Bonjour, voici mon code pour vous expliquer le contexte

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Sub UnloadForms()    
    Dim objForm As Form    
    For Each objForm In Forms    
        Call Unload(objForm)    
    Next objForm        
End Sub
 
Public Sub ExitApp()
    If Not isQuitApp Or isUnload Then Exit Sub    
    isUnload = True
    Call UnloadForms       
    If Not cError Is Nothing Then
        Set cError = Nothing
    End If
    If Not cMyAdo Is Nothing Then
        Call cMyAdo.CloseMySQL        
        Set cMyAdo = Nothing
    End If    
End Sub

Dans mon programme, j'ai placé l'apelle d'une procédure ExitApp dans les Form_QueryUnload() de chacune de mes forms

il arrive parfois que je dois décharger une form, mais sans quitter le programme, c'est pourquoi j'ai une variable boolean public appelé isQuitApp que je met à false lorsque je veux décharger une form sans quitter le programme.

Dans mon form principal j'y ait placé le code suivant pour pouvoir appeler un autre form qui demande si on est sûr de quitter le programme ou non.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If isQuitApp And Not frmQuit.isQuit Then        
        Cancel = 1
        Call frmQuit.Show(vbModal)                
    End If            
End Sub
Dans la form frmQuit j'ai une variable public isQuit qui indique si on a appuyé sur le bouton Oui ou Non pour confirmer si on veut vraiment quitter.

Mais je suis obligé jusqu'ici de mettre ce code dans Form_Activate() car si je le place dans le Form_QueryUnload() vb6 plante, car en revenant du form frmQuit le form principal redevient actif et c'est Form_Activate qui se déclenche et en le mettant dans le QueryUnload du frmQuit ça plante aussi, car UnloadAllForms est exécuté alors que la fenêtre modale frmQuit est toujours là et n'est pas terminé encore quand c'est au tour de frmMain de disparaitre

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Form_Activate()        
    If frmQuit.isQuit Then
        Call Logoff(utUserInfos.sUserId, "User logoff")        
        If cError.lErrNum <> 0 Then
            Call cError.ShowError
            Exit Sub
        End If        
        Call ExitApp        
    Else
        ' code nécessaire pour le form principal dans activate
        ' mais même en le supprimant, une erreur se produit quand même..
        If lMenu = -1 Then Call lstMenu.ClickOn(0)    
        Call RefreshAll    
        If cError.lErrNum <> 0 Then    
            Call cError.ShowError    
        End If        
    End If
End Sub
Remarquez que comme c'est en ce moment, ça fonctionne très bien, cependant, je ne trouves pas cela très propre de mettre ça dans Form_Activate, est-ce qu'il y aurait moyen de faire autrement ?

Je places toujours ExitApp() dans les Form_QueryUnload() car ainsi je suis sûr que peu importe comment la form se ferme, soit en cliquant le bouton quitter, ou X, etc que la procédure ExitApp() va être déclenché..

Merci pour vos conseils