Практическое занятие 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;