|
|
| Строка 1: |
Строка 1: |
| − | Стандартные бухгалтерские отчеты, многие фильтры, просто отчеты, макросы требуют ввода диапазона дат перед построением (применением, выполнением). Сейчас мы используем два компонента для ввода даты начала и даты окончания периода соответстенно. Предлагается создать компонент для ввода именно периода. В таком компоненте пользователь сможет как вводить две даты по-старому, так и использовать новые возможности сокращенного ввода. Например, введенная строка "май" соответствует периоду с 01.05 текущего года по 31.05 текущего года. Строка февраль-июнь соответствует периоду с 01.02 текущего года по 30.06 текущего года включительно.
| |
| − |
| |
| − | Кроме возможности ввода символьной информации с клавиатуры компонент должен предоставлять удобный интерфейс по выбору диапазона дат с помощью мыши из выпадающего окна.
| |
| − |
| |
| − | === Требования ===
| |
| − |
| |
| − | # Ввод единичной даты;
| |
| − | # Ввод произвольного диапазона дат;
| |
| − | # Быстрый выбор диапазона:
| |
| − | ## Год;
| |
| − | ## Полугодие;
| |
| − | ## Квартал;
| |
| − | ## Месяц;
| |
| − | ## Неделя;
| |
| − | # Быстрый ввод с клавиатуры с подстановкой текущей даты (текущего дня, месяца, года), подобно тому, как сейчас подставляются текущий день месяц и год по нажатию на клавишу пробел в [[TxDateEdit]];
| |
| − | # Использование метасимволов (см. ниже);
| |
| − | # Хранение последнего введенного значения. Причем, если был использован метосимвол, то сохранятся должен именно он, а не рассчитанные на основе его значения;
| |
| − | # Хранение истории введенных значений;
| |
| − | # Хранение последнего выбора пользователя (последней активной страницы в выпадающем окошке): ввод даты, диапазона, квартала, месяца и т.п.
| |
| − | # Возможность работы только с клавиатуры без помощи мыши;
| |
| − | # Компонент должен быть реализован ввиде автономного pas файла (группы pas файлов) и не иметь связей с кодом платформы [[Гедымин]].
| |
| − |
| |
| − | ==== Метасимволы ====
| |
| − |
| |
| − | # c -- сегодня
| |
| − | # з -- завтра
| |
| − | # в -- вчера
| |
| − | # н -- текущая неделя
| |
| − | # пн -- прошлая неделя
| |
| − | # сн -- следующая неделя
| |
| − | # м -- текущий месяц
| |
| − | # пм -- прошлый месяц
| |
| − | # см -- следующий месяц
| |
| − | # к -- текущий квартал
| |
| − | # пк -- прошлый квартал
| |
| − | # ск -- следующий квартал
| |
| − | # г -- текущий год
| |
| − | # пг -- прошлый год
| |
| − | # сг -- следующий год
| |
| − |
| |
| − | === Визуальный интерфейс ===
| |
| − |
| |
| − | Компонента должна представлять [[TPanel]] с расположенным на ней TCombobox, где в окошке редактирования производится ввод диапазона дат. Начальная дата и конечная дата разделяются символом '-'. Для ввода единичной даты, достаточно, чтобы одна из дат диапазона была пустой и отсутствовал символ разделителя дат. После клика мышкой по элементу в правой части окошка редактирования (или при помощи клавиши стрелка вниз), под окошком ввода дат должен появляться элемент [[TPageControl]] со следующими закладками:
| |
| − |
| |
| − | # История - можно просмотреть и выбрать ранее введённые пользователем данные из списка [[TListBox]].
| |
| − | # Произвольный выбор дат - можно выбрать даты диапазона из двух элементов-календарей [[TMonthCalendar]].
| |
| − | # Год - выбор года из списка TListBox.
| |
| − | # Квартал - выбора квартала по году из первой даты, если она есть. Выбирается из списка TListBox.
| |
| − | # Месяц - выбор месяца по году из первой даты, если она есть. выбирается из списка TListBox.
| |
| − | # Неделя - выбор недели по году из первой даты, если она есть. Выбирается из списка TListBox.
| |
| − |
| |
| − | === Ввод с клавиатуры ===
| |
| − |
| |
| − | При вводе с клавиатуры и при отображении в поле ввода мы будем поддерживать только два формата даты: 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".
| |
| − |
| |
| − | === Выпадающее окно ===
| |
| − |
| |
| − | Выпадающее окно будет иметь следующие вкладки:
| |
| − |
| |
| − | * История -- содержит список ранее введенных значений.
| |
| − | * Период -- содержит два календаря для выбора первого и последнего дня периода.
| |
| − | * ??? -- используется для ввода фиксированных периодов. На вкладке располагаются, слева направо:
| |
| − | ** вертикальный список с годами, выше и ниже списка находятся кнопки прокрутки. Выбранный год подсвечивается в списке.
| |
| − | ** вертикальный список кварталов.
| |
| − | ** вертикальный список месяцов.
| |
| − | ** матрица с номерами недель.
| |
| − | * Подсказка -- выводится список метасимволов с расшифровками их значений. Можно выбрать любой метасимвол и соответствующий ему диапазон подставится в поле ввода.
| |
| − |
| |
| − | Закрывается окно или щелчком мыши за его пределами, или нажатиме на кнопку Закрыть в правом нижнем углу. С клавиатуры выпадающее окно закрывается с помощью клавиши Esc, при этом возвращается прежнее значение поля ввода, или нажатием на клавишу Enter.
| |
| − |
| |
| − | === Детали реализации ===
| |
| − |
| |
| − | Начать следует с класса, отвечающего за разбор строки типа дата в различных форматах.
| |
| − |
| |
| − | Форматы:
| |
| − |
| |
| − |
| |
| − |
| |
| − |
| |
| − |
| |
| − | * Имя класса: [[TgsPeriodEdit]].
| |
| − | * Родительский класс: [[TPanel]].
| |
| − | * Имя файла: gsPeriodEdit.pas.
| |
| − | * Расположение: gedemin\component.
| |
| − |
| |
| − | ==== Свойства ====
| |
| − |
| |
| − | * AllowPeriod: Boolean -- по-умолчанию True. Если установлено, то пользователь может ввести две даты, если нет, то одну. Т.е. указывает будет ли использоваться компонент для выбора единичной даты или периода.
| |
| − | * DateBegin: TDateTime -- начало выбранного периода;
| |
| − | * DateEnd: TDateTime -- окончание выбранного периода. Если AllowPeriod=False, то DateBegin=DateEnd.
| |
| − | * TodayOnStart: Boolean -- по-умолчанию False. Если установлено, то при первом отображении компонента в нем устанавливается текущая дата или период соответствующий одному текущему дню.
| |
| | | | |
| | [[Category:Постановка]] | | [[Category:Постановка]] |