Orologio analogico

di il
6 risposte

Orologio analogico

Buongiorno ragazzi, sono io, quekìlo del progetto per la gestione del trenino elettrico di un amico
Mo è venuta la malsana ideaa di mettere sul mimico della stazione un bel orologio analogico (avete mai visto una stazione senza ???)

Cosi, essendo un programmatore “copia ed incolla”, mi son messo a cercare su internet, ricerca durata poco, dato che ho subito trovato questo.

Provato con un Form ed una Class … funziona che è un piacere.

Ora devo solo fare qualche piccola modifica per adattare il codice dell’orologio al mio progetto:

1) l’orologio deve apparire sul Form2 e non sul Form1

2) l’orologio deve poter essere avviato a qualsivoglia ora e non solo al tempo corrente del PC

3) deve essere possibile impostare una compressione temporale (tanto per accontentare Einstein).

Il codice originale nel form1

Public Class Form1


    Public ore As Integer = 0

    Public minuti As Integer = 0

    Public secondi As Integer = 0



    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        clocktimer.Start()



    End Sub

    Private Sub clockTimer_Tick(sender As Object, e As EventArgs) Handles clocktimer.Tick

        secondi = secondi + 1

        If (secondi = 60) Then

            secondi = 0

            minuti = minuti + 1

        End If



        If (minuti = 60) Then

            minuti = 0

            ore = ore + 1



        End If



        If (ore = 12) Then

            ore = 0

        End If



        clock.Refresh()

    End Sub



    Private clock As ClockPanel



    ' Every second, refresh the clock



    'Private Sub clockTimer_Tick(sender As Object, e As EventArgs) Handles clocktimer.Tick

    ' End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load



        clock = New ClockPanel()

        clock.Name = "newpanel"

        clock.Width = 200

        clock.Height = 200

        clock.Left = 90

        clock.Top = 280





        Me.Controls.Add(clock)

        'clocktimer.Start()



    End Sub



    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        ore = Int(hh.Text)

        minuti = Int(mm.Text)

        secondi = Int(ss.Text)



    End Sub

End Class



che nel nio progetto diventa

 Private Sub clockset_Click(sender As Object, e As EventArgs) Handles clockset.Click
     ore = Int(hh.Text)
     minuti = Int(mm.Text)
     secondi = Int(ss.Text)
 End Sub

odice Form 2

   Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

       clockTimer.Start()

       Clock = New ClockPanel()

       Clock.Name = "newpanel"

       Clock.Width = 165
       Clock.Height = 165
       Clock.Left = 1700
       Clock.Top = 15
       Me.Controls.Add(Clock)

   End Sub

    
    Private Sub clockTimer_Tick(sender As Object, e As EventArgs) Handles clockTimer.Tick
        Form1.secondi = Form1.secondi + 1
        If (Form1.secondi = 60) Then
            Form1.secondi = 0
            Form1.minuti = Form1.minuti + 1
        End If

        If (Form1.minuti = 60) Then
            Form1.minuti = 0
            Form1.ore = Form1.ore + 1

        End If

        If (Form1.ore = 12) Then
            Form1.ore = 0
        End If

        Clock.Refresh()
        
      end sub
      end class  

Non sto mettere il codice della class1 ,,, fa solo disegni,   solo alla prima riga c'è 

Public Class ClockPanel : Inherits Panel

ora, mentre con un form solo funziona, con due form mi da i deguenti errori

'Clock' è un tipo classe e non può essere usato come espressione.

'Top' non è un membro di 'Clock'.

'Left non è un membro di 'Clock'.

Height' non è un membro di 'Clock'.

'Width' non è un membro di 'Clock'.

Name non è un membro di 'Clock'.

'Clock' è un tipo classe e non può essere usato come espressione.

Refresh non è un membro di 'Clock'

riferiti alle righe:

