IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Problème pour quitter mon programme


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut Problème pour quitter mon programme
    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

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Salut,

    Dans l'architecture de ton programme y'a un truc qui ne va pas : la feuille s'auto décharge.

    Il faut bien se dire qu'un objet ne devrait jamais avoir à se supprimer lui-même, car c'est incohérent avec la notion de contrôleur objet.

    Clairement, il faut que tu gères le load et le unload depuis l'extérieur (un module, une classe, ce que tu veux pas pas la form elle même)
    Ainsi, le bouton quitter ne fait pas "unload me" mais "me.hide", de façon à retourner à la procédure appelante : le contrôleur.

    C'est ensuite que ce dernier pourra décharger la feuille : unload mafeuille.

    Si tu suis ce principe et l'applique de façon récurrente, ton code pour décharger d'un coup toutes les feuilles est inutile.

    Je ne sais pas si ce que j'ai dit est clair , fais moi signe s'il y a un soucy ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    Euhh, non c'est pas très claire lol

    Donc si je met me.hide partout ou j'ai unload me, ou je dois mettre unload me ?

    Je dois supprimer unloadAdllForms aussi ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub Main()
    dim objForm as form
     
        Load objForm
        objForm.show vbModal
     
        Unload objForm
        set objForm = nothing
    End Sub
    dans ta form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub cmdBoutonQuitter_Click()
        'Ceci va permettre à la fonction Main() de reprendre son exécution
        Me.hide
    End Sub
     
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = vbFormControlMenu Then
            'Ce code sert à transformer le unload automatiquement fait avec la petite croix par défaut, en me.hide
            Cancel = 1
            cmdBoutonQuitter_Click()
        End If
    End Sub

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    Je crois que ça ne peux pas fonctionner comme ça, car j'ai souvent des form non modal, et une form non modal ne peux s'afficher si une fenêtre modal est affiché

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    je vois pas le rapport, tu peux très bien faire pareil sans modal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    objForm.show 
    while objForm.visible 
        doevents
    wend
     
    unload objForm
    set objForm = nothing

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    J'ai entendu dire que c'étail maal doevents

    Mais dans tout ça je place mon logoff ou dans ce cas-ci ?
    Je dois aussi faire un unload de toutes les autres forms non ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    Je me demande aussi, lorsque j'apelle ExitApp et qu'il apelle UnloadAllForms, il va unloader la form d'ou vient l'appel, mais au retour de l'exécution il se passe quoi exactement si la form n'est plus là ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    Finalement j'ai trouvé le bug

    Dans ma classe de connexion, dans ma procédure d'exécution de requête, je fesais

    Do While objCnn.State = adStateExecuting
    DoEvents
    Loop

    au lieu de

    Do While objCnn.State <> adStateOpen
    DoEvents
    Loop

    Alors que j'exécute en asynchrone, l'état n'était pas a 4 (adStateExecuting) mais à 5 qui est une combinaison de adStateOpen et adStateExecuting, alors la boucle ne se fesait pas et l'exécution continuait et comme la connexion se fermait dans ma Sub ExitApp lorsque le serveur envoyait la réponse l'objet de connexion n'existait plus, alors plantage!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour stopper mon programme
    Par kerozen77 dans le forum Débuter
    Réponses: 11
    Dernier message: 11/11/2014, 14h36
  2. Problème pour quitter le programme - PYGTK
    Par Unreal Time dans le forum Général Python
    Réponses: 0
    Dernier message: 10/11/2010, 22h10
  3. Probléme pour quitter mon application.
    Par HadJack dans le forum Qt
    Réponses: 1
    Dernier message: 19/10/2009, 09h55
  4. Procédure pour quitter mon programme
    Par Matalobos dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 19/04/2007, 20h37
  5. Besoin d'aide encore pour debugger mon programme
    Par jfjava2002 dans le forum C
    Réponses: 9
    Dernier message: 27/12/2005, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo