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 :

Pb fermeture de fenetre


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut Pb fermeture de fenetre
    Bonjour à tous,

    voilà, j'ai créé mon premier programme qui fait rebondir une balle dans une fenetre. Dans une autre fenetre je controle l'arret, le relancement de la balle et la fermeture des fenetres. Selon les demandes de marche ou d'arret de l'utilisateur par l'intérmédiaire de 2 boutons arret et marche d'une form je fais appel à une procedure de dessin de la balle dans une autre form. Cela marche normalement. Seulement le pb est a la fermeture des fenetres. j'ai mis le code unload form1 et unload form2 sur l'appui du bouton quit. cela ferme les fenetres normalement lorsque la balle est à l'arret (apres un appui sur arret) mais cela ouvre à nouveau la fenetre de controle lorsque la balle est en marche (il faut la fermée une seconde fois).

    si quelqu'un à une idée... Merci beaucoup.

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Avant de fermer la fenêtre, arrête la boucle qui fait déplacer ta balle (en appelant la sub du bouton de commande "Arrêt").
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    La boucle est bien arretée avant la fermeture. la boucle est conditionnée par une variable qui change d'état lors d'un appui sur quit.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ J'avais essayé votre programme quand, dans un fil précédent, vous cherchiez comment ralentir la balle.
    _ Si le code n'a pas changé, le placer dans la procédure Form_Paint ne risque-t-il pas d'avoir des effets de bord gênants (dont celui-ci) ?
    _ N'ayant pas le code de l'autre feuille, j'ai essayé
    a) de placer trois boutons (Marche, Pause, Fermer) directement dans la feuille de la balle,
    b) de placer le code du dessin de la balle dans la procédure Click du bouton [Marche], en dessinant la balle dans une zone d'image (PictureBox).
    _ Dans ces conditions, la feuille se ferme normalement, que la balle soit en marche ou à l'arrêt.
    _ Bonne poursuite de votre travail.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    N'y a t-il pas moyen de garder les deux fenetres et eviter le pb. Pour exemple j'ai fait le même programme sous delphi qui tourne bien. La seule différence c'est que je ne fait pas appel à une procecure que j'ai declarée précédement. Je relance l'événement onpaint pour relancer la balle à l'aide de la commande Form1.invalidate (delphi). Je sais qu'il existe une commande similaire en VB6 RaiseEvent. Mais je n'arrive pas à l'ecrire correctement.

    Si quelqu'un à une idée...Merci.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    J'ai finalement reussi par une petite pirouette à fermer les 2 fenetre correctement. J'ai remarqué que le pb provenait à la fermeture de la form balle quand la balle est lancée et lorsque la commande unload form balle est placé dans la form controle. J'ai donc placé la commande unload form.balle dans la form balle pour fermer correctement et pour fermer correctement quand la balle est à l'arret sans refaire un unload form balle dans le cas balle lancée j'ai conditionné l'unload form.balle (if go = false) dans la form controle pour decharger la feuille que quand la balle est à l'arret.

    ca marche seulement j'ai aucune idée d'ou venait le pb.

    Je laisse le code si le pb intéresse quelqu'un.

    form1
    ____________________________________________________________
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    Private Sub Form_Load()
    Form2.Show
    End Sub
     
    Private Sub Form_Paint()
    Randomize
    x = Int((ScaleWidth - 100 + 1) * Rnd + 50)
    y = Int((ScaleHeight - 100 + 1) * Rnd + 50)
    FillStyle = 0
    Circle (x, y), 50, black
    coefd = Int(2 * Rnd + 1)
    ax = Int((6 - 1) * Rnd + 1)
    ay = Int((6 - 1) * Rnd + 1)
    c = 1
    Select Case coefd
    Case 1
    b = y - ax * x
    Case 2
    b = y - (x / ay)
    End Select
    End Sub
     
    Public Sub Dessin()
     
    Do While (x > 50) And (x < (ScaleWidth - 50)) And (y > 50) And (y < (ScaleHeight - 50)) And (Form2.go = True) And (Form2.quit = False)
     
    FillColor = vbWhite
    Line (0, 0)-Step(ScaleWidth, ScaleHeight), , B
    FillColor = vbBlack
    Circle (x, y), 50, black
    For i = 0 To 30000
    Next i
    Select Case coefd
      Case 1
      x = x + c
      y = ax * x + b
      Case 2
      y = y + c
      x = (y - b) * ay
      End Select
    DoEvents
    If (x <= 50) Or (x >= (ScaleWidth - 50)) Then
    Select Case coefd
      Case 1
      ax = -ax
      b = y - ax * x
      c = -c
      x = x + c
      y = ax * x + b
      Case 2
      ay = -ay
      b = y - (x / ay)
      y = y + c
      x = (y - b) * ay
      End Select
    End If
    If (y <= 50) Or (y >= (ScaleHeight - 50)) Then
      Select Case coefd
      Case 1
      ax = -ax
      b = y - ax * x
      x = x + c
      y = ax * x + b
      Case 2
      ay = -ay
      b = y - (x / ay)
      c = -c
      y = y + c
      x = (y - b) * ay
      End Select
    End If
    Loop
    If Form2.quit = True Then
    Unload Form1
    End If
     
    End Sub
    form2
    ________________________________________________________

    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
     
    Private Sub Command1_Click()
    go = True
    Call Form1.Dessin
    End Sub
     
    Private Sub Command2_Click()
    go = False
    End Sub
     
    Private Sub Command3_Click()
    quit = True
    Unload Form2
    If go = False Then
    Unload Form1
    End If
    End Sub
    Merci à tous. Bonne Journée.....

  7. #7
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    C'est original comme démarche de nous donner ton code une fois le problème résolu et non pas avant.
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  8. #8
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Trois questions annexes :
    1) êtes-vous bien en VB6 ?
    2) si oui, pour pouvoir utiliser une variable (go et quit) dans plusieurs feuilles, existe-t-il un moyen autre que de les déclarer dans un module ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Go as Boolean, Quit as Boolean
    _ chez moi, VB a refusé obstinément la syntaxe Form2.go (message d'erreur : Méthode ou membre de données introuvable) ;
    3) à ce propos, et plus généralement, comment les variables sont-elles déclarées ?
    _ Bonne journée à vous et à tous.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Je suis bien en VB6 et les variables go et quit sont declarées dans les declarations générales de la form de la fenetre controle.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    J'ai modifieé le programme pour faire comme vous dites Xylonakau. j'ai mis les trois boutons dans la fenetre de la balle et le dessin dans une picturebox. ca ferme effectivement bien les fenetres et le code me semble plus propre. Il y a juste une chose que j'aimerais bien resoudre.

    j'ai été obligé de mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If quit = True Then
    Unload Form1
    End If
    apres la boucle dans la commande du bouton go pour decharger la feuille lors de la fermeture quand la balle est lancée. Pourtant la meme commande est dans le bouton quit. mais si on ne met pas ces lignes la boucle est bien arretée mais quelque chose reste actif (je ne sors pas du mode execution).

    Si quelque serait dire quoi et comment resoudre (en ne mettant qu'une seule fois unload form1 je suppose).
    Et par ailleurs le pb est le meme quand on ferme par la croix.

    Cette fois ci je vous met le code.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    Private x, y, ax, ay, c, coefd As Integer
    Private i, t, b As Long
    Private arret, quit As Boolean
     
    Private Sub Command1_Click()
     
    arret = False
     
    Do While (x > 50) And (x < (Picture1.ScaleWidth - 50)) And (y > 50) And (y < (Picture1.ScaleHeight - 50)) And (arret = False) And (quit = False)
     
    Picture1.FillColor = vbWhite
    Picture1.Line (0, 0)-Step(ScaleWidth, ScaleHeight), , B
    Picture1.FillColor = vbBlack
    Picture1.Circle (x, y), 50, black
    For i = 0 To t
    Next i
    Select Case coefd
      Case 1
      x = x + c
      y = ax * x + b
      Case 2
      y = y + c
      x = (y - b) * ay
      End Select
    DoEvents
    If (x <= 50) Or (x >= (Picture1.ScaleWidth - 50)) Then
    Select Case coefd
      Case 1
      ax = -ax
      b = y - ax * x
      c = -c
      x = x + c
      y = ax * x + b
      Case 2
      ay = -ay
      b = y - (x / ay)
      y = y + c
      x = (y - b) * ay
      End Select
    End If
    If (y <= 50) Or (y >= (Picture1.ScaleHeight - 50)) Then
      Select Case coefd
      Case 1
      ax = -ax
      b = y - ax * x
      x = x + c
      y = ax * x + b
      Case 2
      ay = -ay
      b = y - (x / ay)
      c = -c
      y = y + c
      x = (y - b) * ay
      End Select
    End If
    Loop
    If quit = True Then
    Unload Form1
    End If
    End Sub
     
    Private Sub Command2_Click()
    arret = True
    End Sub
     
    Private Sub Command3_Click()
    quit = True
    Unload Form1
    End Sub
     
    Private Sub Form_Activate()
    Picture1.FillColor = vbBlack
    Picture1.Circle (x, y), 50, black
    End Sub
     
    Private Sub Form_Load()
    Randomize
    x = Int((Picture1.ScaleWidth - 100 + 1) * Rnd + 50)
    y = Int((Picture1.ScaleHeight - 100 + 1) * Rnd + 50)
    coefd = Int(2 * Rnd + 1)
    ax = Int((6 - 1) * Rnd + 1)
    ay = Int((6 - 1) * Rnd + 1)
    c = 1
    Select Case coefd
      Case 1
      Select Case ax
        Case 1
        t = 30000
        Case 2
        t = 47440
        Case 3
        t = 67090
        Case 4
        t = 87470
        Case 5
        t = 108180
      End Select
      Case 2
      Select Case ay
        Case 1
        t = 30000
        Case 2
        t = 47440
        Case 3
        t = 67090
        Case 4
        t = 87470
        Case 5
        t = 108180
      End Select
    End Select
    Select Case coefd
    Case 1
    b = y - ax * x
    Case 2
    b = y - (x / ay)
    End Select
    End Sub

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Une precision, j'ai l'impression que la boucle est bien arreté mais aprés la fermeture de la form.

  12. #12
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Au passage, il n'est pas possible de déclarer implicitement plusieurs variables de même type : si l'on écrit
    seul b sera un nombre Long ; i et t seront des Variant (type par défaut).
    _ Ne sachant que répondre à votre question, j'ai supprimé les lignes 58 à 60 ainsi que la ligne 68 (et, plus généralement toute référence à quit) : la ligne 69 suffit à fermer le programme.
    _ Enfin, j'ai dû oublier quelque chose quelque part car, (contrairement à la première version), au lieu d'une balle, j'ai un trait qui s'allonge au fur et à mesure que le temps passe.
    _ Bonne réussite pour la suite de votre projet.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Pour resoudre le trait qui s'allonge il faut mettre le fillstyle de la picture1 à 0. je l'avais fait dans la fenetre de propriété.

  14. #14
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Merci pour cette précision, qui permet en effet de retrouver la vraie balle. D'ailleurs, ce problème ne se posera pas si vous créez un exécutable ; mais il serait peut-être plus sûr d'ajouter, dans Form_Activate,
    pour rendre le code entièrement portable.
    _ Bonne semaine.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Pour ceux que ca interesse. J'ai finalement mis fin au probleme de façon propre. En lisant le bouquin Visual Basic j'ai trouvé la commande End qui met fin à l'application. je l'ai integré à l'événement click du bouton quit. Cela ferme l'application que la boucle soit arretée ou non.

    Merci à tous. et Bonne Journée.

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

Discussions similaires

  1. Fermeture de fenetre
    Par BenoitDenis dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 18/04/2005, 11h37
  2. Fermeture de fenetre
    Par frouge dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 11/03/2005, 09h58
  3. [JSP] fermeture de fenetre
    Par JackNanPie dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 05/01/2005, 11h38
  4. fermeture de fenetre
    Par JackNanPie dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/01/2005, 14h34
  5. [debutant] Fermeture de fenetre
    Par wkd dans le forum Agents de placement/Fenêtres
    Réponses: 26
    Dernier message: 04/06/2004, 17h01

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