...
...

Секреты Delphi. Отбор данных за период

Секреты Delphi. Отбор данных за период

Продолжая тему упрощения процесса создания программ, хочется поделиться с вами еще одним блоком кода, позволяющим выбирать требуемый временной период.

Для этого создадим новую модальную форму frmPeriod (желательно типа TfrmModal (КГ №32)). Добавим два элемента TDateTimePicker для выбора даты и TactionList, в котором создадим события (см. пример кода). Модуль bs_lib.pas можно скачать по адресу: http://bs_elbis.at.tut.by/downloads/bs_lib.zip .

uses dmuImages, BS_LIB, DateUtil, StrUtils; // Функция формирования диалогового окна выбора пе
риода данных. True — если сделан выбор aPeriodFrom — начало, и aPeriodTo — конец периода function Ch
angePeriod(var aPeriodFrom, aPeriodTo:TDateTime):boolean; var oldShortDateFormat, oldLongDateFor-mat
 : String; oldDateSeparator:Char; begin oldShortDateFormat:=ShortDateFormat; oldLongDateFormat:=Long
DateFormat; oldDateSeparator:=DateSeparator; ShortDateFormat:='DD/MM/YYYY'; LongDateFormat:='DD/MM/Y
YYY'; DateSeparator:='/'; try if Not Assigned(frmPeriod) then frmPeriod:=TfrmPeriod.Create (Applicat
ion); frmPeriod.dePeriodFrom.DateTime:= aPeriodFrom; frmPeriod.dePeriodTo.DateTime:= aPeriodTo; if f
rmPeriod.ShowModal=mrOk then begin aPeriodFrom:=CutTime(frmPeriod. dePeriodFrom.DateTime); aPeriodTo
:=CutTime(frmPeriod. dePeriodTo.DateTime); Result:=True; end else Result:=False; finally ShortDateFo
rmat:=oldShortDateFormat; LongDateFormat:=oldLongDateFormat; DateSeparator:=oldDateSeparator; FreeAn
dNil(frmPeriod); end; end; //Обработка нажатия кнопки OK procedure TfrmPeriod.bbtnApplyClick (Sender
: TObject); var errorStatus:boolean; begin errorStatus:=False; if frmPeriod.dePeriodFrom.DateTime &g
t; frmPeriod.dePeriodTo.DateTime then begin errorStatus:=True; frmPeriod.dePeriodFrom.Date Time:=frm
Period.dePeriodTo.DateTime; end; if Not(errorStatus) then ModalResult:=mrOk else begin Application.P
rocessMessages; frmPeriod.SetFocus; end; end; //Нажатие кнопки "текущий день" procedure Tf
rmPeriod.actTodayFilter Execute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:= CutTime(No
w); frmPeriod.dePeriodTo.DateTime:= CutTime(Now); end; //Нажатие кнопки "текущий месяц" pr
ocedure TfrmPeriod.actMonthFilter Execute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:= 
BS_FirstDayCurMonth; frmPeriod.dePeriodTo.DateTime:= BS_LastDayCurMonth; end; //Нажатие кнопки "
;сброс периода отбора" procedure TfrmPeriod.actFullPeriod FilterExecute(Sender: TObject); begin
 frmPeriod.dePeriodFrom.DateTime:=0; frmPeriod.dePeriodTo.DateTime:= BS_LastDayCurMonth; end; //Нажа
тие кнопки "предыдущий месяц" procedure TfrmPeriod.actPrevMonthExe-cute(Sender: TObject); 
begin frmPeriod.dePeriodFrom.DateTime:=BS_ FirstDay(IncMonth(frmPeriod.dePeriodTo. DateTime,-1)); fr
mPeriod.dePeriodTo.DateTime:=BS_ Last Day(frmPeriod.dePeriodFrom.DateTime); end; //Нажатие кнопки &q
uot;следующий месяц" procedure TfrmPeriod.actNextMonth Execute(Sender: TObject); begin frmPerio
d.dePeriodFrom.DateTime:=BS_ FirstDay(IncMonth(frmPeriod.dePeriodTo. DateTime,1)); frmPeriod.dePerio
dTo.DateTime:=BS_ LastDay(frmPeriod.dePeriodFrom.DateTime); end;
Окончательным штрихом будет панель кнопок TtoolBar с привязанным к ней набором картинок компоненты TImageList. Добавим в эту панель пять кнопок для быстрого выбора заданных интервалов и кнопку подтверждения btnOk. Пример возможного дизайна диалога выбора показан на рисунке. Пример вызова данной функции достаточно тривиален:

procedure TfrmPayDoc.actPayDocSetPeriodExecute(Sender: TObject); begin if ChangePeriod(gPeriod
From,gPeriod To) then begin cdsPayDoc.Close; cdsPayDoc.Params[0].Value:=gPe-riodFrom; cdsPayDoc.Para
ms[1].Value:=gPe-riodTo; cdsPayDoc.Open; Self.Caption:='Платежные документы' + BS_GetBetweenDateCapt
ionStr (gPeriodFrom,gPeriodTo); end; end;

Сергей Бердачук,
Berdachuk@tochka.by



© Компьютерная газета

полезные ссылки
Аренда ноутбуков
Ремонт ноутбуков в центре Минска