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 :

Utilisation d'un progressBar avec les Evénements


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Par défaut Utilisation d'un progressBar avec les Evénements
    Bonjour à tous,

    J'aimerais avoir un peu d'aide concernant le progressBar. Je l'ai utilisé récemment dans une application sans aucun souci. Mais cette fois, je suis obligé de renseigner sa progression dans une autre classe que la form où il est déclaré, et là j'ai du mal . J'ai compris qu'il fallait utiliser les événements et j'ai donc lu quelques tutoriels, mais j'avoue ne pas avoir tout compris...

    Donc si quelqu'un pouvait m'aider ?
    Je voudrais incrémenter mon progressBar à chaque fois qu'un octet est copié (voir code ci-dessous)

    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
     Public Sub copy(ByVal copyFilePath As String)
            ' Version de copie octet par octet
     
            Try
                _fileStreamOrignal = New FileStream(Me._completeFilePath, FileMode.Open, FileAccess.Read)
                _fileStreamDestination = New FileStream(copyFilePath, FileMode.Create, FileAccess.Write)
     
                _octetCopied = _fileStreamOrignal.ReadByte()
     
                While _octetCopied <> -1
                    _fileStreamDestination.WriteByte(CType(_octetCopied, Byte))
                    _octetCopied = _fileStreamOrignal.ReadByte()
     
                End While
     
                _fileStreamDestination.Close()
                _fileStreamOrignal.Close()
     
     
            Catch ex As Exception
     
            End Try
     
        End Sub
    Je vois pas trop où il faut déclencher l'événement en fait ... et surtout comment faire ? le Raise Event doit il être déclaré dans ma fonction copy, ou je dois faire une autre fonction ?

    Et en plus, ma form est en langage C#, donc c'est pas la même syntaxe pour la gestion des événements ..

    Donc si vous pouviez m'aider à mieux comprendre ..

    Merci beaucoup

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Dans ta classe où la méthode Copy est déclarée, tu déclares un évènement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Event ProgressChangedEventHandler ProgressChanged As ProgressChangedEventHandler
    (j'ai utilisé le delegate ProgressChangedEventHandler qui est déjà utilisé par le BackgroundWorker, ça évite d'en créer un nouveau)

    Et dans le code de la méthode copy, tu déclenches l'évènement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim percentage As Integer = 100 * _octetCopied / _fileStreamOrignal.Length
    RaiseEvent ProgressChanged(Me, New ProgressChangedEventArgs(percentage, Nothing))
    Du côté de la form en C#, tu gères l'évènement comme ça :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // à l'initialisation :
    objetQuiFaitLaCopie.ProgressChanged += copy_ProgressChanged;
    ...
     
     
    private void copy_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

    Sinon, une autre approche plus simple serait d'utiliser un BackgroundWorker, qui sert exactement à ce genre de chose... en plus ça fait le traitement dans un autre thread, donc ça bloque pas l'interface graphique

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Par défaut
    Bon bah j'ai essayé ton code, mais ça ne marche pas.

    Tout d'abord cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Event ProgressChangedEventHandler ProgressChanged As ProgressChangedEventHandler
    Une erreur me dit
    Fin d'instruction attendue
    Donc j'ai modifié le code et déclaré le delegate, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Delegate Sub ProgressChangedEventHandler()
        Public Event ProgressChanged As ProgressChangedEventHandler
    Mais après, dans ma fonction copie, il me dit que le type ProgressChangedEventArgs n'est pas défini ...

    Donc je dois faire le définir ou ?

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Si il y a des choses qu'il ne connait pas c'est peut etre juste parce que tu as oublié de mettre le chemin complet non?
    Si tu vas voir sur msdn tu verras que ca fait partie du namespace System.ComponentModel, donc essaye avec System.ComponentModel.ProgressChangedEventHandler.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Par défaut
    Ou fait un import de librairie qu'il manque en haut de ta classe/Module/... enfin tu m'auras compris.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Par défaut
    Merci beaucoup, ça marche parfaitement !

    Juste pour info, la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim percentage As Integer = 100 *_octetCopied /_fileStreamOrignal.Length
    n'est pas bonne. Après vérification, elle retourne toujours 0.
    Donc à modifier selon ses besoins !

    Sinon ça incrémente bien ma barre.

    Merci encore !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Jitoubi Voir le message
    Une erreur me dit "Fin d'instruction attendue"
    Ah oui, au temps pour moi, j'ai du mal avec la syntaxe de VB
    C'était effectivement comme ça qu'il fallait l'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Event ProgressChanged As ProgressChangedEventHandler

    Citation Envoyé par Jitoubi Voir le message
    Donc j'ai modifié le code et déclaré le delegate, ce qui donne :
    [...]
    Mais après, dans ma fonction copie, il me dit que le type ProgressChangedEventArgs n'est pas défini ...
    Les 2 types (ProgressChangedEventHandler et ProgressChangedEventArgs) sont définis dans le namespace System.ComponentModel, il faut juste que tu rajoutes un Imports au début de ton fichier

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

Discussions similaires

  1. Utilisation de Open SSL avec les librairies PHP
    Par onlajoy dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2010, 09h15
  2. Réponses: 16
    Dernier message: 07/07/2009, 13h46
  3. utilisation d'un timer avec les pthreads
    Par dc.sara dans le forum C
    Réponses: 8
    Dernier message: 15/01/2008, 13h12
  4. Utilisation du tag target avec les iFrame
    Par Coulon Arnaud dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/08/2007, 12h35
  5. Réponses: 1
    Dernier message: 11/12/2006, 18h33

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