Компонент ввода диапазона дат (постановка)
В большинстве случаев при построении отчета или фильтрации массива документов пользователь указывает период дат. Сейчас в Гедымине применяются два компонента ввода даты для указания начального и конечного дня периода. Предлагается реализовать простой и удобный визуальный компонент для ввода периода дат как набором с клавиатуры, так и путем выбора мышью. Минимальный период -- один день. Ввод даты окончания периода меньшей даты начала не допускается.
Компонент должен представлять собой поле ввода TEdit справа от которого расположена кнопка для вызова выпадающего окна.
Ввод периода с помощью мыши
Диапазон дат можно указать мышью в выпадающем окне следующими способами:
Выпадающее окно разделено по вертикали на две части. В левой находится список выбора режима указания периода. В зависимости от режима справа располагается:
- Год. Календарь для выбора года.
- Квартал. Календарь для выбора года и квартала.
- Месяц. Календарь для выбора года и месяца.
- Неделя. Календарь для выбора года, месяца и недели.
- День. Календарь для выбора года. месяца, дня.
- Произвольный. Два календаря для выбора первого и последнего дня периода.
- Шорт-кат. Список доступных шорт-катов.
- История. Несколько последних периодов, выбранных пользователем.
После выбора периода окно закрывается. Выпадающее окно можно закрыть без выбора периода клавишей Esc, либо кликнув мышью за его пределами.
Календарь
Воспользуемся идеями выбора даты календаря из Windows 7.
Ввод периода с помощью клавиатуры
В поле ввода пользователю предоставляется несколько вариантов ввода временного отрезка:
Самый очевидный вариант -- ввод двух дат. Например, 01.01.2009-31.12.2009. Полный формат даты -- когда указан день, месяц и год. Сокращенный -- если хотя бы одна из частей даты пропущена.
| Сокращенная дата | Единственная дата | Первый параметр | Второй параметр |
|---|---|---|---|
| Год | 1 января указанного года - 31 декабря указанного года | 1 января указанного года | 31 декабря указанного года |
| Месяц | 1-е число указанного месяца текущего года - Последнее число указанного месяца текущего года | 1-е число указанного месяца текущего года | Последнее число указанного месяца текущего года |
| День | День текущего месяца текущего года | День текущего месяца текущего года | День текущего месяца текущего года |
| Год и месяц | 1-е число указанного месяца указанного года - Последнее число указанного месяца указанного года | 1-е число указанного месяца указанного года | Последнее число указанного месяца указанного года |
| День и месяц | День указанного месяца текущего года | День указанного месяца текущего года | День указанного месяца текущего года |
| День недели | День, соответствующий указанному дню текущей недели | Указанный день текущей недели | Указанный день текущей недели |
При вводе с клавиатуры и при отображении в поле ввода мы будем поддерживать только два формата даты: dd.mm.yy и dd.mm.yyyy.
Исходное состояние: курсор попадает в поле ввода. Оно либо пустое, либо находящийся в нем текст выделяется, так что вводимые символы заменят его.
Пользователь начинает вводить цифры. Первые две введенные цифры трактуются как номер дня. После них автоматически подставляется разделитель. Пользователь может так же ввести одну только цифру и ввести разделитель самостоятельно. Аналогичным образом, следующие две цифры трактуются как номер месяца. Некорректные цифры просто не вводятся и не отображаются экране. Например, нельзя первой цифрой ввести 4, так как нет номера дня, начинающегося с 4-х.
Окончив ввод первой даты, пользователь набирает символ '-' и вводит вторую дату. Можно ввести только одну единственную дату, что будет соответствовать однодневному диапазону.
В любой момент пользователь может набрать метасимволы, при этом в поле ввода подставится и выделится соответствующий им диапазон. Сами метасимволы на экране не отображаются.
Нажатие пробела подставляет текущую дату. Обратите внимание на различие между пробелом и метасимволом "с" (сегодня). "с" подставит в поле ввода диапазон из одного дня, соответствующий сегодняшней дате, заменив им все содержимое поля ввода, тогда как пробел подставит в качестве одной из дат диапазона сегодняшнюю дату.
Поясним на примере. Пусть сегодня 5-е мая 2005 года. Тогда, введя в поле ввода строку "01.04.2004-" и нажав пробел, пользователь получит диапазон "01.04.2005-05.05.2005". Если же, ввести "01.04.2004-" и нажать "с", то содержимое поля ввода будет замещено значением "05.05.2005". Более того, в истории сохранится, что пользователь воспользовался метасимволом и при открытии окна на следующий день в поле автоматически подставится "06.05.2005".
Шорткаты
- c -- сегодня
- з -- завтра
- в -- вчера
- н -- текущая неделя
- пн -- прошлая неделя
- сн -- следующая неделя
- м -- текущий месяц
- пм -- прошлый месяц
- см -- следующий месяц
- к -- текущий квартал
- пк -- прошлый квартал
- ск -- следующий квартал
- г -- текущий год
- пг -- прошлый год
- сг -- следующий год
Распознавание шортката не должно зависеть от режима CAPS LOCK и от нажатой клавиши Shift.
Детали реализации
- Имя файла: gsPeriodEdit.pas
- Расположение: gedemin\component
Необходимо достигнуть максимального соответствия по свойствам и методам со стандартным компонентом TDateTimePicker.
Класс TgsDatePeriod(TObject)
Предназначен для хранения, представления, конвертации и манипуляции периодом дат.
Свойства
| . | |
| . |
Методы
| procedure Assign(const ASource: TgsDatePeriod) | Копирует переданный объект. |
| . |
Визуальный компонент TgsMultiCalendar
Визуальный компонент TgsCalendarEdit
- Имя класса: TgsPeriodEdit
- Родительский класс: TPanel