HELP. Отслеживание изменений времени и даты. - VB

Узнай цену своей работы

Формулировка задачи:

HIHI FRDS. Возникла необходимость отслеживать изменение системного времени и даты. Причем не изменение через Control Panel --> Data/Time, а именно изменение времени. Например, изменилась минута - возникло событие MinChange. Если изменился час - возникло событие HourChange. Точно так же для даты, месяца и года. Я понимаю, что можно поставить Timer и каждые n секунд проверять Time and Date. Но может быть есть другие более красивые способы ? Thank you for answers in your time in advance. Regards, Andy. removed@mail.ru

Решение задачи: «HELP. Отслеживание изменений времени и даты.»

textual
Листинг программы
Imports System.Drawing
Public Class Clock
    Dim blnInitiate As Boolean
    Dim secPast, secPresent As UShort 'secPast - значение секунд одну милисекуднду назад, а secPresent текущее значение секунд.
    Dim CurrentTime, TimeSplit() As String
    Dim angleSec, AngleMin, AngleHour As UShort
    Dim w, h As Single
    Dim x, y, x2, y2, x3, y3, xPnt, yPnt As Single
    Dim xB, yB, xB2, yB2, xB3, yB3 As Single
    Dim Gra As Graphics = MyBase.CreateGraphics
 
    Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer.Tick
        w = Me.Size.Width
        h = Me.Size.Height
        CurrentTime = System.DateTime.Now.ToLongTimeString
        CurrentTime &= ":" & System.DateTime.Now.Millisecond.ToString
        TimeSplit = CurrentTime.Split(":")
        'Задание секунд
        angleSec = TimeSplit(2) * 6 + (TimeSplit(3) / 1000) * 6
        'Задание минут
        AngleMin = TimeSplit(1) * 6
        'Задание часа
        'AngleHour = TimeSplit(0) * 30
        AngleHour = TimeSplit(0) * 30 + (30 * (AngleMin / 360))
        TextBox1.Text = System.DateTime.Now.ToLongTimeString & ":" & System.DateTime.Now.Millisecond.ToString
        secPresent = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
        'Рисование стрелок
        If secPast <> secPresent Or blnInitiate = True Then
            Me.Refresh()
            'Вычисление координат секундной стрелки
            'координаты конца
            x = 75 * Math.Sin(angleSec * Math.PI / 180)
            y = 75 * Math.Cos(angleSec * Math.PI / 180)
            'координаты начала (получется как бы хвостик у стрелочки длиной в 15 пикселей)
            xB = 15 * Math.Sin((angleSec + 180) * Math.PI / 180)
            yB = 15 * Math.Cos((angleSec + 180) * Math.PI / 180)
            'Рисование секундной стрелки
            Gra.DrawLine(Pens.Blue, xB + w / 2, yB * (-1) + h / 2, x + w / 2, y * (-1) + h / 2)
            'Вычисление координат минутной стрелки
            'координаты конца
            x2 = 65 * Math.Sin(AngleMin * Math.PI / 180)
            y2 = 65 * Math.Cos(AngleMin * Math.PI / 180)
            'координаты начала (получется как бы хвостик у стрелочки длиной в 13 пикселей)
            xB2 = 13 * Math.Sin((AngleMin + 180) * Math.PI / 180)
            yB2 = 13 * Math.Cos((AngleMin + 180) * Math.PI / 180)
            'Рисование минутной стрелки
            Gra.DrawLine(Pens.Green, xB2 + w / 2, yB2 * (-1) + h / 2, x2 + w / 2, y2 * (-1) + h / 2)
            'Вычисление координат часовой стрелки
            'координаты конца
            x3 = 50 * Math.Sin(AngleHour * Math.PI / 180)
            y3 = 50 * Math.Cos(AngleHour * Math.PI / 180)
            'координаты начала (получется как бы хвостик у стрелочки длиной в 10 пикселей)
            xB3 = 10 * Math.Sin((AngleHour + 180) * Math.PI / 180)
            yB3 = 10 * Math.Cos((AngleHour + 180) * Math.PI / 180)
            'Рисование часовой стрелки
            Gra.DrawLine(Pens.Red, xB3 + w / 2, yB3 * (-1) + h / 2, x3 + w / 2, y3 * (-1) + h / 2)
            blnInitiate = False
        End If
        secPast = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
    End Sub
 
 
    Private Sub Clock_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        blnInitiate = True
        Me.Top = 60 : Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 60
        Me.DoubleBuffered = True
    End Sub
    Private Sub Clock_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        w = Me.Size.Width
        h = Me.Size.Height
        'Рисование фона
        Gra.FillEllipse(Brushes.CornflowerBlue, w / 2 - 75, h / 2 - 75, 150, 150)
        Gra.DrawEllipse(Pens.Black, w / 2 - 75, h / 2 - 75, 150, 150)
        'Рисование засечек и цифр на циферблате
        For i = 30 To 360 Step 30
            xPnt = 65 * Math.Sin(i * Math.PI / 180)
            yPnt = 65 * Math.Cos(i * Math.PI / 180)
            'рисование цифр (цифры 1-9 и 10-12 рисуются отдельно, т.к. у них разная ширина, а значит и смещение по x влево разное, чтобы они были по середине)
            If i >= 30 And i <= 270 Then
                Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 5, yPnt * (-1) + h / 2 - 6) 'рисование цифр 1-9
            Else
                Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 8, yPnt * (-1) + h / 2 - 6) 'рисование цифр 10-12
            End If
            xPnt = 75 * Math.Sin(i * Math.PI / 180)
            yPnt = 75 * Math.Cos(i * Math.PI / 180)
            Gra.FillEllipse(Brushes.Black, xPnt + w / 2 - 2, yPnt * (-1) + h / 2 - 2, 4, 4)
        Next i
    End Sub
 
    Private Sub FirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FirstItem.Click
        'контекстное меню кнопка "скрыть/показать"
        If FirstItem.Text = "Скрыть" Then
            Me.Hide()
            FirstItem.Text = "Показать"
        Else
            Me.Show()
            FirstItem.Text = "Скрыть"
        End If
    End Sub
 
    Private Sub SecondItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SecondItem.Click
        'контекстное меню кнопка "выход"
        Me.Close()
    End Sub
End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5