Распечатать страницу

Ввод даты в Microsoft Visual FoxPro

« Назад

Кнопка , находящаяся справа от поля InputDate рассматриваемой формы, а точнее обработчик события Click этой кнопки открывает форму Ole-календаря, приспособленного для выбора даты (рис. 2.21).

14.1.-Выбор-даты-в-Ole-календаре

Рис. 2.21. Выбор даты в Ole-календаре

При открытии календаря в нем устанавливается либо значение InputDate.Value, либо текущая дата, если это значение пустое. Выбранная в календаре дата возвращается передаваемым по ссылке параметром selectedDate и устанавливается в качестве значения свойства Value поля InputDate формы AuthorEdit.

&& Обработчик события Click кнопки

&&

local selectedDate

do (appPath + 'Prgs\OleCalendar') with ThisForm.InputDate.Value, selectedDate

if not Empty(selectedDate) then

ThisForm.InputDate.Value = selectedDate

endif

В файле OleCalendar.prg создается форма, в которую добавлены объект oCln класса OleCalendar и две кнопки – "Дата" и "Закрыть".

Класс OleCalendar строится на базе класса OleControl, имя которого содержит свойство OleClass. Выбранная дата фиксируется тремя свойствами объекта oCln – Year, Month и Day, возвращающими соответственно год, месяц и день выбранной даты.

parameters InDate, selectedDate

&&

clndForm = CreateObject("CalendarForm")

&&

SetProp(clndForm)             && Устанавливаем свойства объектов

&&

clndForm.Show(1)              && Показываем форму календаря модально

&& Устанавливает свойства формы и ее элементов управления

&&

procedure SetProp(clndForm)

with clndForm

Autocenter = .T.

oShowDate.Left = clndForm.oCln.Width + 10

oClose.Left = .oShowDate.Left

oClose.Top = .oShowDate.Top + 32

Width = .oShowDate.Left + .oShowDate.Width + 10

Height = .oCln.Height + 10

if not Empty(InDate) then

with .oCln

Year = Year(InDate)

Month = Month(InDate)

Day = Day(InDate)

endWith

endif

endWith

endProc

define class CalendarForm as Form

&& Календарь

Caption = "Выбор даты"

add object oCln as OleCalendar

&& Кнопки "Дата" и "Закрыть"

add object oShowDate as cmdShowDate

add object oClose as cmdClose

endDefine

define class OleCalendar as OleControl

&& Определяем значение свойства OleClass

OleClass = "MSComCtl2.MonthView.2"

&& Размеры календаря

Height = 200

Width = 200

endDefine

&& Определяем 2 класса для задания кнопок

define class cmdShowDate as CommandButton

Caption = "Выбрать"

Width = 84

Height = 27

Top = 10

&&

&& Формирует и показывает дату, используя значения свойств

&& Year, Month и Day объекта oCln класса OleCalendar

procedure Click

with ThisForm.oCln

selectedDate = Date(.Year, .Month, .Day)

endWith

ThisForm.Release

endProc

endDefine

define class cmdClose as CommandButton

Caption = "Отказ"

Width = 84

Height = 27

procedure Click

endProc

endDefine

Замечания:

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

2. Вопросы, связанные с выбором времени, обсуждаются в разд. 3.9.10.

Форму календаря можно открыть немодально:

clndForm.Show(0)              && Показываем форму календаря немодально

read events                          && Начинаем обработку событий

Тогда в определение класса CalendarForm следует добавить обработчик события Unload:

procedure Unload

clear events                         && Завершаем обработку событий

endProc

При этом не нужно забывать, что может быть активной только одна команда READ EVENTS.