Eyesaver

Из невизуальных компонентов - два таймера, TTrayIcon, TPopupMenu и TBalloonHint.
В первый спинэдит будет вводится время непрерывной работы, в второй - время перерыва, в третий - время предупреждения об истечении времени. Значит, в обработчике события OnChange всех трёх спинэдитов нужно написать следующее:
В обработчике события OnCreate формы пишем следующее:
Подсказки будут отображаться в BalloonHint. Подробно их здесь рассматривать не будем. Рассмотрим самую главную часть программы: отсчёт времени. Для этого я решил применить два таймера. Обработчик первого таймера:
И второго таймера:
В этой статье я рассмотрел основной принцип работы программы. Полный исходный код можно посмотреть во вложении.
Программа поможет вам вовремя делать перерывы в работе за компьютером и сберечь свои глаза от близорукости.
Дорогие друзья, хочу поделиться с вами своим новым проектом. Любой проект начинается с проблемы; проблема, которую я обнраружил - это профессиональная болезнь программистов: близорукость. Благо, я пока не страдаю этим недугом, однако начальные признаки близорукости чувствую. Поэтому я решил написать программу, которая бы напоминала мне о том, что пора сделать перерыв в работе. Программу я писал на Delphi XE.
На форму я поместил три SpinEdit'a, один чекбокс и две кнопки:

Из невизуальных компонентов - два таймера, TTrayIcon, TPopupMenu и TBalloonHint.
Теперь объявим константы и переменные:
type Tstate = (work, pause); var Form1: TForm1; TimeStart: TTime; //начальное время TimeNow: TTime; //время сейчас WorkMin: integer; //Время работы PauseMin: integer; //Время паузы Path: string; //Путь State: TState = work; //Статус работа или пауза Autorun: boolean; //есть ли мы в автозапуске Warning: integer; //время предупреждения WarningDoes: boolean = false; //было ли предупреждение FirstStart: boolean = false; //является ли запуск первым f:TForm; const ProgName = 'Eyesaver'; WorkMinValue = 'WorkMin'; PauseMinValue = 'PauseMin'; AutorunValue = 'Autorun'; SectionName = 'Default'; WarningValue = 'Warning'; IconFile = 'tray.ico';
В первый спинэдит будет вводится время непрерывной работы, в второй - время перерыва, в третий - время предупреждения об истечении времени. Значит, в обработчике события OnChange всех трёх спинэдитов нужно написать следующее:
procedure TForm1.SpinEdit1Change(Sender: TObject); var reg: TRegistry; //Настройки будем хранить в реестре begin reg := TRegistry.Create; reg.RootKey := hkey_current_user; reg.OpenKey('software\Eyesaver',false); WorkMin := form1.SpinEdit1.Value; //соответственно, PauseMin и Warning в зависимости от спинэдита reg.writeinteger(WorkMinValue,WorkMin); reg.Free; end;
В обработчике события OnCreate формы пишем следующее:
procedure TForm1.FormCreate(Sender: TObject); begin Path := ExtractFilePath(ParamStr(0)); //это будет нужно для добавления в автозапуск TimeStart := now; //Берём начальное время TimesCheck; //читаем время из реестра AutorunCheck; //проверяем, есть ли мы в автозапуске Application.OnMinimize := ApplicationMinizme; //это событие будет сворачивать программу в трей form1.Left := (screen.Width div 2) - (form1.Width div 2); //выносим форму в центр экрана form1.Top := (screen.Height div 2) - (form1.Height div 2); Label7.Caption := 'Предупре-'+#10#13+'ждение'; if state = work then //если сейчас работаем, begin //то ставим соответствующий enabled form1.Button2.Enabled := false; //кнопкам Остановить или Запустить form1.Button1.Enabled := true; form1.N2.Enabled := true; form1.N3.Enabled := false; end; if FirstStart then //Если программа запущена впервые, begin //Отобразить подсказки ShowHints(1); //и остановить отсчёт времени form1.Button1Click(self); end; end;
Подсказки будут отображаться в BalloonHint. Подробно их здесь рассматривать не будем. Рассмотрим самую главную часть программы: отсчёт времени. Для этого я решил применить два таймера. Обработчик первого таймера:
procedure TForm1.Timer1Timer(Sender: TObject); begin TimeNow := now; //берём время label3.Caption:=inttostr(MinuteOf(TimeNow-TimeStart))+' '+IntToStr(SecondOf(TimeNow-TimeStart)); if MinuteOf(TimeNow - TimeStart) = WorkMin then //если время вышло, begin TimeStart := TimeNow; //Обнуляем секундомер Timer1.Enabled := false; //и включаем второй таймер Timer2.Enabled := true; DoPause; //Затемняем экран и сообщаем об истечении времени state := pause; end; if MinuteOf(TimeNow - TimeStart) = Warning then //Здесь обрабатывается предупреждение об истечение времени begin TimeNow := now; if WarningDoes = false then DoWarning; end; end;
И второго таймера:
procedure TForm1.Timer2Timer(Sender: TObject); begin TimeNow := now; //смотрим время label6.Caption:=inttostr(MinuteOf(TimeNow-TimeStart))+' '+IntToStr(SecondOf(TimeNow-TimeStart)); if MinuteOf(TimeNow - TimeStart) >= PauseMin then //если время вышло begin TimeStart := TimeNow; //обнуляем секундомер Timer2.Enabled := false; //включаем первый таймер Timer1.Enabled := true; DoWork; //убираем затенение и возвращаемся к работе state := work; WarningDoes := false; end; end;
В этой статье я рассмотрел основной принцип работы программы. Полный исходный код можно посмотреть во вложении.
Программа поможет вам вовремя делать перерывы в работе за компьютером и сберечь свои глаза от близорукости.
Written by: Darth_Vaider
Date: 14.10.2011
| Вложение | Размер |
|---|---|
| eyesaver_source.zip | 86.34 КБ |
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1789 просмотров