Clock = New ClockPanel()
Clock.Name = "newpanel"
Clock.Width = 165
Clock.Height = 165
Clock.Left = 1700
Clock.Top = 15
Me.Controls.Add(Clock)

 Clock.Refresh()

Qualche idea ???

Grazie in anticioi dellaiuto

6 Risposte

  • Re: Orologio analogico

    Ciao,

    così ti va bene ? ... ho velocizzato per farti vedere lo spostamento delle lancette ;-)

    A velocità normale ;-))

    Altri

  • Re: Orologio analogico

    Si, Franco, cosi va benissimo ed è come funziona anche a me con un solo form; la domanda è perchè non funziona con due form !!

  • Re: Orologio analogico

    Ciao,

    fai dei test con questa demo. https://1drv.ms/u/c/46aacde0762d4e68/EWnAxWmDcQpNmVCRzi5MHdIBag8D3jyM_G1Yk6StUj-K1w?e=m3wxpD

    Sono tre test, uno mettendo l'orologio in una form e nel Load imposti le dimensioni della form che corrisponderà alla picturebox dell'orologio

    Il secondo test usa una form dove nel designer si imposta un panel che definisce sia la posizione che le dimensioni dell'orologio nella Form

    Il terzo test usa una picturebox che contiene una immagine sulla quale viene disegnato l'orologio. Nel Designer della form si imposta la PictureBox che rappresenta un palo che sorregge l'orologio.

    .
    Esempio su Form con Panel di nome PanelClock ... 
    ' add PictureBox 
    PanelClock.Controls.Add(PictureBoxClock)
    Me.Controls.Add(PanelClock):

    Public Class FormStationWatch
        ' set variables
        Private WithEvents Timer1 As New Timer With {.Interval = 1000} ' seconds timer
        Private center As Point
        Private radius As Integer
        Private PictureBoxClock As New PictureBox With {.Dock = DockStyle.Fill, .SizeMode = PictureBoxSizeMode.StretchImage}
    
        ' FORM LOAD
        Private Sub FormStationWatch_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' add PictureBox 
            PanelClock.Controls.Add(PictureBoxClock)
            Me.Controls.Add(PanelClock)
    
            ' load image file
            PictureBoxClock.Image = My.Resources.MyWatch004Pgn
            ' start timer
            AddHandler PictureBoxClock.Paint, AddressOf PictureBoxClock_Paint
            Timer1.Start()
        End Sub
    
        ' PAINT EVENT LANCETTE DESIGN
        Private Sub PictureBoxClock_Paint(sender As Object, e As PaintEventArgs)
            ' active anti-aliasing
            Dim g As Graphics = e.Graphics
            g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            ' calculate the center watch
            center = New Point(PictureBoxClock.Width \ 2, PictureBoxClock.Height \ 2)
            radius = Math.Min(PictureBoxClock.Width, PictureBoxClock.Height) \ 2 - 10
    
            ' get time
            Dim now As DateTime = DateTime.Now
    
            ' design the lancette
            Using penSecondi As New Pen(Color.Red, 2), penMinuti As New Pen(Color.Black, 5), penOre As New Pen(Color.Black, 7)
                DrawHand(g, now.Second * 6, radius - 20, penSecondi)
                DrawHand(g, now.Minute * 6, radius - 30, penMinuti)
                DrawHand(g, (now.Hour Mod 12) * 30 + now.Minute * 0.5, radius - 50, penOre)
            End Using
            ' design the watch center
            g.FillEllipse(Brushes.Black, center.X - 5, center.Y - 5, 10, 10)
        End Sub
    
        ' LANCETTE DESIGN METHOD
        Private Sub DrawHand(g As Graphics, angle As Double, length As Integer, pen As Pen)
            Dim radian As Double = (angle - 90) * Math.PI / 180
            Dim endPoint As New Point(CInt(center.X + Math.Cos(radian) * length), CInt(center.Y + Math.Sin(radian) * length))
            g.DrawLine(pen, center, endPoint)
        End Sub
    
        ' REFRESH PICTUREBOX
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            PictureBoxClock.Invalidate()
        End Sub
    End Class
  • Re: Orologio analogico

    10/02/2025 - By65Franco ha scritto:

    Ciao,

    così ti va bene ? ... ho velocizzato per farti vedere lo spostamento delle lancette ;-)

    A velocità normale ;-))

    Altri

    Sono davvero bellissimi, specie quello con Ferrovie Italiane

  • Re: Orologio analogico

    11/02/2025 - amorosik ha scritto:

    Sono davvero bellissimi, specie quello con Ferrovie Italiane

    Se si usa un panel, dove comparirà l'orologio, in una form , allora si può disegnare nella form il palo che tiene l'orologio nel marciapiede della pensilina ... oppure un supporto da muro, stile bandiera, che tiene l'orologio.

    In questo caso si usa una Form e una PictureBox nella quale si posiziona e si disegna l'orologio.

    Esempio per disegnare l'orologio all'interno di una picturebox:
    Public Class FormStationWatchPictureBoxOnly
        ' set variables
        Private WithEvents Timer1 As New Timer With {.Interval = 1000}
        Private center As Point
        Private radius As Integer
    
        ' FORM LOAD
        Private Sub FormStationWatchPictureBoxOnly_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' event design lancette in the PictureBoxPalo
            AddHandler PictureBoxPalo.Paint, AddressOf PictureBoxPalo_Paint
            ' start timer
            Timer1.Start()
        End Sub
    
        ' WATCH DESIGN IN THE PISCTUREBOX
        Private Sub PictureBoxPalo_Paint(sender As Object, e As PaintEventArgs)
            ' active anti-aliasing
            Dim g As Graphics = e.Graphics
            g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            ' watch position and size 
            Dim clockX As Integer = 104
            Dim clockY As Integer = 81
            Dim clockSize As Integer = 120
            ' watch design
            g.DrawImage(My.Resources.MyWatch010, clockX, clockY, clockSize, clockSize)
            ' calculate the watch center
            center = New Point(clockX + clockSize \ 2, clockY + clockSize \ 2)
            radius = clockSize \ 2 - 10
    
            ' get time
            Dim now As DateTime = DateTime.Now
    
            ' design the lancette
            Using penSecondi As New Pen(Color.Red, 2), penMinuti As New Pen(Color.Black, 4), penOre As New Pen(Color.Black, 5)
                DrawHand(g, now.Second * 6, radius - 12, penSecondi)
                DrawHand(g, now.Minute * 6, radius - 18, penMinuti)
                DrawHand(g, (now.Hour Mod 12) * 30 + now.Minute * 0.5, radius - 24, penOre)
            End Using
            ' design the watch center
            g.FillEllipse(Brushes.Black, center.X - 5, center.Y - 5, 10, 10)
        End Sub
    
        ' LANCETTE DESIGN METHOD
        Private Sub DrawHand(g As Graphics, angle As Double, length As Integer, pen As Pen)
            Dim radian As Double = (angle - 90) * Math.PI / 180
            Dim endPoint As New Point(CInt(center.X + Math.Cos(radian) * length), CInt(center.Y + Math.Sin(radian) * length))
            g.DrawLine(pen, center, endPoint)
        End Sub
    
        ' REFRESH PICTUREBOX
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            PictureBoxPalo.Invalidate()
        End Sub
    End Class
  • Re: Orologio analogico

    11/02/2025 - By65Franco ha scritto:

    fai dei test con questa demo. https://1drv.ms/u/c/46aacde0762d4e68/EWnAxWmDcQpNmVCRzi5MHdIBag8D3jyM_G1Yk6StUj-K1w?e=m3wxpD

    Aggiornato la demo con il terzo esempio di "Palo che Sorregge l'Orologio"

Devi accedere o registrarti per scrivere nel forum
6 risposte