Bonjour, voilà mon petit problème :

J'ai une form1, et pour valider les infos dans ma form et génerer un rapport, je clique sur un bouton, le bouton générer comme sur la photo ci-dessous :



Une fois que je clique sur mon bouton générer, la form1 se ferme et une form2 apparaît, avec une picturebox comportant une image.gif, qui est censé être animée. Cette form2 est une form "d'attente", qui est censé être affiché pendant la génération du tableau de bord, comme l'image ci-dessous :

Attention il ne s'agit pas d'une progressbar malgrès le nom de la form2



Et donc pendant que cette form est affichée, derrière je veux que mon code s'éxécute, et quand il a fini, ma form2 se ferme et uen form3 affiche mon tableau d ebord. Aucun souci à ce niveau là cela fonctionne, mais le seul problème c'est qu'il faut "chainrefresh" la form2 ou la picturebox de la form2 contenant l'image.gif, pour que le mouvement s'effectue, c'est là que vient mon problème.

J'ai essayé avec du doevent, ou du while mais ce n'est pas adapté.

Voici le code de mon bouton "générer" :

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
Public Sub Btgenerer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btgenerer.Click
 
        Dim msg, title As String
        Dim style As MsgBoxStyle
        Dim response As MsgBoxResult
 
        'Si aucune date n'a été rentrée, on ne peut continuer, messagebox d'erreur
        If Txtboxcal.Text = "" Then
 
            msg = "Vous n'avez pas sélectionné la date à considérée."   ' définit le message
            style = MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly Or MsgBoxStyle.SystemModal 'définit le style
            title = "Erreur"   ' définit le titre
            response = MsgBox(msg, style, title)
            GoTo toto
 
        End If
 
        'Gestion de l'affichage
        Me.Hide()
        Menu_principal.Refresh()
        Progressbar.pict1.Size = New Size(69, 66) '30,30
        Progressbar.pict1.Location = New Point(100, 70) '83 height
        Progressbar.pict1.Image = My.Resources.testbis
        Progressbar.Label2.Text = "Génération en cours"
        Progressbar.Text = "Génération du tableau de bord"
        Progressbar.Show()
        Progressbar.refresh()
 
 
        'Copie des rapports dans des tables
        Call CopieRapports()
 
        'Cherche les positions des balises début, fin et absence dans le tableau contenant
        'le rapport
        Call RechercheBalises()
 
        'Extraction 1
        Call sub1()
        Call sub2()
        Call sub3()
        Call sub4()
        Call sub5()
        Call sub6()
        Call sub7()
 
        'Extraction 2
        Call ExtractionActivity()
        Call ExtractionTaskMean()
        Call ExtractionMean()
        Call CreateTableWeek()
        Call UpdateTableActivity()
        Call CreateTM()
        Call BudgetConsomé()
        Call BudgetSemaine()
 
 
        'Génération du Tableau de bord
        Call Menu_principal.Datagrid1Load()
        Call Menu_principal.treeview(Menu_principal.Datagrid1, TableActivity, "+", My.Resources.pluss)
        Call Menu_principal.graphbar()
        Call Menu_principal.Datagrid2Load()
        Call Menu_principal.Datagrid3Load()
        Call Menu_principal.Datagrid4Load()
 
 
        'Lancement de la phase Calcul
        Call Calc_affich_nb_os_chef_total()
        Call Calc_affich_fourn_sstait_total()
        Call Calcul_affich_nb_materiel_total()
        Call Feuxetcouleurs()
 
        'On ferme la progressbar
        Progressbar.Hide()
 
toto:
 
    End Sub
En gros moi je veux un truc du genre :

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
      'Gestion de l'affichage
        Me.Hide()
        Menu_principal.Refresh()
        Progressbar.pict1.Size = New Size(69, 66) '30,30
        Progressbar.pict1.Location = New Point(100, 70) '83 height
        Progressbar.pict1.Image = My.Resources.testbis
        Progressbar.Label2.Text = "Génération en cours"
        Progressbar.Text = "Génération du tableau de bord"
        Progressbar.Show()
        Progressbar.refresh()
 
        'Tant que ma form2 est ouverte, refresh ma form2.pict1
        While Progressbar.visible = true
 
        Progressbar.pict1.refresh
 
        End While
 
        'On execécute tous mes sub
        Call mysubs()
 
        'On ferme la progressbar
        Progressbar.Hide()
OU encore :

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
       'Tant que ma form2 est ouverte, refresh ma form2
 
        dim x as integer = 1
        While x = 1
 
        Progressbar.pict1.refresh
 
        End While
 
        'On execécute tous mes sub
        Call mysubs()
 
        'Fin de ma boucle
        x = 2
 
        'On ferme la progressbar
        Progressbar.Hide()
Je sais bien que en faisant une boucle while comme je l'ai faite, ma boucle est infinie, donc y a-t-il moyen de lancer une boucle, puis que le sub continue d'exécuter le code situé après, et que quand il rencontre une condition définie dans ma boucle, il arrête la boucle.

Il faut sans doute recoller le Call mysubs() dans la boucle while avec un doevents et ma condition après le Call mysubs() ?

J'espère m'être fait comprendre, merci de vos réponses.