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
Листинг программы
  1. Imports System.Drawing
  2. Public Class Clock
  3.     Dim blnInitiate As Boolean
  4.     Dim secPast, secPresent As UShort 'secPast - значение секунд одну милисекуднду назад, а secPresent текущее значение секунд.
  5.     Dim CurrentTime, TimeSplit() As String
  6.     Dim angleSec, AngleMin, AngleHour As UShort
  7.     Dim w, h As Single
  8.     Dim x, y, x2, y2, x3, y3, xPnt, yPnt As Single
  9.     Dim xB, yB, xB2, yB2, xB3, yB3 As Single
  10.     Dim Gra As Graphics = MyBase.CreateGraphics
  11.  
  12.     Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer.Tick
  13.         w = Me.Size.Width
  14.         h = Me.Size.Height
  15.         CurrentTime = System.DateTime.Now.ToLongTimeString
  16.         CurrentTime &= ":" & System.DateTime.Now.Millisecond.ToString
  17.         TimeSplit = CurrentTime.Split(":")
  18.         'Задание секунд
  19.         angleSec = TimeSplit(2) * 6 + (TimeSplit(3) / 1000) * 6
  20.         'Задание минут
  21.         AngleMin = TimeSplit(1) * 6
  22.         'Задание часа
  23.         'AngleHour = TimeSplit(0) * 30
  24.         AngleHour = TimeSplit(0) * 30 + (30 * (AngleMin / 360))
  25.         TextBox1.Text = System.DateTime.Now.ToLongTimeString & ":" & System.DateTime.Now.Millisecond.ToString
  26.         secPresent = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
  27.         'Рисование стрелок
  28.         If secPast <> secPresent Or blnInitiate = True Then
  29.             Me.Refresh()
  30.             'Вычисление координат секундной стрелки
  31.             'координаты конца
  32.             x = 75 * Math.Sin(angleSec * Math.PI / 180)
  33.             y = 75 * Math.Cos(angleSec * Math.PI / 180)
  34.             'координаты начала (получется как бы хвостик у стрелочки длиной в 15 пикселей)
  35.             xB = 15 * Math.Sin((angleSec + 180) * Math.PI / 180)
  36.             yB = 15 * Math.Cos((angleSec + 180) * Math.PI / 180)
  37.             'Рисование секундной стрелки
  38.             Gra.DrawLine(Pens.Blue, xB + w / 2, yB * (-1) + h / 2, x + w / 2, y * (-1) + h / 2)
  39.             'Вычисление координат минутной стрелки
  40.             'координаты конца
  41.             x2 = 65 * Math.Sin(AngleMin * Math.PI / 180)
  42.             y2 = 65 * Math.Cos(AngleMin * Math.PI / 180)
  43.             'координаты начала (получется как бы хвостик у стрелочки длиной в 13 пикселей)
  44.             xB2 = 13 * Math.Sin((AngleMin + 180) * Math.PI / 180)
  45.             yB2 = 13 * Math.Cos((AngleMin + 180) * Math.PI / 180)
  46.             'Рисование минутной стрелки
  47.             Gra.DrawLine(Pens.Green, xB2 + w / 2, yB2 * (-1) + h / 2, x2 + w / 2, y2 * (-1) + h / 2)
  48.             'Вычисление координат часовой стрелки
  49.             'координаты конца
  50.             x3 = 50 * Math.Sin(AngleHour * Math.PI / 180)
  51.             y3 = 50 * Math.Cos(AngleHour * Math.PI / 180)
  52.             'координаты начала (получется как бы хвостик у стрелочки длиной в 10 пикселей)
  53.             xB3 = 10 * Math.Sin((AngleHour + 180) * Math.PI / 180)
  54.             yB3 = 10 * Math.Cos((AngleHour + 180) * Math.PI / 180)
  55.             'Рисование часовой стрелки
  56.             Gra.DrawLine(Pens.Red, xB3 + w / 2, yB3 * (-1) + h / 2, x3 + w / 2, y3 * (-1) + h / 2)
  57.             blnInitiate = False
  58.         End If
  59.         secPast = System.DateTime.Now.Second + (TimeSplit(3) / 1000) * 6
  60.     End Sub
  61.  
  62.  
  63.     Private Sub Clock_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  64.         blnInitiate = True
  65.         Me.Top = 60 : Me.Left = Screen.PrimaryScreen.WorkingArea.Width - Me.Width - 60
  66.         Me.DoubleBuffered = True
  67.     End Sub
  68.     Private Sub Clock_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
  69.         w = Me.Size.Width
  70.         h = Me.Size.Height
  71.         'Рисование фона
  72.         Gra.FillEllipse(Brushes.CornflowerBlue, w / 2 - 75, h / 2 - 75, 150, 150)
  73.         Gra.DrawEllipse(Pens.Black, w / 2 - 75, h / 2 - 75, 150, 150)
  74.         'Рисование засечек и цифр на циферблате
  75.         For i = 30 To 360 Step 30
  76.             xPnt = 65 * Math.Sin(i * Math.PI / 180)
  77.             yPnt = 65 * Math.Cos(i * Math.PI / 180)
  78.             'рисование цифр (цифры 1-9 и 10-12 рисуются отдельно, т.к. у них разная ширина, а значит и смещение по x влево разное, чтобы они были по середине)
  79.             If i >= 30 And i <= 270 Then
  80.                 Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 5, yPnt * (-1) + h / 2 - 6) 'рисование цифр 1-9
  81.             Else
  82.                 Gra.DrawString(i / 30, Font, Brushes.Black, xPnt + w / 2 - 8, yPnt * (-1) + h / 2 - 6) 'рисование цифр 10-12
  83.             End If
  84.             xPnt = 75 * Math.Sin(i * Math.PI / 180)
  85.             yPnt = 75 * Math.Cos(i * Math.PI / 180)
  86.             Gra.FillEllipse(Brushes.Black, xPnt + w / 2 - 2, yPnt * (-1) + h / 2 - 2, 4, 4)
  87.         Next i
  88.     End Sub
  89.  
  90.     Private Sub FirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FirstItem.Click
  91.         'контекстное меню кнопка "скрыть/показать"
  92.         If FirstItem.Text = "Скрыть" Then
  93.             Me.Hide()
  94.             FirstItem.Text = "Показать"
  95.         Else
  96.             Me.Show()
  97.             FirstItem.Text = "Скрыть"
  98.         End If
  99.     End Sub
  100.  
  101.     Private Sub SecondItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SecondItem.Click
  102.         'контекстное меню кнопка "выход"
  103.         Me.Close()
  104.     End Sub
  105. End Class

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут