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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д