Практическое занятие 10
Тема: "Работа с данными в формате дата/время. Использование компонентов для работы с датами"
Цель работы: получить практические навыки по использованию функций для работы с датой/временем. Отработать навыки использования компонентов для работы с датами.
Ход работы
Создайте учебную форму для проверки возможностей работы с датами и временем.

Указания: для формы задайте свойства: Caption='Работа с датами', BorderStyle=bsSingle, BorderIcom-biMaximized=false, Position=poDesktopCenter.
Процесс создания содержимого формы разобьем на несколько простых шагов, указанных ниже.
Создать форму с панелью инструментов, у которой в правой части отображается текущая дата и время
![]()
Указания: Нанесите на форму компонент Statusbar (Win32). Двойным щелчком откройте окно панелей компонента и с помощью первой кнопки на панели инструментов создайте две панели. Выделите первую панель и задайте свойство Width таким, чтобы вторая панель имела ширину, показанную на рисунке.
Для работы с датами и временем подключите модуль DateUtils.
В событии OnCreate формы напишем команду отображения текущей даты.
procedure TForm1.FormCreate(Sender: TObject);
//переменная для хранения текущей даты
var a:TDateTime;
begin
//получаем текущую дату
a:=now;
//отображаем день недели, дату и время
StatusBar1.Panels[1].Text:='Сегодня: '+FormatDateTime('dddd',a)+
' '+datetostr(a)+' '+timetostr(a);
end;
Время должно обновляться каждую секунду. Для этого нанесите на форму компонент Timer (System). В его событии OnTimer введите тот же код, что был введен ранее.
На панели разместить два выпадающих поля с календарем для задания диапазона поиска данных. При этом первый календарь по умолчанию отображает первое число текущего месяца, а второй - текущую дату.

Указания: нанесите на форму компонент Panel и задайте свойство Caption='Задание 1 (поиск)'. На панели разместите два компонента DataTimePicker (Win32). Для отображения в компонентах значений, указанных в задании в событие OnCreate формы добавьте команды:
//в первом поле генерируем первое число текущего месяца
//параметры функции encodedate: текущий год, месяц текущей даты, 1-первое число)
datetimepicker1.Date:=encodedate(currentyear,monthof(date),1);
//во втором поле генерирует текущую дату
datetimepicker2.Date:=date;
Пусть имеется текстовый файл, в котором записаны некоторые показатели в формате
дата число1 число2 число3
Необходимо реализовать функцию, при которой в поле Memo выдаются только те данные из файла, даты которых попадают в заданный диапазон.
Указания: В текстовом редакторе создайте такой файл и сохраните на диске. На панели разместите компонент Memo (Standard) и очистите свойство Lines.
Внизу разместите две кнопки Button (Standard) и в свойстве Caption задайте надписи на них.
Для открытия текстового файла нанесите на форму компонент OpenDialog (Dialogs) и задайте свойство Filter=Текстовые файлы|*.txt.
Для первой кнопки напишем код:
procedure TForm1.Button1Click(Sender: TObject);
var t:tstringlist;
//переменная для работы с файлом
i:integer;
begin
//если начало диапазона дат больше конца, то конец процедуры
if datetimepicker1.date>datetimepicker2.Date then exit;
//если файл для поиска не выбран, то конец процедуры
if not opendialog1.Execute then exit;
//создаем класс для работы с файлом
t:=tstringlist.create;
//очищаем поле Memo
memo1.Lines.Clear;
//загружаем файл в класс
t.loadfromfile(opendialog1.FileName);
//цикл по всем строкам файла в классе
for i:=0 to t.count-1 do
begin
//если дата в строке больше начала диапазона
//и меньше конца диапазона
if(strtodate(copy(t.strings[i],1,10))>=datetimepicker1.Date)
and(strtodate(copy(t.strings[i],1,10))>=datetimepicker2.Date) then
//добавляем эту строку в поле Memo
memo1.Lines.add(t.strings[i]);
end;
//удаляем класс из памяти
t.Free;
end;
Для второй кнопки напишите код:
procedure TForm1.Button2Click(Sender: TObject);
begin
//очищаем поле Memo
memo1.Lines.Clear;
//даты выставляем в начальное значение
datetimepicker1.Date:=encodedate(currentyear,monthof(date),1);
datetimepicker2.Date:=date;
//первую дату делаем активной
datetimepicker1.SetFocus;
end;
Создайте панель для вычисления диапазона даты/времени.

