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