Rebond de boule de billard

Jacky - 8 févr. 2020 à 15:17
 Jacky - 26 févr. 2020 à 09:14
Bonjour à tous ,

Une boule de billard qui part, rebondit et ... le programme s'arrête sans explication ! !
Si quelqu'un pouvait m'aider à comprendre pourquoi et éventuellement m'aider à corriger mon code ce serait super.

Ancien adepte de VB4, puis 5 puis 6, je ne suis pas passé au VB Net. Je crains que ce ne soit VB6 sur Windows 8.1 qui pose des problèmes de compatibilité.
Je voulais m'amuser à faire un jeu de billard mais quand la boule disparaît ou s'arrête et que le programme "plante", c'est rageant.

Je peux donner mon code ( en partie ou en entier) à qui serait tenté de m'aider.
Merci d'avance à celui qui me viendra en aide.
Jacques.

5 réponses

JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7
8 févr. 2020 à 16:28
Salut Jacky,
"Plante" ? … fermeture de la fenêtre sans erreurs ?
Désolé, impossible de t'aider.
1
Re bonjour Jeu du Taquin,
Je croyais avoir répondu et cliqué sur merci mais la page est revenue !
Donc quand je dis "plante", c'est VB6 qui ne répond plus. Arrive la page Fermer ou Attendre et je suis obligé de fermer VB6 !
J'ai beau essayer de mettre mes variables en "double" ou "currency" ou "variant", rien n'y fait.
Soit c'est un problème de temps d'affichage soit un problème de compatibilité ente V6 et W 8.1 !
Au cas où tu t'intéresserais davantage : sur ma form il y a une shape rectangulaire ( le tapis), et une shape ronde ( ma boule) que je lance sur une line que je peux orienter à partir du centre de la shape boule . Je la fait rebondir sur le bord de la shape tapis.
Elle rebondit bien entre 1 et 10 fois puis sans raison, s'arrête ou disparait avec l'apparition de l'icône "occupé" et en haut de ma form "VB6 ne répond plus" !

Voilà, je peux t'envoyer mon code si tu pense pouvoir le débuger.
Merci d'avance et bon dimanche,
Jacques
1
NHenry
Messages postés
14930
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 mai 2022
161
9 févr. 2020 à 11:53
Sans voir le code, dur de répondre.
Changer le type des variables au pif, c'est pas la bonne méthode pour debug.
As-tu essayé le Ctrl+ArretDefil ?
0
Jacky > NHenry
Messages postés
14930
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 mai 2022

Modifié le 9 févr. 2020 à 21:25
Bonjour NNenry,
Merci de t'intéresser à mon problème.
C'est la 1ère fois que je fais appel au forum et je ne sais trop comment m'y prendre.
Si tu veux t'amuser avec mon début de jeu, je vais voir si je peux loger mon code dans le message.
J'espère ne pas t'importuner et si tu abandonnes, je ne t'en voudrai pas !

Je vais essayer de voir s'il n'y a pas des rappels de procédures intempestifs entre elles. Je te dirai si je trouve !

Sur ma form "Ecran", j'ai une shape "TP" (le tapis), une shape B (la boule), une shape "Q" ( la queue de billard), une shape "L" ( ligne de direction à suivre ), un bouton "Go" pour lancer la boule selon la line L, un bouton "Tape" pour lancer la boule avec la queue de billard, un denier bouton "Fin" pour quitter et un label "Lb" pour capter des infos.

Quelque soit la possibilité ( sans ou avec la queue de billard) VB6 ne répond plus et n'importe quel jeu de touches ne peut faire reprendre le programme !

Voici donc le code :
D'abord le module :

Option Explicit

Public Declare Sub Sleep Lib "Kernel32.dll" (ByVal dwMillisenconds As Long)
Public scH As Long
Public scW As Long
Public i As Integer     ' indice de boucle
Public V As Variant     ' centre de la boule
Public H As Variant     ' centre de la boule
Public N As Variant     ' Côté opposé
Public Hz, Vt As Integer    'Distance horizontale et verticale
Public Rap As Variant   '= tangente de l'angle de déplacement
Public Att As Integer   'Variable pour le temps de Sleep en millisec
Public Lx1, Lx2, Ly1, Ly2   ' Extrémités de la ligne L
Public Clk As Boolean   ' Bouton souris enfoncé ou pas
Public Lq As Integer    ' longueur de la queue de billard
Public Ecart As Integer 'Déplacement de l'extrémité de la queue

