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.NET Discussion :

Gestion de t�l�chargement de fichiers


Sujet :

VB.NET

  1. #1
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut Gestion de t�l�chargement de fichiers
    Bonjour,

    Je crois que cette fois je vais poser un bon petit d�fi aux pros du VB avec mon probl�me

    Je vous explique : dans mon application je souhaite int�grer un outil de r�paration de certains fichiers. Pour cela j'ai cr�� un Form avec des checkbox, permettant � l'utilisateur de choisir quel(s) fichier(s) il souhaite r�parer. Pour la r�paration, je t�l�charge le ou les fichier(s) concern�(s) depuis mon Dropbox, et je supprime les anciens pour les remplacer par les nouveaux, et hop ! le tour est jou�.

    Cependant, l� o� je gal�re et je ne vois pas comment faire, c'est pour t�l�charger les fichiers. Je sais comment faire pour un fichier, mais impossible d'adapter pour plusieurs !

    Je m'explique bis : pour t�l�charger un fichier je passe par ce bout de code

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Try
                httpclient.DownloadFileAsync(New Uri(source), (destination))
            Catch ex As Exception
                Dim rep As MsgBoxResult
                rep = MsgBox("Téléchargement impossible." + vbCrLf & vbCrLf & ErrorToString() + vbCrLf + vbCrLf + "Veuillez réessayer ultérieurement ou contacter ClearMind Software.", vbOKOnly + vbCritical, "Erreur de téléchargement")
                If rep = vbOK Then
                  Process.Start("C:\ProgramData\Kumquat 2\restart.vbs")
                    End
                End If
            End Try
    avec la gestion de la progressbar et la gestion de fin de t�l�chargement dans des Sub s�par�s (bien � eux comme il faut). Cela fonctionne merveilleusement bien !

    Mais pour t�l�charger plus d'un fichier, c'est la mis�re ! Dans le Try, j'ai essay� de mettre des "If checkbox01.checked = true then", puis "If checkbox02.checked = true then" etc ... Mais avec plus d'un fichier, mon form dispara�t tout bonnement, et le t�l�chargement se fait en arri�re-plan mais que pour un seul fichier.

    Bref, j'ai essay� pleins de trucs, et rien � faire, je ne vois la marche � suivre. Donc si quelqu'un peut m'aider � y voir clair, �a m'aiderait vachement

    Apr�s, peu m'importe si les fichiers doivent �tres t�l�charg�s � la suite (l'un apr�s l'autre), ou s'il peuvent �tre t�l�charg�s en un seul "lot", cela ne me d�range aucunement, je trouverais comment m'en accommoder. Mais j'esp�re vraiment que quelqu'un aura une solution � me proposer car je nage total l� ^^'

    Merci d'avance � ceux qui tenteront l'aventure !

    Bien cordialement,

    --
    Shennong

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    Bonsoir,

    Je ne vois pas tr�s bien en quoi cela devrait donner du fil � retordre aux "Pros du VB" (comme tu dis) .....

    Il faut travailler avec une collection de String qui permet la gestion du premier arriv�, premier sorti ....et pour se faire il existe la classe Queue(Of ...).

    1- Donc dans un premier temps tu d�clares :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Private downloadUrls As New Queue(Of String)()
    2- Disons que tes urls sont stock�es dans un List(Of String) nomm� "urls"

    3- Tu ajoutes tes urls dans la file d'attente :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
      For Each u in urls
                downloadUrls.Enqueue(u)
      Next
    4- Tu cr��s une proc�dure qui sera lanc�s autant de fois (depuis DownloadF_DownloadFileCompleted) qu'il existe d'�l�ment dans la collection :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Private Sub DownloadF(dirPath$)
            ' On vérifie que la liste n'est pas vide à chaque lancement de la routine
            If downloadUrls.Any() Then
              '......
              '............. on instancie ici un objet de la classe WebClient, on s'abonne aux 2 events et on télécharges le fichier retournée par la méthode Dequeue...
            End If
        End Sub
    5- Tu travailles avec la classe WebClient en t'abonnant dynamiquement aux gestionnaires d��v�nement permettant de connaitre la progression et la fin de tache asynchrone :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      Using wc As New WebClient
                    With wc
                        AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                        AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                        'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                        Dim s = downloadUrls.Dequeue()
                        ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                        Dim fiName As New FileInfo(New Uri(s).AbsolutePath)
                        ' A noter que le 3ème argument est nécessaire pour relancer la méthode DownloadF s'il reste des fichiers en file d'attente dans l'event Completed !
                        .DownloadFileAsync(New Uri(s), dirPath & "\" & fiName.Name, dirPath)
                    End With
                End Using
                Return
    6- .....et enfin les 2 routines n�cessaires au cycle de la file d'attente :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
            progressbar1.Value = e.ProgressPercentage
        End Sub
     
        Private Sub DownloadF_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
            If e.Error IsNot Nothing Then
                MsgBox(e.Error.ToString)
            End If
            DownloadF(e.UserState)
        End Sub
    7- Tu peux d�sormais lancer la proc�dure :
    ----> Un truc dans le genre.... n�cessite certainement des ajustements..

    A l'impossible nul n'est tenu

    A+

  3. #3
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut
    Pfiou ! O_o

    Merci beaucoup pour ton aide Wallace1. J'�tais loin d'imaginer que ce serait aussi complexe pour simplement t�l�charger plusieurs fichiers. Y des endroits du code o� la syntaxe m'est totalement inconnue. Je vais t�cher de comprendre �a le plus rapidement. Je vais tester les morceaux de codes que tu as fournis en esp�rant que cela fonctionnera bien sans trop avoir d'ajustements � faire, sinon je crains de devoir revenir te demander conseil assez rapidement ^^

    J'essaye tout �a dans les prochains jours, merci encore, et je te tiens au courant si cela marche ou non.

    Bien cordialement,

    --
    Shennong

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    @Shennong :

    Pas de quoi,

    Bonne journ�e et bon codage.

  5. #5
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut
    Salut Wallace1,

    D�sol� mais je ne comprends pas ce qu'il faut mettre dans l'�tape 4, dans le 'If'. Peux-tu m'�clairer stp ?

    Aussi, J'ai bien incr�ment� ma liste avec tous les url n�cessaires selon les checkbox qui seront coch�es par l'utilisateur, mais lorsque je les compte � la fin, je n'en ai qu'une dans la liste. J'ai fais comme suit :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
            ElseIf chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
            ElseIf chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
    ...
    msgbox(adresses.count)
    Et le msgbox n'affiche que "1" m�me si je coche 5 cases. Puis, j'ai essay� de les d�cocher et d'en recocher trois, et l� il m'affichait "2". Je ne comprends pas pourquoi toutes les cases coch�es ne sont pas bien impl�ment�e � la liste.

    Merci d'avance.

    Cordialement,

    --
    Shennong

  6. #6
    Expert �minent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par d�faut
    Citation Envoy� par Shennong Voir le message
    D�sol� mais je ne comprends pas ce qu'il faut mettre dans l'�tape 4, dans le 'If'. Peux-tu m'�clairer stp ?
    le code de l'�tape 5 � priori

    ce n'est qu'une des mani�res de faire, en simultann� ca pourrait potentiellement gagner un peu de temps, mais le code serait diff�rent

    ce qu'il faut comprendre, c'est que si tu d�clares ta variable qui sert � t�l�charger dans ta form, elle ne peut faire qu'une chose � la fois, il faut donc en instancier une par fichier � t�l�charger
    apr�s pour garder une r�f�rence vers toutes les instances il faut une collection (= tableau de variable en mieux)


    Citation Envoy� par Shennong Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
            ElseIf chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
            ElseIf chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
    ...
    msgbox(adresses.count)
    Et le msgbox n'affiche que "1" m�me si je coche 5 cases. Puis, j'ai essay� de les d�cocher et d'en recocher trois, et l� il m'affichait "2". Je ne comprends pas pourquoi toutes les cases coch�es ne sont pas bien impl�ment�e � la liste.
    parce que c'est le fonctionnement de ElseIf qui signifie sinon si (donc nouveau test seulement si le 1er � �chou�)
    donc si chk1 est coch�, tu rentres dans le 1er if, puis tu passes directement au End If

    il te faudrait donc un if/end if par chk
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Expert �minent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par d�faut
    sinon pour tes checkbox, au lieu de les poser (si tu en as plus de 5 par exemple) et donc d'avoir du code if chk01 if chk02 ... tu peux aussi les cr�er par code
    je ne vois pas ce que atari = 1 et autres font dans l'histoire sinon j'aurais pu te proposer du code pour le tout en plus simple
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    @Pol63 : je valide l'insertion de l'�tape 5 dans le corps de la m�thode en �tape 4.

    @Shennong : Je valide �galement qu'il faille mettre un test conditionnel pour chaque checkbox pour ajouter (au besoin) les adresses dans la collection :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       If chk_01.Checked = True Then
                adresses.Enqueue(adresse1)
                atari = 1
        End if
        If chk_02.Checked = True Then
                adresses.Enqueue(adresse2)
                pcengine = 1
         End if
         If chk_03.Checked = True Then
                adresses.Enqueue(adresse3)
                sega = 1
         End if
    PS : m�me si au regards de ton code il existe certainement qqch d'un peu plus optimis� ..... tu pourrais utiliser par exemple un contr�le Listview (+ Checkbox et Progressbar embedded) ainsi �a t'�viterait le code redondant et en une boucle tu ajouterai les adresses � la file d'attente !

    ...bon d accords je m'enflamme un peu...lol ...on va d�j� voir ensemble pour faire fonctionner tout ca

  9. #9
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut
    Merci � vous deux, je comprends (un peu) mieux. Dans l'esprit d'�tre clair et que vous voyez bien l'�tendue de la form, je vous pr�sente ici le code complet que j'ai pour le moment (donc en construction)

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    Imports System.Net
    Imports Microsoft.Win32
    Imports System.IO
    
    Public Class Repair
    
        Dim atari As Integer
        Dim pcengine As Integer
        Dim sega As Integer
        Dim dreamcast As Integer
        Dim gameboy As Integer
        Dim nes As Integer
        Dim supernes As Integer
        Dim n64 As Integer
        Dim psp As Integer
        Dim ps1 As Integer
        Dim ps2 As Integer
        Dim console As String
        Private adresses As New Queue(Of String)()
        Private WithEvents httpclient As WebClient
    
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btn_annuler.Click
    
            'On ferme la fen�tre
            Me.Close()
    
        End Sub
    
    
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_reparer.Click
    
            'On ajoute les adresses de t�l�chargement des �mulateurs � la collection d'adresses de t�l�chargement 'adresses'
            If chk_01.Checked = True Then
                adresses.Enqueue("adresse01")
                atari = 1
            End If
            If chk_02.Checked = True Then
                adresses.Enqueue("adresse02")
                pcengine = 1
            End If
            If chk_03.Checked = True Then
                adresses.Enqueue("adresse03")
                sega = 1
            End If
            If chk_04.Checked = True Then
                adresses.Enqueue("adresse04")
                dreamcast = 1
            End If
            If chk_05.Checked = True Then
                adresses.Enqueue("adresse05")
                gameboy = 1
            End If
            If chk_06.Checked = True Then
                adresses.Enqueue("adresse06")
                nes = 1
            End If
            If chk_07.Checked = True Then
                adresses.Enqueue("adresse07")
                supernes = 1
            End If
            If chk_08.Checked = True Then
                adresses.Enqueue("adresse08")
                n64 = 1
            End If
            If chk_09.Checked = True Then
                adresses.Enqueue("adresse09")
                psp = 1
            End If
            If chk_10.Checked = True Then
                adresses.Enqueue("adresse10")
                ps1 = 1
            End If
            If chk_11.Checked = True Then
                adresses.Enqueue("adresse11")
                ps2 = 1
            End If
    
        End Sub
    
        Private Sub DownloadF(dirPath$)
    
            If adresses.Any() Then
    
                Using wc As New WebClient
                    With wc
                        AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                        AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                        'L'url "s" est retourn�e et ensuite supprim�e de la liste avec la m�thode Dequeue
                        Dim s = adresses.Dequeue()
                        ' On s'attarde ici � tout ce qui pourrait �tre utile en vue de constituer le chemin de destination du fichier t�l�charg� !
                        Dim fiName As New FileInfo(New Uri(s).AbsolutePath)
                        ' A noter que le 3�me argument est n�cessaire pour relancer la m�thode DownloadF s'il reste des fichiers en file d'attente dans l'event Completed !
                        .DownloadFileAsync(New Uri(s), dirPath & "\" & fiName.Name, dirPath)
                    End With
                End Using
                Return
    
            End If
    
        End Sub
    
        Private Sub httpclient_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles httpclient.DownloadFileCompleted
    
            Dim rep As MsgBoxResult
            rep = MsgBox("La r�paration est termin�e !." & vbCrLf & vbCrLf & "Vous pouvez d�sormais utiliser le ou les �mulateur(s).", vbOKOnly + vbInformation, "T�l�chargement termin� !")
    
            If rep = vbOK Then
                lbl_01.Visible = False
                lbl_emu.Visible = False
                lbl_dl.Visible = False
                ProgressBar1.Visible = False
                chk_01.Enabled = True
                chk_02.Enabled = True
                chk_03.Enabled = True
                chk_04.Enabled = True
                chk_05.Enabled = True
                chk_06.Enabled = True
                chk_07.Enabled = True
                chk_08.Enabled = True
                chk_09.Enabled = True
                chk_10.Enabled = True
                chk_11.Enabled = True
                btn_annuler.Enabled = True
                btn_reparer.Enabled = True
                chk_01.Checked = False
                chk_02.Checked = False
                chk_03.Checked = False
                chk_04.Checked = False
                chk_05.Checked = False
                chk_06.Checked = False
                chk_07.Checked = False
                chk_08.Checked = False
                chk_09.Checked = False
                chk_10.Checked = False
                chk_11.Checked = False
                atari = 0
                pcengine = 0
                sega = 0
                dreamcast = 0
                gameboy = 0
                nes = 0
                supernes = 0
                n64 = 0
                psp = 0
                ps1 = 0
                ps2 = 0
            End If
    
        End Sub
    
        Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged
    
            ProgressBar1.Value = e.ProgressPercentage
            lbl_dl.Text = e.ProgressPercentage.ToString & " %"
            lbl_emu.Text = console
    
        End Sub
    
        Private Sub Repair_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            atari = 0
            pcengine = 0
            sega = 0
            dreamcast = 0
            gameboy = 0
            nes = 0
            supernes = 0
            n64 = 0
            psp = 0
            ps1 = 0
            ps2 = 0
    
        End Sub
    
    End Class
    Les variable "nomdeconsole = 0 ou =1" me servent ensuite pour savoir quelles �mulateurs ont �t� t�l�charg�s, pour les op�rations suivantes (suppression du dossier d�j� pr�sent dans l'install, puis copie du nouveau � la place). Si telle console est � 1, alors je v�rifie que le dossier de base existe, si oui je le supprime, si non, je ne fais rien. Puis je copie le nouveau dossier � la place.

    J'esp�re que c'est clair, je sais pas trop comment expliquer autrement ^^

    Il y a aussi des parties httpclient, qui font r�f�rence � un webclient que j'ai essay� d'utiliser avant. Cela fonctionnait bien pour un seul fichier.

    De plus, je ne sais pas si c'est bien �a que tu attendais Wallace1, mais j'ai donc ins�r� le code de l'�tape 5 dans la fonction cr��e � l'�tape 4. Malheureusement, j'ai une erreur de type :

    "Erreur 4 'DownloadF_DownloadFileCompleted' n'est pas d�clar�. Il peut �tre inaccessible en raison de son niveau de protection."

    et la m�me chose pour 'DownloadF_DownloadProgressChanged'

    Pour finir, voici un screen du form en question (les checkbox sont num�rot�es du haut vers le bas, des colonnes de gauche � droite). La progressbar se nomme "Progressbar1", le label pour le % d'avancement est "lbl_dl" et celui pour afficher le nom de la console t�l�charg�e est "lbl_emu".

    Nom : Sans titre-2.png
Affichages : 657
Taille : 200,4 Ko

    J'esp�re que vous pourrez vous y retrouver :s

    Merci d'avance pour votre aide !

    Cordialement,

    --
    Shennong

  10. #10
    Expert �minent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par d�faut
    en programmation, il y a bien sur le fait que le code marche, mais il y a aussi la maintenabilit� du code
    � savoir que le code soit simple et �volutif

    l� si demain tu dois rajouter une console, tu vas devoir poser un checkbox, rajouter du code dans tes ifs, rajouter du code pour le t�l�chargement, rajouter une variable pour la console etc...
    (au passage une valeur qui a 0 ou 1 c'est un bit, bool�en en .net, pas un integer ; dim a as boolean = false)

    la poo a permis de rendre tout ceci plus simple
    dans ton cas les donn�es ne viennent pas d'une base de donn�es, mais ca reste automatisable

    1�re chose, on peut ajouter un controle � l'ex�cution
    donc pour chaque console, tu pourras ajouter le checkbox
    ensuite pour chaque console tu as besoin de savoir l'adresse de t�l�chargement, et plein d'autres choses
    aussi on fait donc une classe qui va stocker toutes ces valeurs

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    public class Console
      public property Nom as string
      public property AdresseDL as string
      public property Installé as boolean
    end class
    ensuite il va falloir d�finir quelles sont les concoles, pour cel� on le fait au d�marrage de l'application (form_load ou sub new)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    private _Consoles as new list(of console)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dim c as new console
    c.Nom = "Atari"
    c.AdresseDL = "http://...."
    _Consoles.add(c)
    c = new console ' ici c'est de la réutilisation de variable mais avec une nouvelle instance, donc pas d’interférence avec la 1ère)
    c.Nom = "NES"
    c.AdresseDL = "http://..."
    _Consoles.add(c)
    '...
    ensuite pour ajouter les checkbox, il faut d'abord poser un flowlayoutpanel sur le form puis faire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    for each c in _Consoles
       dim chk as new checkbox
       chk.Text = c.Nom
       chk.Tag = c
       me.FlowLayoutPanel1.Controls.Add(chk)
    next
    � ce niveau l'interface se fait
    le FlowLayoutPanel est un controle container qui s'occupe de la disposition de ses enfants, pas besoin de d�finir l'emplacement, il les pose automatiquement � c�t� des autres, et passe � la ligne tout seul (tu peux g�rer les marges entre chaque etc...)
    .Tag c'est une propri�t� qui existe sur tous les controles, permettant de stocker n'importe quoi, ici on va y ranger l'instance de console li�e (je ne sais pas encore si c'est utile, il est peut etre plus utile de ranger le checkbox sur la console)

    apr�s sur le clic du bouton R�parer, le but est de faire For Each checkbox coch� un traitement, l� on r�cup�re la console li�e au checkbox pour connaitre l'url et lancer le t�l�chargement

    l� on voit donc que le code va se limiter � des boucles, pas 10 if � la suite
    et si tu dois rajouter une console, tu n'as qu'une ligne de code � ajouter, et pas l'appli enti�re � retester pour v�rifier que tu n'as pas oubli� de modifier un truc
    de plus le code est simple et concis, il n'y a rien de redondant

    tu peux ajouter plein de choses sur la classe console, comme une Public Sub Telecharger, qui contiendrait le code de t�l�chargement
    ton code sur le bouton r�parer serait alors
    pour chaque console dont le checkbox est coch�
    console.Telecharger
    et donc pour les progressbar tu peux int�grer ca aussi, que chaque progressbar s'ajoute automatiquement, avec le nom de la console automatiquement au dessus

    normalement on ne recommande pas �a, mais tu peux mettre une propri�t� as Checkbox et une propri�t� as ProgressBar sur la classe console, et y ranger les instances un fois cr��es, ce qui fait qu'avec un for each sur _Consoles tu peux savoir si c.Checkbox.Checked, ou modifier facilement le pourcentage d'avancement
    Je dis qu'en g�n�ral on ne recommande pas �a, c'est parce qu'il est plutot conseill� de ne pas lier ses classes � ses controles, ce qui rend le code plus �volutif, mais c'est un peu plus complexe, si d�j� tu arrives � utiliser tout ca tu verras tu auras d�j� appris beaucoup, et sur ta prochaine appli tu pourras r�fl�chir comment ne pas lier tout tout en gardant du code simple


    un autre point technique int�ressant c'est LINQ qui permet d'�crire des boucles facilement
    par exemple la recherche des consoles dont le checkbox est coch� si tu as mis le chk sur la console :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    For each c as Console in (from cn in _Consoles where cn.Checkbox.Checked Select cn)
      c.Telecharger
    Next
    ici le (from ...) va faire le tour, donc c'est une boucle qui te ressort ce que tu lui mets en condition
    apr�s on peux m�me r�duire � nouveau car c'est une boucle qu'on fait derri�re
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    (from cn in _Consoles where cn.Checkbox.Checked Select cn).ForEach(j'ai pu la syntaxe exacte .Telecharger)
    ce qui fait que pour chaque instance trouv�e par le where tu vas appeler la m�thode
    attention tout de m�me, linq r�duit le nombre de lignes, mais agrandit la taille de celles ci et il faut s'arr�ter quand ca devient illisible
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    Citation Envoy� par Pol63 Voir le message
    en programmation, il y a bien sur le fait que le code marche, mais il y a aussi la maintenabilit� du code
    � savoir que le code soit simple et �volutif
    Et surtout facilement r�utilisable dans d'autres projets "perso" ou r�utilisable dans des projets d'autres d�veloppeurs.

    Il faut garder � l'esprit qu'un projet quel qu'il soit contiendra d'une mani�re ou d'une autre du code r�utilisable (sous forme de classes ou librairies c'est l'id�al), alors c'est en ce sens qu'il faut orienter ta conception de projet.
    T'es-tu d�j� pos�s ces questions :
    - comment identifier qu'une classe est n�cessaire dans un projet
    - comment mod�liser une classe

    Les r�ponses t'am�neront � coups sur dans les fondements m�mes de la POO.

    Comme l'a mentionn� Pol63 et je fais partie de cette m�me �cole : il faut bien s�parer la notion d'affichage et de traitements pour une question de r�-utilisabilit� (maintenabilit�/�volutivit�) en somme !

    Un projet contient dans la majeure partie des cas :
    - un noyau principal qui concerne la partie fonctionnelle en g�n�ral (Core)
    - les outils ou fonctions utiles (Helper)
    - le param�trage de l'application (Settings) qui concerne la gestion des fichiers Ini, xml,....
    - des sous-projets ou classes ind�pendantes (des librairies cod�es pour les circonstances)

    Si tu as d'autres questions n'h�sites pas.

    Cdlt.

  12. #12
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    @Shennong : Voil� en quelque sorte ce qui pourrait introduire la notion de r�utilisable :

    ---> La classe "DownloadFiles" (de l'espace de nom "Download") :

    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
     
    Imports System.Net
    Imports System.IO
    Imports System.ComponentModel
     
    Namespace Download
        Public Class Cls_DownloadFiles
     
    #Region " Properties "
            Property downloadUrls As Queue(Of Cls_Url)
    #End Region
     
    #Region " Events "
            Public Shared Event ProgressChangedEvent As ProgressChangedDelegate
            Public Shared Event TerminatedEvent As EventHandler
    #End Region
     
    #Region " Delegates "
            Public Delegate Sub ProgressChangedDelegate(sender As Object, e As DownloadProgressChangedEventArgs)
    #End Region
     
    #Region " Methods "
            Public Sub New()
                downloadUrls = New Queue(Of Cls_Url)
            End Sub
     
            Public Sub DownloadF()
                ' On vérifie que la liste n'est pas vide à chaque lancement de la routine
                If downloadUrls.Any() Then
                    ' On instancie un objet de la classe WebClient pour chaque téléchargement de fichier
                    Using wc As New WebClient
                        With wc
                            ' On s'abonne dynamiquement aux 2 events (DownloadProgressChanged et DownloadFileCompleted) de l'instance Wc
                            AddHandler .DownloadProgressChanged, AddressOf DownloadF_DownloadProgressChanged
                            AddHandler .DownloadFileCompleted, AddressOf DownloadF_DownloadFileCompleted
                            'L'url "s" est retournée et ensuite supprimée de la liste avec la méthode Dequeue
                            Dim s = downloadUrls.Dequeue()
                            ' On s'attarde ici à tout ce qui pourrait être utile en vue de constituer le chemin de destination du fichier téléchargé !
                            Dim fiName As New FileInfo(New Uri(s.AdresseDL).AbsolutePath)
                            ' A noter que le 3ème argument permet de savoir côté UI quel fichier est en cours de téléchargement !
                            .DownloadFileAsync(New Uri(s.AdresseDL), s.DestDir & "\" & fiName.Name, s.AdresseDL)
                        End With
                    End Using
                    Return
                Else
                    ' C'est ici qu'on déclenche un event pour dire que le téléchargement de tous les fichiers est bien terminé !
                    RaiseEvent TerminatedEvent(Me, New EventArgs)
                End If
            End Sub
     
            Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
                ' On déclenche l'event ProgressChangedEvent pour permettre la MAJ de la progressbar côté UI
                RaiseEvent ProgressChangedEvent(sender, e)
            End Sub
     
            Private Sub DownloadF_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
                ' On masque cet event côté UI car il permet de savoir à quel moment se termine la fin du téléchargement de chaque fichier !
                If e.Error IsNot Nothing Then
                    MsgBox(e.Error.ToString)
                End If
                DownloadF()
            End Sub
    #End Region
     
        End Class
    End Namespace
    ---> La classe Url qui permet d'y placer les urls, noms et r�pertoire d'enregistrement cibles :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Namespace Download
        Public Class Cls_Url
     
            Public Property Nom As String
            Public Property AdresseDL As String
            Public Property DestDir As String
     
        End Class
    End Namespace
    ---> Et son utilisation pour quelques urls de mon cru (n�cessite une Progressbar, 1 bouton et 1 label) :

    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
     
    Imports System.Net
    Imports System.ComponentModel
    Imports DownloadFilesProject.Download
     
    Public Class Form1
     
        Private WithEvents DL As New Cls_DownloadFiles()
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            Dim url1 As New Cls_Url() With {.Nom = "GC", .AdresseDL = "http://wallace87000.upd.fr/Gif Animation Creator.exe", .DestDir = "D:\Sauvegardes"}
            DL.downloadUrls.Enqueue(url1)
            Dim url2 As New Cls_Url() With {.Nom = "IU", .AdresseDL = "http://wallace87000.upd.fr/ImaboxUploader.exe", .DestDir = "D:\Sauvegardes"}
            DL.downloadUrls.Enqueue(url2)
     
            DL.DownloadF()
        End Sub
     
        Private Sub DownloadF_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles DL.ProgressChangedEvent
            ProgressBar1.Value = e.ProgressPercentage
            Label1.Text = e.UserState.ToString
        End Sub
     
        Private Sub Terminated() Handles DL.TerminatedEvent
            MsgBox("terminé")
        End Sub
     
    End Class
    ATTENTION : je ne dis pas que la classe est tout ce qu'il y a de plus authentique et optimis� ...mais tu peux d�j� t'en inspirer et te faire une id�e d'un �ventuel rendu.
    --> On pourrait aussi penser � lib�rer quelques ressource � la fin du t�l�chargement (une m�thode dispose) ou alors attendre le passage du GC..... passivement....
    --> V�rifier l'existence des r�pertoires de destination
    --> Cr�er un gestionnaire d'exception en cas d'interruption de t�l�chargement
    --> Cr�er un eventArgs (une classe qui h�rite d'un eventargs) qui transporterait le message du nombre de DL r�ussi et/ou en �checs dans l'event Terminated .....
    ...etc.....

    J'esp�re que cela t'aidera.

    N'h�sites pas si tu as des questions ...tout le contenu peut faire l'objet d'un d�bat.....

    Cdlt.

    A+

  13. #13
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut
    Bonjour bonjour,

    Je viens de relire tout le post pour me remettre les id�es en place. D'abord je tiens � vous remercier �norm�ment pour l'aide que vous m'apportez. Cependant, vos solutions d�passent mes comp�tences actuelles en VB et franchement, je n'y comprend plus rien ^^'

    Du coup, je me dis que je vais peut-�tre faire plus simple, et proposer une fonction de r�paration globale. Comme �a je n'aurai qu'un seul fichier � t�l�charger et � d�zipper. Cela fonctionnera, je sais le faire

    Malheureusement, j'ai beau lire et relire, je ne comprends rien � la fa�on de faire. Donc si quelqu'un peut me proposer un bout de code complet que je puisse utiliser et aussi et surtout sur lequel me pencher pour essayer de mieux comprendre, je suis preneur, car l� je suis vraiment paum� ! ^^

    Merci beaucoup encore une fois pour votre aide !

    Cordialement,

    --
    Shennong

  14. #14
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    Citation Envoy� par Shennong Voir le message
    Cependant, vos solutions d�passent mes comp�tences actuelles en VB et franchement, je n'y comprend plus rien ^^'
    Je peux comprendre que quelque notions te paraissent obscures mais cela n'�veille pas ta curiosit� ?
    Qu'est ce que tu ne comprends pas ?

    Malheureusement, j'ai beau lire et relire, je ne comprends rien � la fa�on de faire.
    J'ai dis dans mon precedent message que le contenu peut faire l objet d'un debat.....tu peux commencer par dire ce que tu n arrives pas a faire ........... les points noires voir bloquants.....


    .......me proposer un bout de code complet que je puisse utiliser et aussi et surtout sur lequel me pencher pour essayer de mieux comprendre, je suis preneur, car l� je suis vraiment paum� ! ^^
    On a d�j� pass� ce cap (cf plus haut les exemples comment�s)...... la balle est dans ton camps pour la suite...

    cdlt.

  15. #15
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    Accessoirement j'ai agr�ment� le tout sous forme de classe :

    http://3dotdevcoder.blogspot.fr/2015...s-en-file.html

    PS : si cela ne peut t'aider davantage..peut �tre que �a restera utile pour d'autres.

    A+

  16. #16
    Membre �clair� Avatar de Shennong
    Homme Profil pro
    Technicien Informatique/Hotliner
    Inscrit en
    F�vrier 2012
    Messages
    186
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activit� : Technicien Informatique/Hotliner
    Secteur : Sant�

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 186
    Par d�faut
    Merci pour le lien, je vais essayer de reprendre �a et de comprendre en cherchant sur internet. Je vais bien finir par comprendre le code ^^

    Je suis de garde ce week end, et je sais pas trop quand je pourrais me remettre au d�veloppement de mon appli pour le moment, mais si j'aboutis � quelque chose, je vous tiendrai inform� sur ce thread.

    Merci encore pour votre aide en tout cas, et je pense que oui, �a finira par �tre utile � quelqu'un d'autre, j'en suis convaincu

    A+

    --
    Shennong

  17. #17
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur syst�mes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Administrateur syst�mes
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par d�faut
    Bonsoir Shennong,

    On peux consid�rer que des r�ponses ont �t� apport�es � ta question. Tu peux passer le topic en r�solu. Si tu rencontres un autre probl�me tu pourras ouvrir un autre sujet sinon ca risque d'�tre difficilement compr�hensible � force ....

    Cdlt.

    A+

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 11/09/2013, 20h17
  2. T�l�chargement de fichier
    Par casafa dans le forum Web & r�seau
    R�ponses: 21
    Dernier message: 18/06/2009, 23h34
  3. R�ponses: 5
    Dernier message: 05/11/2005, 17h53
  4. [SOAP][XML][C#.NET] T�l�chargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    R�ponses: 2
    Dernier message: 27/06/2005, 09h35
  5. Gestion des permissions des fichiers sur NTFS
    Par gnu_thomas dans le forum MFC
    R�ponses: 3
    Dernier message: 22/01/2004, 08h22

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