История переиздания | ||
---|---|---|
Издание 1.0 | 2003.11.05 |
Продолжая тему упрощения процесса создания программ, хочется поделиться с вами еще одним блоком кода, позволяющим выбирать требуемый временной период. Для этого создадим новую модальную форму frmPeriod (желательно типа TfrmModal (КГ №32)).
Добавим два элемента TDateTimePicker для выбора даты и TactionList, в котором создадим события, см. пример кода:
uses dmuImages, BS_LIB, DateUtil, StrUtils; // Функция формирования диалогового окна выбора // периода данных. True – если сделан выбор // aPeriodFrom –начало и aPeriodTo –конец периода function ChangePeriod(var aPeriodFrom, aPeriodTo:TDateTime):boolean; var oldShortDateFormat, oldLongDateFormat : String; oldDateSeparator:Char; begin oldShortDateFormat:=ShortDateFormat; oldLongDateFormat:=LongDateFormat; oldDateSeparator:=DateSeparator; ShortDateFormat:='DD/MM/YYYY'; LongDateFormat:='DD/MM/YYYY'; DateSeparator:='/'; try if Not Assigned(frmPeriod) then frmPeriod:=TfrmPeriod.Create(Application); frmPeriod.dePeriodFrom.DateTime:=aPeriodFrom; frmPeriod.dePeriodTo.DateTime:=aPeriodTo; if frmPeriod.ShowModal=mrOk then begin aPeriodFrom:=CutTime(frmPeriod.dePeriodFrom.DateTime); aPeriodTo:=CutTime(frmPeriod.dePeriodTo.DateTime); Result:=True; end else Result:=False; finally ShortDateFormat:=oldShortDateFormat; LongDateFormat:=oldLongDateFormat; DateSeparator:=oldDateSeparator; FreeAndNil(frmPeriod); end; end; //Обработка нажатия кнопки oK procedure TfrmPeriod.bbtnApplyClick(Sender: TObject); var errorStatus:boolean; begin errorStatus:=False; if frmPeriod.dePeriodFrom.DateTime > frmPeriod.dePeriodTo.DateTime then begin errorStatus:=True; frmPeriod.dePeriodFrom.DateTime:=frmPeriod.dePeriodTo.DateTime; end; if Not(errorStatus) then ModalResult:=mrOk else begin Application.ProcessMessages; frmPeriod.SetFocus; end; end;
//Нажатие кнопки «текущий день» procedure TfrmPeriod.actTodayFilterExecute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:=CutTime(Now); frmPeriod.dePeriodTo.DateTime:=CutTime(Now); end; //Нажатие кнопки «текущий месяц» procedure TfrmPeriod.actMonthFilterExecute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:=BS_FirstDayCurMonth; frmPeriod.dePeriodTo.DateTime:=BS_LastDayCurMonth; end; //Нажатие кнопки «сброс периода отбора» procedure TfrmPeriod.actFullPeriodFilterExecute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:=0; frmPeriod.dePeriodTo.DateTime:=BS_LastDayCurMonth; end; //Нажатие кнопки «предыдущий месяц» procedure TfrmPeriod.actPrevMonthExecute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:=BS_FirstDay(IncMonth(frmPeriod.dePeriodTo.DateTime,-1)); frmPeriod.dePeriodTo.DateTime:=BS_LastDay(frmPeriod.dePeriodFrom.DateTime); end; //Нажатие кнопки «следующий месяц» procedure TfrmPeriod.actNextMonthExecute(Sender: TObject); begin frmPeriod.dePeriodFrom.DateTime:=BS_FirstDay(IncMonth(frmPeriod.dePeriodTo.DateTime,1)); frmPeriod.dePeriodTo.DateTime:=BS_LastDay(frmPeriod.dePeriodFrom.DateTime); end;
Окончательным штрихом будет панель кнопок TtoolBar с привязанным к ней набором картинок компоненты TImageList. Добавим в эту панель пять кнопок для быстрого выбора заданных интервалов и кнопку подтверждения btnOk. Пример возможного дизайна диалога выбора показан на рисунке. Пример вызова данной функции достаточно тривиален:
procedure TfrmPayDoc.actPayDocSetPeriodExecute(Sender: TObject); begin if ChangePeriod(gPeriodFrom,gPeriodTo) then begin cdsPayDoc.Close; cdsPayDoc.Params[0].Value:=gPeriodFrom; cdsPayDoc.Params[1].Value:=gPeriodTo; cdsPayDoc.Open; Self.Caption:=’Платежные документы ’ + BS_GetBetweenDateCaptionStr(gPeriodFrom,gPeriodTo); end; end;
Скачать модуль bs_lib