none
Pourquoi Handles Timer1.Tick ne marche pas RRS feed

  • Question

  • Bonjour,

    Je suis un débutant avec VB 2008.

    Je fais un graphique qui doit être rafraîchit à toutes les 100msec.

    Alors j'ai placé après Handles Timer1.Tick comme suit:

    Private

     

    Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Timer1.Tick

     

     

     

    e.Graphics.DrawRectangle(Pens.BurlyWood, 0, 0, 620, 500)

    e.Graphics.DrawRectangle(Pens.BurlyWood, 1, 1, 619, 499)

    e.Graphics.DrawRectangle(Pens.BurlyWood, 2, 2, 617, 497)

     

     

     

     

    End Sub


     

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

     

    End Sub

    -----------

    Il m'arrive l'erreur suivante que je ne comprend pas trop bien:

    L'exception System.InvalidCastException n'a pas été gérée
      Message="Impossible d'effectuer un cast d'un objet de type 'System.EventArgs' en type 'System.Windows.Forms.PaintEventArgs'."
      Source="Test graphique"
      StackTrace:
           à WindowsApplication1.Form1._Lambda$__1(Object a0, EventArgs a1) dans C:\Users\Jean Dubuc\Documents\Visual Studio 2008\Projects\Test graphique\Test graphique\Form1.Designer.vb:ligne 0
           à System.EventHandler.Invoke(Object sender, EventArgs e)
           à System.Windows.Forms.Timer.OnTick(EventArgs e)
           à System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(ApplicationContext context)
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à WindowsApplication1.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException:


    ------

    Est-ce que quelqu'un peut me dire pourquoi ça ne marche pas?


    merci

    samedi 6 février 2010 02:18

Réponses

  • Bonsoir,

    Comme le message d'erreur l'indique, DrawLine n'accepte pas 2 arguments. Les différentes signatures sont celles-ci : 

    Graphics.DrawLine (Pen, Point, Point)  :
    Dessine une ligne reliant deux structures Point. 

    Graphics.DrawLine (Pen, PointF, PointF)  :
    Dessine une ligne reliant deux structures PointF. 

    Graphics.DrawLine (Pen, Int32, Int32, Int32, Int32)  :
    Dessine une ligne reliant les deux points spécifiés par les paires de coordonnées.
     
    Graphics.DrawLine (Pen, Single, Single, Single, Single)  :
    Dessine une ligne reliant les deux points spécifiés par les paires de coordonnées.


    Vous pouvez avoir plus d'informations sur MSDN : http://msdn.microsoft.com/fr-fr/library/system.drawing.graphics.drawline(VS.80).aspx

    Cordialement,

    Mathieu


    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    • Proposé comme réponse Mathieu Francesch samedi 6 février 2010 21:09
    • Marqué comme réponse JeanDubuc dimanche 7 février 2010 13:45
    samedi 6 février 2010 19:21

Toutes les réponses

  • Bonjour,

    Vous devez modifier votre code comme ceci après avoir Drag & Drop le composant System.Windows.Forms.Timer sur votre form :



        Private Sub Form1_Load(ByVal sender As System.Object, _
                               ByVal e As System.EventArgs) _
                               Handles MyBase.Load
            Timer1.Interval = 100
            Timer1.Start()
    
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs) _ 'Ici vous devez utiliser un EventArgs et pas un PaintEventArgs
                                Handles Timer1.Tick
    
            'Ici Votre code de rafraichissement
        End Sub
    
        Private Sub Form1_Paint(ByVal sender As System.Object, _
                                ByVal e As System.Windows.Forms.PaintEventArgs) _
                                Handles MyBase.Paint
    
        End Sub

    Cordialement,

    Mathieu
    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    samedi 6 février 2010 07:20
  • Bonjour Mathieu,


    Merci pour votre réponse, mais j'ai toujours le même problême.  Mon code de rafraichissement est:

    e.Graphics.DrawLines(Pens.Blue, curvePoints2)

    où curvePoints2 est un ensemble de points qui se modifie dans le temps. Si j'écris ça dans Timer1_Tick, j'obtiens une erreur: 'Graphics' n'est pas un membre de 'System.EventArgs.'

    Je tourne en rond.

    Ce qu'il me faut c'est de déclencher Form1_Paint parce que mon code de rafraichissement est composé d'instructions Paint qui ne peuvent se trouver ailleurs.

    Il y a sans doute quelque chose que je ne comprends pas.


    Merci

    Jean Dubuc



    samedi 6 février 2010 16:58
  • Bonsoir,

    Et si vous faites ainsi :

    Private Sub Timer1_Tick(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs) _ 'Ici vous devez utiliser un EventArgs et pas un PaintEventArgs
                                Handles Timer1.Tick
    
            Me.CreateGraphics().DrawLine(Pens.Blue, curvePoints2)
    '...
    End Sub
    

    Cordialement,




    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    samedi 6 février 2010 17:58
  • Bonsoir Mathieu,

    Là ça donne une autre erreur: La résolution de surcharge a échoué, car aucun 'DrawLine accessible n'accepte ce nombre d'arguments.

    Toute l'expression est soulignée.

     

    Me.CreateGraphics().DrawLine(Pens.Blue, curvePoints2)

    Si j'étais dans d'autres languages, j'aurais simplement à appeler la souroutine Form1_Paint dans l'interruption Timer1. Pourquoi ce n'est pas simple comme ça ici?

    Pas facile...hein?



    Merci
    samedi 6 février 2010 19:02
  • Bonsoir,

    Comme le message d'erreur l'indique, DrawLine n'accepte pas 2 arguments. Les différentes signatures sont celles-ci : 

    Graphics.DrawLine (Pen, Point, Point)  :
    Dessine une ligne reliant deux structures Point. 

    Graphics.DrawLine (Pen, PointF, PointF)  :
    Dessine une ligne reliant deux structures PointF. 

    Graphics.DrawLine (Pen, Int32, Int32, Int32, Int32)  :
    Dessine une ligne reliant les deux points spécifiés par les paires de coordonnées.
     
    Graphics.DrawLine (Pen, Single, Single, Single, Single)  :
    Dessine une ligne reliant les deux points spécifiés par les paires de coordonnées.


    Vous pouvez avoir plus d'informations sur MSDN : http://msdn.microsoft.com/fr-fr/library/system.drawing.graphics.drawline(VS.80).aspx

    Cordialement,

    Mathieu


    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    • Proposé comme réponse Mathieu Francesch samedi 6 février 2010 21:09
    • Marqué comme réponse JeanDubuc dimanche 7 février 2010 13:45
    samedi 6 février 2010 19:21
  • Bonsoir Mathieu,


    Merci beaucoup ! Là ça marche!

    Il y avait trop d'arguments.

    La différence d'avec les essais que j'avais fait, c'est le  Me.CreateGraphics



    Merci encore!
    samedi 6 février 2010 20:58
  • Bonsoir,

    Je suis ravi si cela fonctionne comme vous le souhaitez.

    Pouvons nous clore le sujet ?

    Cordialement,

    Mathieu
    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    • Marqué comme réponse JeanDubuc dimanche 7 février 2010 13:45
    • Non marqué comme réponse JeanDubuc dimanche 7 février 2010 13:45
    samedi 6 février 2010 21:09