Жизнь по плану Лозовский Александр Xakep, номер #062, стр. 062-114-3 Checkbox3 – свойство caption – «Напомнить о: » Checkbox4 – свойство caption – «При этом играть: » Кстати, свойство enabled, привязанное к DBEdit`ам, должно напрямую зависеть от того, Checked оно или нет. Это очень важно для солидности :). Свойство MaskEdit1 EditMask должно быть равно ShortTime. Поэтому-то я и предпочел его стандартному Edit’у. Button1 – свойство caption – «Зафиксировать». Button2 – свойство caption – «Новая запись». Button3 – свойство caption – «Свернуть». Раз уж мы заколбасили такой интерфейс (он потянет на 400 кило), самое время заняться кодом. При запуске проги, первым делом надо открыть базу вопросов и выяснить, не пуста ли она :). От этого зависит дальнейшая тактика: в пустой таблице нечего перебирать, т.к. ее еще надо заполнить. Поэтому OnShow для формы у меня выглядит так: ClientDataSet1.LoadFromFile('events.xml'); IF ClientDataSet1.Eof= false then timer1.Enabled:= true; Если в базе есть какие-нибудь данные, то активизируется таймер, который каждую минуту будет перебирать все события и сравнивать их с текущим временем. Если время совпало, значит, час пробил, и надо делать запланированное. Этим вещами у нас будет заведовать обычный «Таймер». Его код смотри на врезке «Событие OnTimer». В общем, у нас есть такой план: последовательно, с первого значения и до конца файла, перебираем варианты и сравниваем их с базой. Но заметь, что сравниваю я не TDateTime, а строки, причем предварительно убрав из них 2 последних символа – секунды. Я это делаю потому, что наш предел точности 1 минута и, если я буду сравнивать время «20.11.03 15:00», заданное пользователем с «20.11.03 15:00:34» системной даты, то совпадения просто не будет. Если же ты захочешь сделать сравнение нормально (а не так, как сделал я), то воспользуйся, например, функцией DecodeDateTime. Она извлекает все значения из TDateTime в отдельные переменные: Year, Month, Day и т.д. Их ты сможешь сравнивать как нормальные цифры. Для вывода напоминания я сделал отдельную форму с 1 Memo и 1 Label. Все. С поиском разобрались. Давай теперь глянем на OnClick для кнопки «Новая запись»: ClientDataSet1.Insert; Timer1.Enabled:=false; Она переводит таблицу в режим записи. Каждый DBEdit, соответствующий своему CheckBox’у, связан с определенным полем таблицы. Например, DBEdit1 имеет свойство DataField ProgPath – его содержимое – путь для пользовательской проги, но заполнять его можно только после нажатия этой кнопки. После удачной заливки значений пользователю наверняка захочется нажать «Зафиксировать», поэтому пиши для нее следующий ОнКлик: Обработка OnClick var full, date : string; begin date:= inttostr (calendar1.Day)+'.'+inttostr (calendar1.month)+'.'+inttostr (calendar1.year); full:= date+' '+maskedit1.Text; ClientDataSet1.FieldByName('DateTime').AsDateTime:= StrToDateTime(full); ClientDataSet1.Post; ClientDataSet1.SaveToFile('events.xml'); timer1.Enabled:= true; Что здесь происходит. В переменную Date я запихиваю показатели «Календаря» и MaskEdit’a, делая это в том виде, который нужен для TDateTime. Реализую я это при помощи функции StrToDateTime. Готовую переменную заливаю в соответствующее поле таблицы и запускаю таймер. |