Указания: нанесите на форму компонент Panel и задайте свойство Caption='Задание 2 (диапазоны)'. На панели разместите два компонента DataTimePicker (Win32). Как и ранее, в первом поле отобразим первый день текущего месяца, а во втром - текущую дату. Для этого в событие OnCreate формы добавьте команды:
//в третьем поле генерируем первое число текущего месяца
//параметры функции encodedate: текущий год, месяц текущей даты, 1-первое число)
datetimepicker3.Date:=encodedate(currentyear,monthof(date),1);
//во четвертом поле генерирует текущую дату
datetimepicker4.Date:=date;
Ниже разместите компонент RadioGroup (Standard) и в свойстве Items введите названия переключателей. Для задания активным первого переключателя задайте свойство ItemIndex=0.
Разместите текстовое поле Edit (Standard) для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.
Разместите кнопку Button (Standard). В свойстве Caption укажите надпись на кнопке.
Для кнопки введите код:
procedure TForm1.Button3Click(Sender: TObject);
begin
//если начальная дата превышает конечную, то конец процедуры
if datetimepicker3.Date>datetimepicker4.Date then exit;
//проверяем выбранный переключатель
case radiogroup1.ItemIndex of
//если диапазон дней, то функция daysbetween
0: edit1.Text:=floattostr(daysbetween(datetimepicker3.Date,datetimepicker4.date));
//если диапазон часов, то функция hoursbetween
1: edit1.Text:=floattostr(hoursbetween(datetimepicker3.Date,datetimepicker4.date));
//если диапазон минут, то функция minutesbetween
2: edit1.Text:=floattostr(minutesbetween(datetimepicker3.Date,datetimepicker4.date));
end;
end;
Реализуйте возможность изменения даты на указанное количество лет, месяцев или дней. При этом результат выводится в форматах для разных СУБД.

Указания: нанесите на форму компонент Panel и задайте свойство Caption='Задание 3 (расчет)'. На панели разместите компонент DataTimePicker (Win32). Для отображения в нем текущей даты в событие OnCreate формы добавьте команду:
datetimepicker5.Date:=date;
Разместите текстовое поле Edit (Standard) для ввода значения изменения даты. Очистите свойство Text.
Ниже разместите компонент RadioGroup (Standard) и в свойстве Items введите названия переключателей. Для задания активным первого переключателя задайте свойство ItemIndex=0.
Рядом разместите еще один компонент RadioGroup (Standard) и в свойстве Items введите названия форматов вывода. Для задания активным первого переключателя задайте свойство ItemIndex=0.
Разместите текстовое поле Edit (Standard) для отображения результата. Задайте свойства: ReadOnly=true, Text очистить.
Разместите кнопку Button (Standard). В свойстве Caption укажите надпись на кнопке.
Для кнопки введите код:
procedure TForm1.Button4Click(Sender: TObject);
//переменная для работы с датой
var d:tdatetime;
begin
//проверяем выбранный вид расчета
case radiogroup2.ItemIndex of
//если считаем по годам, то функция incyear
0: d:=incyear(datetimepicker5.Date,strtoint(edit2.Text));
//если считаем по месяцам, то функция incmonth
1: d:=incmonth(datetimepicker5.Date,strtoint(edit2.Text));
//если считаем по дням, то функция incday
2: d:=incday(datetimepicker5.Date,strtoint(edit2.Text));
end;
//проверяем формат вывода
case radiogroup3.ItemIndex of
//если обычный формат, то dd.mm.yyyy
0: edit3.Text:=formatdatetime('dd.mm.yyyy',d);
//если формат #mm/dd/yyyy#
//символ /
является символом маски, поэтому для его отображения
//маскируем
символ двойными кавычками
1: edit3.Text:=formatdatetime('#mm"/"dd"/"yyyy#',d);
//если формат MySQL, то mm—dd-yyyy
2: edit3.Text:=formatdatetime('mm-dd-yyyy',d);
end;
end;