_________________________________________________________
Public Sub Main()
scH = Screen.Height: scW = Screen.Width     ' 12960 x 23040
Ecran.Height = scH: Ecran.Width = scW
Ecran.Fin.Left = scW - 1000: Ecran.Fin.Top = scH - 500
Ecran.Go.Left = scW - 2000: Ecran.Go.Top = scH - 500
Ecran.Tape.Left = scW - 3000: Ecran.Tape.Top = scH - 500
Ecran.TP.Height = 8000: Ecran.TP.Width = 16000
Ecran.TP.Left = 2500: Ecran.TP.Top = 2500
H = 6500: V = 6500
H2 = 13000: V2 = 3200
Lq = 2800   'Longueur de la queue Q : 2800
Ecran.B.Left = H - 240: Ecran.B.Top = V - 240
Ecran.R.Left = H2 - 240: Ecran.R.Top = V2 - 240
Ecran.Q.X2 = H: Ecran.Q.Y2 = V
Ecran.Q.X1 = H - Lq: Ecran.Q.Y1 = V
Ecran.L.X1 = Lx1: Ecran.L.Y1 = Ly1: Ecran.L.X2 = Lx2: Ecran.L.Y2 = Ly2
Att = 8

Ecran.Lb.Left = 19000
Ecran.Show
'Ecran.QQ.Left = 100: Ecran.QQ.Top = V - 50
End Sub
'
==================================================
' Procédure pour le lancement en utilisant la queue de billard
Public Sub Deplace()
'If Vt = 0 Then '   EN ATTENTE
'If Hz = 0 Then'   EN ATTENTE
If Vt > 0 And Hz > 0 Then NO
If Vt > 0 And Hz < 0 Then NE
If Vt < 0 And Hz < 0 Then SE
If Vt < 0 And Hz > 0 Then SO
End Sub
_________________________________________________________
Public Sub NO() '       Venant du SE
    For i = 1 To 500 Step 10
        V = V - i * Rap: H = H - i
        If V - 240 < 2500 Then Rap = -Rap: SO
        If H - 240 < 2500 Then Rap = -Rap: NE
        Trace
    Next
End Sub
_________________________________________________________
Public Sub NE() '       Venant du SO
    For i = 1 To 500 Step 10
        V = V + i * Rap: H = H + i
        If V - 240 < 2500 Then Rap = -Rap: SE
        If H + 240 > 18500 Then Rap = -Rap: NO
        Trace
    Next
End Sub
_________________________________________________________
Public Sub SO() '       Venant du NE
    For i = 1 To 500 Step 10
        V = V - i * Rap: H = H - i
        If V + 240 > 10500 Then Rap = -Rap: NO
        If H - 240 < 2500 Then Rap = -Rap: SE
        Trace
    Next
End Sub
_________________________________________________________
Public Sub SE() '       Venant du NO
    For i = 1 To 500 Step 10
        V = V + i * Rap: H = H + i
        If V + 240 > 10500 Then Rap = -Rap: NE
        If H + 240 > 18500 Then Rap = -Rap: SO
        Trace
    Next
End Sub
_________________________________________________________
Public Sub Trace()
'    Affichage de la boule
'If V > 2740 And V < 10260 And H < 18260 And H > 2740 Then
    Ecran.B.Left = H - 240: Ecran.B.Top = V - 240: Sleep (100)
'    Else        '       Retour si la boule est sortie du tapis
'    H = 6500: V = 6500
'    Ecran.B.Left = H - 240: Ecran.B.Top = V - 240
'End If
End Sub

'========================================================


Et la Form nommée "Ecran" pour continuer et finir :

' 1ère possibilité
' Sans utiliser la queue de billard
' on ulilise la souris pour placer la ligne dans la direction voulue
' la boule suivra l'axe de la ligne tracée quand on clic sur "Go"
'====================================================================
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'   Ancrage de la ligne au centre de la boule
Lx1 = H: Ly1 = V: Clk = True
End Sub
_________________________________________________________
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'   Placement de la ligne de lancement avec le clic de la souris
Lx2 = X: Ly2 = Y
If Clk Then
    With Me.L
        .X1 = Lx1
        .Y1 = Ly1
        .X2 = Lx2
        .Y2 = Ly2
        .Visible = True
    End With
