Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi.pdf
Скачиваний:
191
Добавлен:
24.02.2016
Размер:
6.84 Mб
Скачать

В очередной раз выполните компиляцию программы и запустите ее. Откройте окно диалога Alarm Details и хорошенько его потестируйте

(рисунок 9.43).

Рисунок 9.43. Тестирование окна Alarm Details

Все компоненты работают правильно. Можете поздравить себя с очередным достижением. Вы создали важную часть приложения Alarms — окно диалога, а заодно разобрались с множеством новых компонентов.

9.3.9. Установка и получение данных

Окно диалога есть, но пользы от него пока нет. Все дело в том, что мы научились устанавливать параметры будильника, но не научились их принимать и хранить.

Шаг 22. Для хранения параметров будильника нам нужна новая структура данных, очевидно класс объектов. Немного поразмыслив, приходим к следующему описанию:

type

TAlarm = class private

Handled: Boolean; public

MsgText: string; DateTime: TDateTime;

462

PlaySound: Boolean;

Recurring: Integer;

function GetAlarmStr: string; procedure CheckTime;

end;

Поясним назначение полей и методов. Поле MsgText предназначено для хранения текстового сообщения. В поле DateTime записывается время и дата сигнала. Значение поля PlaySound показывает, требуется ли звуковое сопровождение сообщения. Поле Recurring определяет периодичность работы будильника и принимает следующие значения:

0 – ежедневно;

1..7 – в заданный день недели (1 — Пн, 2 — Вт, ..., 7 — Вс);

8 – однажды в заданный день.

Впервых двух случаях поле DateTime хранит только время, а в последнем еще и дату. Такое ухищрение позволяет организовать компактное хранение данных. Флаг Handled, объявленный в секции private, является служебным

ипозволит избежать повторных срабатываний, когда будильник уже прозвенел. Метод GetAlarmStr мы определили для удобства. Он будет формировать строку сообщения, содержащую время и текст напоминания. Метод CheckTime проверит, пора ли выдать сигнал и если да, то сделает это.

Шаг 23. Поместите описание класса TAlarm в раздел interface модуля AlarmDetails. Затем в разделе implementation наберите текст методов

GetAlarmStr и CheckTime:

function TAlarm.GetAlarmStr: string; begin

Result := FormatDateTime('hh:mm ', DateTime) + MsgText; end;

procedure TAlarm.CheckTime; var

Hour1, Min1, Sec1, MSec1: Word; Hour2, Min2, Sec2, MSec2: Word; Match: Boolean;

begin

//Декодировать текущее время

DecodeTime(Time, Hour1, Min1, Sec1, MSec1);

//Раскодировать текущее время будильника

DecodeTime(DateTime, Hour2, Min2, Sec2, MSec2);

//Проверить, что текущее время совпадает с временем будильника case Recurring of

0:// для ежедневной периодичности

463

Match := (Hour1 = Hour2) and (Min1 = Min2); 1..7: // для еженедельной периодичности

Match := (Hour1 = Hour2) and (Min1 = Min2) and (Recurring = DayOfWeek(Date));

8:// для конкретной даты

Match := (Hour1 = Hour2) and (Min1 = Min2) and (Int(DateTime) = Date);

else

Match := False;

end;

// Решить вопрос о выдаче сигнала будильником if Match then

begin

if not Handled then // сигнал! begin

Handled := True; // предотвратить повторные срабатывания if PlaySound then Beep;

MessageDlg(GetAlarmStr, mtWarning, [mbOk], 0); end;

end else

Handled := False; // обеспечить будущие срабатывания

end;

Для правильной работы будильника метод CheckTime должен вызываться не реже одного раза в минуту. Чем чаще вызывается метод, тем меньше инерционность будильника, но тем больше пустых опросов, а значит выше загруженность операционной системы. Компромиссная частота — два раза в секунду. Так как в одну и ту же минуту метод CheckTime будет вызван несколько раз, то для избежания повторных срабатываний используется флаг Handled. Будильник выдает сообщение только в том случае, если текущее время совпадает с временем, на которое будильник установлен и при условии, что в данную минуту он еще не звенел.

Шаг 24. Давайте теперь позаботимся о передаче данных в окно диалога перед его запуском и о приеме данных после завершения. Удобнее всего, чтобы за это отвечало само окно диалога, т.е. форма AlarmDetailsForm. С этой целью определите в классе TAlarmDetilasForm два метода — GetData и SetData. Методы следует поместить в секцию public:

type

TAlarmDetailsForm = class(TForm)

...

public

procedure GetData(Alarm: TAlarm); procedure SetData(Alarm: TAlarm);

end;

В разделе implementation наберите программный текст методов:

464

procedure TAlarmDetailsForm.GetData(Alarm: TAlarm); begin

with Alarm do begin

//Получить из диалога текст сообщения будильника

MsgText := MessageEdit.Text;

//Получить из диалога время срабатывания будильника

DateTime := StrToTime(TimeMaskEdit.Text);

//Получить из диалога состояние переключателя звука

PlaySound := SoundCheckBox.Checked;

//Получить из диалога периодичность срабатывания будильника if EverydayRadioButton.Checked then

Recurring := 0

else if WeeklyRadioButton.Checked then Recurring := WeeklyComboBox.ItemIndex + 1

else { DateRadioButton.Checked } begin

Recurring := 8;

DateTime := DatePicker.Date + DateTime; end;

end;

end;

procedure TAlarmDetailsForm.SetData(Alarm: TAlarm); begin

with Alarm do begin

//Установить в окне диалога текст сообщения будильника

MessageEdit.Text := MsgText;

//Установить в окне диалога время будильника

TimeMaskEdit.Text := FormatDateTime('hh:mm', DateTime);

//Установить в окне диалога состояние переключателя звука

SoundCheckBox.Checked := PlaySound;

//Установить в окне диалога периодичность будильника

case Recurring of

0: // ежедневно

EverydayRadioButton.Checked := True; 1..7: // еженедельно

begin

WeeklyRadioButton.Checked := True; WeeklyComboBox.ItemIndex := Recurring - 1;

end;

8: // в конкретный день begin

DateRadioButton.Checked := True;

DatePicker.Date := Int(DateTime); end;

end;

end;

end;

Метод GetData просто заполняет поля переданного в параметре объекта Alarm значениями, которые установлены в компонентах окна диалога.

465

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]