Комментарии
6 комментария(ев)Дата: ПТ, 14/10/2011 - 15:51
Дата: ПТ, 14/10/2011 - 19:09
кинь ехешник)))
а то компилятора нету(((
Дата: ВС, 16/10/2011 - 02:21
Первая мысль после прочтения начала - работа с курсором. В таймере задаётся время работы за компом, по истечении которого выдаётся предупреждение. При этом таймер активен только во время движения курсора или нажатиях клавиш, + 5-10секунд после прекращения движения/нажатия. Таймер кончился - советуем отдохнуть. Запускается второй таймер, который отслеживает работу с компом во время показа предупреждения. Если работа продолжается, можно каждую пару-тройку секунд выдавать такое же сообщение. А чтобы работать стало невозможно, то на каждую координату экрана, на которую был сдвинут курсор, и на каждое нажатие клавиши. Для фееричности - в рандомных местах экрана поверх всех окон. Так можно засрать весь экран и невозможность закрыть сообщения просто вынудят юзыря уйти за дробовиком
А когда он вернётся во всеоружии и с отдохнувшими глазками сообщения пропадут сами - ровно через то время, которого достаточно для
открытия сейфа с дробовикомотдыха глаз, и вообще.Жёстко, но работать будет стопудово
Дата: ВС, 16/10/2011 - 03:10
Не, я не такой зверь
Кстати, Лорд, а почему я не могу прикрепить файл к комментарию?
3 варианта: или выполни просьбу Corvus сам, или сделай прикрепление файлов к комментариям, или дай права на редактирование статьи.
Дата: ВС, 16/10/2011 - 03:49
Вообще отличная идея для программы! Уже озадачил друга, изучающего C#, написать такую
Дата: ВС, 16/10/2011 - 16:52
ааа ехе ч студиюю)