End If
End Sub
_________________________________________________________
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
'   Ancrage du bout de la ligne avant de lancer la boule
Lx2 = X: Ly2 = Y: Clk = False
Vt = (Y - V): Hz = (X - H): Rap = Vt / Hz
'Lb.Caption = "horiz =  " & Hz & vbCrLf & "vert =  " & Vt & vbCrLf & "Rap = " & Vt / Hz
End Sub
_________________________________________________________
Private Sub Go_Click()
'   Lancement de la boule
'   et calcul de la direction par rapport à son centre
'If Vt = 0 Then
'    EN ATTENTE
'End If
'If Hz = 0 Then
'    EN ATTENTE
'End If
If Vt > 0 And Hz > 0 Then SudEst
If Vt > 0 And Hz < 0 Then SudOuest
If Vt < 0 And Hz < 0 Then NordOuest
If Vt < 0 And Hz > 0 Then NordEst
End Sub
_________________________________________________________
Public Sub SudEst()
Att = Att + 10  ' à chaque rebond la boule ralentit
For i = 1 To 500
    '   Déplacement de la boule et rebond si elle arrive au bord tu tapis
    V = V + i * Rap: H = H + i
    If V + 240 > 10500 Then Rap = -Rap: NordEst
    If H + 240 > 18500 Then Rap = -Rap: SudOuest
affich
Next
End Sub
_________________________________________________________
Public Sub SudOuest()
Att = Att + 10
For i = 1 To 500
    V = V - i * Rap: H = H - i
    If V + 240 > 10500 Then Rap = -Rap: NordOuest
    If H - 240 < 2500 Then Rap = -Rap: SudEst
affich
Next
End Sub
_________________________________________________________
Public Sub NordOuest()
Att = Att + 10
For i = 1 To 500
    V = V - i * Rap: H = H - i
    If V - 240 < 2500 Then Rap = -Rap: SudOuest
    If H - 240 < 2500 Then Rap = -Rap: NordEst
    affich
Next
End Sub
_________________________________________________________
Public Sub NordEst()
Att = Att + 10
For i = 1 To 500
    V = V + i * Rap: H = H + i
    If V - 240 < 2500 Then Rap = -Rap: SudEst
    If H + 240 > 18500 Then Rap = -Rap: NordOuest
    affich
Next
End Sub
_________________________________________________________
Public Sub affich()
'   Tant que la boule reste sur le tapis
If H > 2500 And H < 18500 And V > 2500 And V < 10500 Then
    B.Left = H - 240: B.Top = V - 240: Sleep (Att)
End If
End Sub
Private Sub Fin_Click()
End
End Sub

'=================================
'=================================
' 2ème possibilité
' En utilisant la queue de billard
' On utilise les touches flèches pour placer la queue comme on veut
' La boule prendra la même direction que la Queue de billard
' Lancement avec le bouton "TAPE"

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then End
Lb.Caption = ""
Ecart = 10
'   Déplacement de l'exremité de la queue pour trouver le bon angle
Select Case KeyCode
    Case 37
        If Q.X1 - Ecart < H - 2800 Then Exit Sub
        Q.X1 = Q.X1 - Ecart
        XY (Abs(H - Q.X1))
        If Q.Y1 < V Then Q.Y1 = V - N Else Q.Y1 = V + N
    Case 38
        If Q.Y1 - Ecart < V - 2800 Then Exit Sub
        Q.Y1 = Q.Y1 - Ecart
        XY (Abs(V - Q.Y1))
        If Q.X1 < H Then Q.X1 = H - N Else Q.X1 = H + N
    Case 39
        If Q.X1 + Ecart > H + 2800 Then Exit Sub
        Q.X1 = Q.X1 + Ecart
        XY (Abs(H - Q.X1))
        If Q.Y1 < V Then Q.Y1 = V - N Else Q.Y1 = V + N
    Case 40
        If Q.Y1 + Ecart > V + 2800 Then Exit Sub
        Q.Y1 = Q.Y1 + Ecart
        XY (Abs(V - Q.Y1))
        If Q.X1 < H Then Q.X1 = H - N Else Q.X1 = H + N
    Case 27
        End
