понедельник, 19 октября 2009 г.

Будильник-напоминание

Когда сидишь за компьютером (особенно если делаешь что-то интересное), то запросто можно забыть сделать какое-нибудь важное дело. Можно, конечно, завести будильник, но не стоит этого делать, если есть HiAsm. Сегодня я как раз буду делать такую программу.

Программа должна уметь подавать звуковой сигнал и выводить на экран сообщение. Думаю, этого будет достаточно, чтобы отвлечься от компьютера и сделать записанное дело. Но если нет, то придётся принудительно сворачивать прогу, которой вы так увлечены. Или переводить компьютер в ждущий режим :)

Также программа должна напоминать и через определённый промежуток времени, и в конкретное время.

Скачать схему HiAsm

В этой схеме реализован только интерфейс будущей программы. Используются две группы элементов, чтобы было логичнее и привычнее. Причём доступность полей ввода в группах зависит от флажков. По умолчанию у всех полей ввода параметр Enabled=false. Флажки все по умолчанию также выключены. Однако при переключении они выдают на событие onCheck 1 или 0 (вкл/выкл), что подаётся на метод doEnabled (чтобы из параметра сделать методом, нужно щёлкнуть по белому квадратику рядом с ним).

Теперь нужно реализовать функционал.

Скачать схему HiAsm

В этой части реализована проверка времени. При нажатии кнопки первой событие разветвителя проверяет, включен ли флажок (его точку свойств Checked мы вывели из мультиэлемента, просто подведя связь от точки до края редактора мультиэлемента).

IndexToChanel выдаёт событие под таким номером, какой ему подали на точку Index. Так что если флажок включен, то запускается таймер, который каждую секунду проверяет, соответствует ли введённое время текущему (компонент Time находится в самом конце вкладки "Система", не забудьте настроить его параметр Format). И при положительном сравнении If_else генерирует событие onTrue. А к нему поключеён компонент PointHint. Этот компонент не выполняет никаких действий и служит лишь для демонстрации. Он не компилируется, а сохраняется только в схеме.

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

Скачать схему HiAsm

Это окончательный вариант схемы. Возможно, он покажется сложным, но сейчас я всё расскажу по порядку.

Начинаем, как обычно, с события, которое всё инициирует. Это нажатие кнопки. И первое событие разветвителя переключает компонент Switch, чтобы поменять надпись на кнопке (внимательно рассмотрите параметры этого компонента). Второе событие разветвителя также поключено к компоненту Switch, но здесь он определяет функционал, а не надпись, и выдаваемые им значения совсем другие.

IndexToChanel разбирает, что передано ему в потоке, и генерирует соответствующее событие. Пусть это 1 - включение будильника. Первые два события последующиего разветвителя вы уже знаете, а третье отправляет программу в трей, откуда её можно добыть двойным щелчком (событие onDblClick компонента TrayIcon). И когда время подошло, то в действие вступает новый разветвитель.

Первые два его события напоминают нам о чём-то важном, что мы записали. Следующие два - выключают таймеры и меняют надпись на кнопке. Точно так же, как это делает сама кнопка, нажатая второй (4-й, 6-й и т.д.) раз.

А даьлше - только ваша фантазия. Можно сделать ещё кучу событий для напоминания, можно вставить множество дополнительных полезных функций. Главное - побольше экспериментировать с различными компонентами.

2 комментария:

  1. А полезная у Вас программа получилась - и всего 44 Кб. Причем аскетичный интерфейс почему-то приятнее, чем красивости аналогов. Будильник должен быть суров и прост, как армейский штык.
    Связующими узлами Вы используете группы элементов - это новый мощный прием.
    Но схема получилась какая-то растянутая. Возможна ли ее оптимизация?

    ОтветитьУдалить
  2. Можно, конечно, сместить часть элементов вниз, но главное - не переборщить, чтобы схеме легко читалась.

    ОтветитьУдалить