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 :

Probleme horloge analogique en VB Net [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut Probleme horloge analogique en VB Net
    Bonjour,

    J'ai un problème de graphics, il me semble :

    J'ai des PictureBox (pb1, pb2, ...) qui contiennent toutes une horloge sans aiguille.

    J'ai construit la sub ci-dessous avec, comme paramètres, la pictureBox dans laquelle dessiner, les heures et les minutes à afficher sous forme d'aiguilles. Mais le déboger bloque.

    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
     
     
    ' sur la sub précédente 
    ' (la variable Br_str() contient la date en string) :
     
    '-----------------------
            Dim e As PaintEventArgs
     
            Dim pb As PictureBox = Me.PictureBox1
     
            For i = 0 To 6
                If i = 0 Then pb = Me.PictureBox1
                If i = 1 Then pb = Me.PictureBox2
                If i = 2 Then pb = Me.PictureBox3
                If i = 3 Then pb = Me.PictureBox4
                If i = 4 Then pb = Me.PictureBox5
                If i = 5 Then pb = Me.PictureBox6
                If i = 6 Then pb = Me.PictureBox7
                If i = 0 Then
                    Moment = CDate(Br_Str(i))
                    dheur = Moment.Hour
                    dmin = Moment.Minute
                    OnPaint(e, pb, dheur, dmin)
                End If
            Next
     
    '--------------------------------------
        Protected Overloads Sub OnPaint(ByVal e As PaintEventArgs, ByVal pb As PictureBox, ByVal dheur As Integer, ByVal dmin As Integer)
     
            Dim penBlack As New Pen(Color.Black, 1)
            Dim a, b, c, x0, y0, x1, y1, x2, y2, x3, y3 As Single
            Dim pointsDeLAiguille(3) As PointF
            Dim brushBlack As New SolidBrush(Color.Black)
            Dim brushAqua As New SolidBrush(Color.Aqua)
     
            ' Aiguille des Minutes 
            a = dmin * 200 / 60
            b = a / 100 * 3.14159F
            c = (a + 50) / 100 * 3.14159F
     
            x0 = CSng(Math.Sin(b)) * 50
            y0 = CSng(-Math.Cos(b)) * 50
     
            x1 = CSng(-Math.Sin(b)) * 10
            y1 = CSng(Math.Cos(b)) * 10
     
            x2 = CSng(Math.Sin(c)) * 4
            y2 = CSng(-Math.Cos(c)) * 4
     
            x3 = CSng(-Math.Sin(c)) * 4
            y3 = CSng(Math.Cos(c)) * 4
     
            pointsDeLAiguille(0).X = x1 + 60
            pointsDeLAiguille(0).Y = y1 + 60
     
            pointsDeLAiguille(1).X = x2 + 60
            pointsDeLAiguille(1).Y = y2 + 60
     
            pointsDeLAiguille(2).X = x0 + 60
            pointsDeLAiguille(2).Y = y0 + 60
     
            pointsDeLAiguille(3).X = x3 + 60
            pointsDeLAiguille(3).Y = y3 + 60
     
                               ' c'est à la ligne ci-dessous que j'ai la classique erreur
                               ' La référence d'objet n'est pas définie à une instance
                               ' d'un objet
     
            e.Graphics.FillPolygon(brushAqua, pointsDeLAiguille)
            e.Graphics.DrawPolygon(penBlack, pointsDeLAiguille)
            brushAqua.Dispose()
     
            '----------------------- 
            ' Aiguille des Heures 
            a = dheur * 200 / 12 + dmin * 200 / 60 / 12
            b = a / 100 * 3.14159F
            c = (a + 50) / 100 * 3.14159F
     
            x0 = CSng(Math.Sin(b)) * 35
            y0 = CSng(-Math.Cos(b)) * 35
     
            x1 = CSng(-Math.Sin(b)) * 10
            y1 = CSng(Math.Cos(b)) * 10
     
            x2 = CSng(Math.Sin(c)) * 4
            y2 = CSng(-Math.Cos(c)) * 4
     
            x3 = CSng(-Math.Sin(c)) * 4
            y3 = CSng(Math.Cos(c)) * 4
     
            pointsDeLAiguille(0).X = x1 + 60
            pointsDeLAiguille(0).Y = y1 + 60
     
            pointsDeLAiguille(1).X = x2 + 60
            pointsDeLAiguille(1).Y = y2 + 60
     
            pointsDeLAiguille(2).X = x0 + 60
            pointsDeLAiguille(2).Y = y0 + 60
     
            pointsDeLAiguille(3).X = x3 + 60
            pointsDeLAiguille(3).Y = y3 + 60
     
            e.Graphics.FillPolygon(brushBlack, pointsDeLAiguille)
            e.Graphics.DrawPolygon(penBlack, pointsDeLAiguille)
            brushBlack.Dispose()
     
            penBlack.Dispose()
     
        End Sub
    Je viens de passer des heures là-dessus et je ne trouve pasz. Je me suis aussi aidé d'un script trouvé sur le site mais il est écrit à peu près de la même manière, enfin je crois...

    Si vous pouviez m'aider...

    Merci d'avance.

  2. #2
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    Bonjour,

    il est difficile de t'aider avec ce que tu nous donne.

    1° - qu'entend tu par:
    *une erreur est générée?*
    Mais le déboger bloque.
    2° - merci de préciser la source de ce dont tu parle:
    Je me suis aussi aidé d'un script trouvé sur le site

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    Bonjour,

    Tout d'abord, merci pour la réponse.

    J'ai précisé où et quelle erreur était générée. Je ne sais pas ce que je peux fournir en plus. Explique moi. Dois-je (je l'ai fait une fois mais je ne sais plus comment) transmettre l'erreur en entier ? Je crois qu'il faut passer par le presse papier ?

    D'autre part, le script que j'ai trouvé est un script qui permet de réaliser un composant. Je n'en suis pas là. J'ai juste besoin de 2 aiguilles qui se mettent joliement en place en fonction de l'heure. Voilà le script :
    http://chgi.developpez.com/dotnet/compo1/

    J'espère avoir répondu à tes demandes.

    Cordialement.

  4. #4
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    oula pas de stress
    pour ton erreur essaye de déclarer comme ça plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim e As New PaintEventArgs

  5. #5
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    attend, j'ai parlé un peux vite,
    le e en question est dans le Sub, c'est dans les arguments de la fonction qu'il faut le new
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Overloads Sub OnPaint(ByVal e As New PaintEventArgs, ByVal pb As PictureBox, ByVal dheur As Integer, ByVal dmin As Integer)
    Met en haut de ta page de code ceci:
    et tout ce qui est signalé comme erreur ou avertissement tu va devoir t'en méfier

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    Voilà, je viens de mettre Option Explicit On

    J'avais deux variables integer non déclarées... Mais bon, c'est pas ça qui fait venir l'essence dans le klaxon...

    Pour le 'New', j'ai tenté les 2 approches et chaque fois j'ai une erreur. Pour la déclaration dans le début du sub appelant, si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Dim e As new PaintEventArgs
    J'obtiens 2 erreurs :

    Erreur 2 Argument non spécifié pour le paramètre 'graphics' de 'Public Sub New(graphics As System.Drawing.Graphics, clipRect As System.Drawing.Rectangle)'. D:\--- PROJETS\VB10\ASE\ASE\Bandeau_Places.vb 46 13 ASE
    et


    Erreur 1 Argument non spécifié pour le paramètre 'clipRect' de 'Public Sub New(graphics As System.Drawing.Graphics, clipRect As System.Drawing.Rectangle)'. D:\--- PROJETS\VB10\ASE\ASE\Bandeau_Places.vb 46 13 ASE
    Si je mets 'New' dans la déclaration de la sub appelée (Byval e as New PaintEventArgs, ...), j'obtiens l'erreur :

    Erreur 1 'New' n'est pas valide dans ce contexte. D:\--- PROJETS\VB10\ASE\ASE\Bandeau_Places.vb 136 48 ASE
    Pas simple...

  7. #7
    Membre Expert Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Par défaut
    tu a essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ByVal e As PaintEventArgs
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ByRef e As PaintEventArgs

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    Je viens d'essayer. C'est vrai que je n'y avais pas pensé (je débute...) mais c'était une bonne idée.

    J'obtiens la même erreur que celle du début...

  9. #9
    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
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim e As PaintEventArgs
    à la ligne 7 n'est jamais initialisé, donc il vaut Nothing, donc c'est normal que ça pète...

    En général on ne le crée pas manuellement, on l'obtient à partir de l'évènement Paint, mais dans ton cas ce n'est peut-être pas le plus pratique, donc tu peux le créer manuellement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = New PaintEventArgs(pb.CreateGraphics(), pb.Bounds)
    Par contre, normalement il faut disposer l'objet Graphics quand c'est fini, le plus simple étant de le faire avec un bloc Using. Je te suggère donc de faire comme ça dans la première Sub :

    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
            Dim pb As PictureBox = Me.PictureBox1
     
            For i = 0 To 6
                If i = 0 Then pb = Me.PictureBox1
                If i = 1 Then pb = Me.PictureBox2
                If i = 2 Then pb = Me.PictureBox3
                If i = 3 Then pb = Me.PictureBox4
                If i = 4 Then pb = Me.PictureBox5
                If i = 5 Then pb = Me.PictureBox6
                If i = 6 Then pb = Me.PictureBox7
                If i = 0 Then
                    Moment = CDate(Br_Str(i))
                    dheur = Moment.Hour
                    dmin = Moment.Minute
                    Using (Dim g As Graphics = pb.CreateGraphics())
                        Dim e As New PaintEventArgs(g, pb.Bounds)
                        OnPaint(e, pb, dheur, dmin)
                    End Using
                End If
            Next

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    Alors là... Je ne suis pas assez puissant pour avoir défini cette écriture. Je veux bien la copier mais, pour l'instant, je ne la comprends pas réellement. Ça viendra, ça viendra... Faut le temps...

    Merci de t'intéresser à mon problème.

    Mais j'ai encore une erreur, petite cette fois-ci j'espère : à la phrase :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Using (Dim g As Graphics = pb.CreateGraphics())
    en me surlignant le 'Dim', il me dit 'Expression attendue'...

    Une idée ? Moi, je sèche là aussi. Mais faut dire que, comme sus-dit, je ne comprends pas tout de ce qui est écrit. Alors à corriger...

  11. #11
    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 Whombat Voir le message
    Alors là... Je ne suis pas assez puissant pour avoir défini cette écriture. Je veux bien la copier mais, pour l'instant, je ne la comprends pas réellement. Ça viendra, ça viendra... Faut le temps...
    Quelle partie tu ne comprends pas ? C'est presque pareil que ton code, il y a juste quelques petites modifs...

    Citation Envoyé par Whombat Voir le message
    Mais j'ai encore une erreur, petite cette fois-ci j'espère : à la phrase :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Using (Dim g As Graphics = pb.CreateGraphics())
    en me surlignant le 'Dim', il me dit 'Expression attendue'...

    Une idée ? Moi, je sèche là aussi. Mais faut dire que, comme sus-dit, je ne comprends pas tout de ce qui est écrit. Alors à corriger...
    Ah oui pardon, je me suis planté... j'ai toujours du mal avec la syntaxe VB. En fait ça s'écrit comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Using g As Graphics = pb.CreateGraphics()

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    Youpie ! Ca passe nickel ... Sauf que, et là c'est moi qui coince (ou qui ai coincé) les traits ne se dessinent pas...

    Pourtant j'ai bien déclaré le support (variable pb qui prend la valeur PictureBox1, puis PictureBox2, etc... à chaque tour), les cordonnées des points (le tableau pointsDeLAiguille), l'heure et la minute pour la position de l'aiguille et la couleur.

    Je vais boire un verre d'eau parce que je suis archi-sec à force de sécher .

    Néanmoins, pas assez ratatiné pour ne pas apprécier une suggestion. J'aurais oublié quelque chose ? C'est mon premier dessin, et je n'ai pas choisi le plus facile...

  13. #13
    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
    Là comme ça je vois pas... As-tu essayé de déboguer en pas à pas pour voir ce qui se passe ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 183
    Par défaut
    J'avais déjà fait le F8 et je n'avais rien trouvé de spécial.

    En fait, je viens d'avoir une 'fulgurance' (si, si...) : j'ai commis l'erreur du débutant que je suis, à savoir que j'ai posé l'image SUR la pictureBox au lieu de la déclarer en BackGroundImage. Si bien que l'aiguille se dessinait dessous...

    Il n'y en a qu'une... Elle est moche, de travers, pas centrée, mais ça... En tâtonnant un peu... Mais elle est là...

    Alors merci de m'avoir suivi et autant aidé . Je n'aurais jamais trouvé seul.

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

Discussions similaires

  1. Probleme d'utilisation de iBatis.net
    Par cereal59 dans le forum EDI/Outils
    Réponses: 1
    Dernier message: 13/10/2006, 08h55
  2. probleme d'impression sous vb.net
    Par schlouff dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/09/2006, 11h35
  3. Probleme d'acces registre [vb.net]
    Par vincz95 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/04/2006, 15h22
  4. probleme de #include en C++ .NET
    Par CHIERA dans le forum MFC
    Réponses: 2
    Dernier message: 27/02/2004, 11h04

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