Шаг 18.
Visual Prolog.
Окно часов

    На этом шаге мы рассмотрим окно часов.

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

  1. Создайте новый исходный модуль Clock.pro.
  2. Добавьте пункт Clock Window в подменю Test меню Task.
  3. Создайте новое окно Clock.
  4. Зайдите в эксперт окон и диалоговых окон и добавьте код по умолчанию для окна Clock в модуль Clock.pro.
  5. Используйте эксперт окон и диалоговых окон, чтобы добавить предложение для вызова окна Clock из окна Task при выборе команды Test | Clock Window.
  6. Запустите программу и посмотрите, создается ли окно при вызове команды Test Clock Window.
  7. Вернитесь в эксперт окон и диалоговых окон и добавьте предложение для события e_Update в окне Clock.

Использование таймеров

    Использовать таймер очень просто. Вы можете в любое время создать новый таймер для окна вызовом предиката timer_Set(Window, Milliseconds). Как только предикат timer_set был вызван, окно в указанные интервалы времени будет получать событие e_Timer.

Событие e_Update для окна часов

    На событие обновления e_Update мы будем выводить текущее время, центрированное в окне. Мы можем получить время запросом к предикату time/4. Первые три целых числа, возвращенные time/4, затем преобразуются в строку предикатом format. Наконец, строка выводится в центре окна предикатом draw_TextInRect, которому передается полный клиентский прямоугольник для вывода текста по центру этого прямоугольника.

   win_Clear(_Win,color_LtGray), 
      RCT=win_GetClientRect(_Win), 
      time(Hours,Minutes,Seconds,_),
      date(Year,Month,Day),
      format(Str, "%/%/% - %:%:%",Year,Month,Day,Hours,Minutes,Seconds), 
      draw_TextInRect(_Win, RCT, Str, -1,
                   [dtext_center,dtext_vcenter,dtext_singleline])

Событие e_Size для окна часов

    Каждый раз, когда окно изменяет свои размеры, изображение нужно перерисовывать. Правильнее будет не перерисовывать при событии изменения размера окна e_Size, а вызывать новое событие e_Update для всего окна.

   win_clock_eh(_Win,e_Size(_Width,_Height),0):-!,
      win_Invalidate(_Win)

Событие e_Create для окна часов

    На событие e_Create мы запускаем таймер. Значение интервала в 1000 миллисекунд означает, что мы будем получать событие таймера каждую секунду.

   win_clock_eh(_Win,e_Create(_),0):-!,
      _NewTimerId=timer_Set(_Win,1000)

Событие e_Timer для окна часов

    На событие e_Timer мы будем объявлять окно недействительным. Это вызовет обновление окна в том случае, если оно не свернуто и не закрыто другим окном. (Вы найдете событие e_Timer под группой Misc в эксперте окон и диалоговых окон.)

   win clock_eh(_Win,e_Timer(_TimerId),0):-!,
     win_Invalidate(_Win)

    Обратите внимание, что в реальном приложении вы, вероятно, не стали бы объявлять недействительным целое окно, т.к. слишком много времени может потребоваться на то, чтобы перерисовать его. Если вы хотите, чтобы программа была быстрой и выглядела профессионально, нужно стараться не объявлять окно недействительным. Правда, это потребует дополнительных усилий уже после того, как основные функциональные возможности будут реализованы.

    Таймеры - ограниченный ресурс системы. В реальном приложении идентификатор таймера, возвращаемый timer_set, должен быть сохранен для освобождения в событии e_Destroy, где он будет использоваться в качестве аргумента в предикате timer Kill/1.

    Созданное приложение можно взять здесь (412,6 Кб)

    На следующем шаге мы рассмотрим окно изображения.




Предыдущий шаг Содержание Следующий шаг