End Select
Vt = Q.Y1 - V: Hz = Q.X1 - H: Rap = Vt / Hz
Lb.Caption = "Vert =  " & Vt & vbCrLf & "Horiz =  " & Hz & vbCrLf & "Rap =  " & Vt / Hz
End Sub
_________________________________________________________
Public Function XY(z)
'   calcul  du côté opposé pour avoir la tangente
N = Sqr(Abs((2800 ^ 2) - (z ^ 2)))
End Function
_________________________________________________________
Private Sub Tape_Click()
'   Lancement de la boule
'   (La procédure "Deplace" est dans le module)
Deplace
End Sub

Bon courage,
Jacques
0
JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7 > Jacky
Modifié le 9 févr. 2020 à 22:01
Salut Jacques,

C'est une overflow sur la variable Att pour ton Sleep.
Vu que tu te retrouves sur un appel de fonction système, l'IDE plante ton appli.
Si ta variable Att est non maîtrisée, c'est qu'il y a un problème sur un test.

Tu as la possibilité de mettre les sources en ligne, dans un fichier zippé en le déposant dans un snippet, en tant que programme que tu mettras jour au grès de tes corrections.
Testé sur VB5/Windows10.
0
Jacky > JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022

10 févr. 2020 à 10:08
Bonjour Jeu du Taquin,

Merci de ton aide.
Je crois que c'est ce que je venais de trouver : Je viens de diminuer le diamètre de ma boule et ça fonctionne un peu mieux.
Par contre, je n'ai jamais fait de mise à niveau sur mes connaissances et je ne comprends pas tout ton vocabulaire ( overflow, j'imagine que ça correspond à l'erreur de "pile", IDE?, snippet? . . c'est moins important !)
J'ai vu qu'il y avait un problème avec ma variable Att - qui pour moi était juste pour ralentir la boule après chaque rebond - car j'ai l'impression que parfois ma boule accélère au lieu de ralentir ! Ça je ne comprend pas pourquoi. Je n'ai aucun test sur Att !
J'ai fait arrêter ma boule à chaque rebond et afficher dans le label : V, H, et Rap et j'ai donc vu que la boule parfois rebondit au milieu du tapis !
Autre truc incompréhensible : la boule rebondit convenablement, s'arrête au milieu du tapis, (icône occupé !) et réapparaît au rebond suivant après quelques secondes ! Et ça, sans bloquer le programme !

Mais petit à petit je vais peut-être y arriver !

Sinon, tu parles de VB5 sur W 10 ! C'est-y possible ?
Je n'ai plus la possibilité d'installer VB5 ( c'est sur de vieilles disquettes ) j'ai essayé à partir d'une ancienne installation, j'ai une incompatibilité avec W 8.1 ( que j'avais eu aussi avec W 8) et même VB6 a du mal à être installé, j'ai des erreurs d'installation quand je tente d'y ajouter les mises à jours que j'ai.
Faut dire que mon disque d'installation de VB6 vient d'un disque piraté il y a au moins 15 ans.

Tout fonctionnait très bien avec W XP jusqu'aux premières mises à jours de W XP !
Après ça a été de pire en pire. J'avais eu juste envie de reprendre VB6.

Mais je digresse, pardon.
Merci encore et bonne journée,
Jacques
0
NHenry
Messages postés
14930
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 mai 2022
161 > Jacky
10 févr. 2020 à 18:33
Je n'ai pas plus regardé que cela, mais ton méthode de déplacement m'interroge, une méthode prise au hazard :
Public Sub SudOuest()
Att = Att + 10
For i = 1 To 500
    V = V - i * Rap: H = H - i
    If V + 240 > 10500 Then Rap = -Rap: NordOuest
    If H - 240 < 2500 Then Rap = -Rap: SudEst
affich
Next
End Sub


Pourquoi faire une boucle de 500 ?
Au lieu de mettre les valeurs en dur dans le code (2500, 10500, ...) préfères utiliser les constantes ou les données de objets (Shape.Width par exemple)

Ensuite sur la forme, on évite l'utilisation des :
If V + 240 > 10500 Then Rap = -Rap: NordOuest

Est moins lisible et maintenable que
If V + 240 > 10500 Then 
    Rap = -Rap
    NordOuest
End If


Ensuite, on limite la portée des variables autant que possible (ici "i" devrait être locale).
Et si tu termine ta boucle avant i=500, il est préférable de faire un "Exit For" ou "Exit Sub" selon le cas, cela rendra ton code moins sujet à des effets de bords.
0
vb95
Messages postés
2639
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
27 mai 2022
151
Modifié le 10 févr. 2020 à 18:01
Bonjour
Un "overflow" est un dépassement de capacité
La variable Att qui te sert pour faire une temporisation est de type Integer .
La plage de valeurs pour ce type va de - 32768 à + 32767 en VB 6 . hors dans le code tu augmente la variable Att ( à la ligne 64 de le form Ecran) . A un moment Att devient supérieure à +32767 et cela plante .
De plus l'API Sleep prend comme paramètre un Long : pourquoi donc Att est un Integer ?
Mets le en Long
Autre chose : évite le type Variant qui prend beaucoup de temps machine : préfères plutôt les types Integer, Long, Single ou Double
Les variables V, H et N devraient être des Integer
Quant à Rap 2 solutions
- Integer mais dans ce cas il faut utiliser la division entière
- Single mais pour l'utiliser il faut faire une conversion en Integer

Concernant VB 6 il n'est plus mis à jour depuis 1998 si ce ne sont les correctifs de sécurité qui ont perduré jusqu'en 2008 . J'ai utilisé VB 6 pendant une dizaine d'années et depuis bientôt 10 ans je suis passé à VB Net ( VB 6 ne fonctionnant plus avec Windows 8 et supérieur à moins de "bidouiller" d'après certains ) et j'en suis tout à fait satisfait .

1
vb95
Messages postés
2639
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
27 mai 2022
151
Modifié le 11 févr. 2020 à 17:19
Bonjour
Un truc qui me chagrine ( je peux me tromper )
Prenons ce cas là
Public Sub SudOuest()
    Att = Att + 10
    For i = 1 To 500
        V = V - i * Rap: H = H - i
        If V + 240 > 10500 Then Rap = -Rap: NordOuest
        If H - 240 < 2500 Then Rap = -Rap: SudEst
    affich
    Next
End Sub


La boule va vers le SudOuest . On teste avec les 2 If si elle arrive sur le bord du tapis en bas ou à gauche . Si c'est en bas elle prend la direction NordOuest et si c'est à gauche elle prend la direction SudEst .
Mais pourquoi ne pas sortir de la boucle For de la Sub SudOuest au changement de direction ?
Moi je ferais ainsi
Public Sub SudOuest()
     Dim Exit as Integer
     Att = Att + 10
    Do
        V = V - 1 * Rap: H = H - 1
        If V + 240 > 10500 Then Exit = 1: Exit Do
        If H - 240 < 2500 Then Exit = 2: Exit Do
        affich
    Loop
    If Exit = 1 Then Rap = -Rap: NordOuest
    If Exit = 2 Then Rap = -Rap: SudEst
End Sub


Tant que la boule ne touche pas le bord du tapis on reste dans la boucle Do Loop
Si elle touche on sort de la boucle avec Exit = 1 ou 2 selon le bord touché et selon le bord on rentre dans la Sub NordOuest ou SudEst


0
NHenry
Messages postés
14930
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 mai 2022
161
11 févr. 2020 à 18:45
Je dirais même (comme les Dupon(t/d) :
Mettre en variable le décalage en X et Y (1 / -1) et quand tu touches un bord, tu changes le signe de la variable.
Comme ça même plus besoin de faire 4 procédures pour faire les 4 directions.
0
vb95
Messages postés
2639
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
27 mai 2022
151 > NHenry
Messages postés
14930
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 mai 2022

Modifié le 11 févr. 2020 à 19:05
Tu as tout à fait raison NHenry .
Il faut une variable de décalage sur X et une sur Y .
Dans ce cas il faut 4 IF pour gérer les 4 rebonds sur les bords .
Il y a de l'optimisation à faire à mon avis ( dommage que je ne programme plus en VB 6 : cela m'aurait bien tenté )
Cependant comment arrèter la boucle Do Loop ? Surement avec le ralentissement de la boule géré par le Sleep(Att) : quand Att attend une certaine valeur on sort du Do Loop
0
JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7 > vb95
Messages postés
2639
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
27 mai 2022

Modifié le 12 févr. 2020 à 00:48
Salut,
Pour un jeu des "quatre bandes", un traitement linéaire est approprié, mais si une frappe occasionne le déplacement d'une autre boule, le problème se pose.
Même chose pour le sleep… qui bloque temporairement la scrutation du code.
Il serai plus judicieux d'utiliser un code de ralentissement fixe et jouer sur un facteur de ralentissement basé sur une variable de déplacement de 0 à 1.
Il sera donc difficile de faire des déplacements synchrones avec plusieurs boules avec ce type de code.
0

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

Posez votre question
Bonjour ,
Une question bête : si je réponds avec le bouton rouge, est-ce que la réponse va à tout le monde ? Et dans le bas d'une réponse seulement à celui qui a répondu ? Et qu'est-ce que ça fait de cliquer sur "Merci" ?
Je mets mon adresse mail et je coche recevoir par mail mais je ne suis jamais averti par mail. Normal ?
Bref, merci à tout le monde.
Y a-t-il une différence entre sortir de la boucle par Exit Sub ou sortir par Exit Do ou Exit For ?
Je pense que l'idée des variables X et Y inversées au rebond mérite réflexion.
Ça vaut le coup de diminuer le nombre de procédures. Mais comme je n'ai pas envie de perdre ce que j'ai déjà fait, il va falloir refaire le programme !
J'ai essayé un choc entre deux boules, ça marche mais j'ai encore le problème de non affichage des boules: il y a un temps pendant lequel les boules sont immobiles puis réapparaissent au bon endroit à la fin de la boucle.
Je crois qu'effectivement c'est la variable Att de Sleep qui pose problème.
J'ai tenté de la faire augmenter au fur et à mesure de la boucle pour ralentir la boule mais c'est pire; surtout avec 2 boules !
Je vais regarder ce que ça peu donner si on l'inclue dans la boucle, elle serait sans doute vidée en sortant de la boucle.
C'est vrai qu'il faudrait trouver un autre moyen pour ralentir la boule. Est-ce qu'un Timer aiderait ? Je vais tâcher d'y réfléchir mais je vais manquer de temps ces jours-ci.
Quant à gérer le déplacement de 2 boules, il faut juste avoir une variable "Rap" pour chaque boule : j'ai expérimenté et ça marche mais c'est toujours le problème d'affichage - dû très probablement au "Sleep" - qui coince.

A plus et merci encore de votre aide.
Jacques.
0
vb95
Messages postés
2639
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
27 mai 2022
151
12 févr. 2020 à 19:52
bonsoir Jacky
1) Le bouton rouge est une réponse générale au post d'origine . L'autre bouton est une réponse spécifique à un commentaire ou une réponse spécifique .
Tout le monde voit toutes les réponses sans exception ( faut parfois cliquer sur "Afficher les commentaires" pour voir la discussion entière : voir image ci-jointe)

2) Pour le sortie d'une boucle on privilégie le Exit For ou le Exit Do . Cependant si en sortie de boucle la procédure n'a plus de code on pourrait faire un Exit Sub mais cela revient à un Exit For ou Exit Do

Public Sub SudOuest()
     Dim Exit as Integer
     Att = Att + 10
    Do
        V = V - 1 * Rap: H = H - 1
        If V + 240 > 10500 Then Exit = 1: Exit Do ' Exit Do obligatoire car code en sortie de boucle
        If H - 240 < 2500 Then Exit = 2: Exit Do
        affich
    Loop
    If Exit = 1 Then Rap = -Rap: NordOuest
    If Exit = 2 Then Rap = -Rap: SudEst
End Sub

Public Sub SudOuest()
     Dim Exit as Integer
     Att = Att + 10
    Do
        V = V - 1 * Rap: H = H - 1
        If V + 240 > 10500 Then Exit Do ' Exit Do ou Exit Sub mais préférer Exit Do car boucle Do Loop
        If H - 240 < 2500 Then Exit Do
        affich
    Loop
End Sub

Public Sub TestFichier(Fichier as String)
    If System.IO.File.Exits(Fichier) = false then Exit Sub ' là c'est un Exit Sub obligatoire
    ' suite du code si le fichier existe
    ''''''
    ''''''   
End sub
0