При использовании Delphi для проектирования базы данных неизбежно приходится вводить поля даты. Однако по сравнению с китайской версией Microsoft Access 97 методы отображения и ввода полей даты, предоставляемые самой Delphi, не соответствуют привычкам китайцев. Поэтому было предложено много решений для обработки полей даты, но результаты обработки не являются одинаковыми при отображении и вводе. Например, формат «гггг год мм месяц дд день» можно реализовать при отображении, но он все равно необходим. для ввода при вводе Используйте «гггг-мм-дд» в соответствии с зарубежными обычаями. Ввод в форму всегда затруднителен для использования TdateTimePicker для ввода выбора; некоторые методы также требуют изменения некоторых свойств настройки системы, поэтому свойства системы необходимо корректировать при публикации программного обеспечения с использованием сторонних элементов управления. упакован и выпущен. Более того, обычно используемые форматы дат, такие как «1999» и «Ноябрь 1999», не обрабатываются соответствующим образом. Здесь, основываясь на моей собственной практике, я использую комбинацию событий TField OnGetText и OnSetText, чтобы добиться унификации отображения и ввода полей даты, и могу обрабатывать наши общие даты, такие как «1999» и «Ноябрь 1999». и ввод форм реализуются с использованием событий, предоставляемых Delphi, и нет необходимости изменять какие-либо системные настройки. После соответствующего расширения его также можно использовать для отображения и ввода времени, например «чч точка мм минута» и т. д. В то же время, поскольку события TField управляются напрямую, будь то с помощью TDBGrid или TDBEdit, их можно обрабатывать унифицированно, без необходимости рассматривать их отдельно. Аналогичный подход можно применить и для ввода данных в приложениях, не связанных с базами данных.
1 Основная идея
Используйте свойство EditMask объекта TField, которое будет служить одновременно маской отображения и ввода. Отображение поля даты обрабатывается в событии OnGetText TField, а оценка достоверности входного значения обрабатывается в событии OnSetText. Чтобы повторно использовать код, вынесите процедуры и функции, вызываемые обработчиками событий OnGetText и OnSetText, в отдельный модуль.
2 Конкретный код реализации
{Блок отображения и оценки}
модуль DBDateEditMaskTrans;
интерфейс
использует
Windows, SysUtils, элементы управления, формы, БД;
{Процесс отображения поля даты, вызываемый в событии OnGetText}
PROcedure DateFieldGetText (Отправитель: TField; var Text: String);
{Функция оценки ввода поля даты, вызываемая в событии OnSetText}
функция DateFieldSetText (Отправитель: TField; const Text: String): Boolean;
выполнение
процедура DateFieldGetText (Отправитель: TField; var Text: String);
вар
дДата: ТДата;
вГод,вМесяц,вДень:Слово;
aryTestYMD:Array [1..2] of Char;{Временный массив для маски тестового ввода}
iYMD: целое число;
начинать
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
{Проверьте формат, содержащийся в маске ввода.}
aryTestYMD:='год';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=1;
aryTestYMD:='месяц';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=2;
aryTestYMD:='День';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=3;
дело iYMD
1:{Маска ввода имеет формат «гггг год».}
Текст:=IntToStr(wYear)+'год';
2: {Маска ввода имеет формат «гггг год мм месяц».}
Текст:=IntToStr(wYear)+'год'+IntToStr(wMonth)+'месяц';
3: {Маска ввода имеет формат «гггг год мм месяц дд день».}
Текст:=IntToStr(wYear)+'год'+IntToStr(wMonth)+'месяц' +IntToStr(wDay)+'день';
else {По умолчанию: формат «гггг год мм месяц дд день».}
Текст:=IntToStr(wYear)+'год'+IntToStr(wMonth)+'месяц' +IntToStr(wDay)+'день';
конец;
конец;
функция DateFieldSetText (Отправитель: TField; const Text: String): Boolean;
вар
дДата: ТДата;
сГод, сМесяц, сДень:Строка;
aryTestYMD: Массив [1..2] символов;
iYMD: целое число;
начинать
{Получить дату, введенную пользователем}
sYear:=Копировать(Текст,1,4);
sMonth:=Копировать(Текст,7,2);
SDay:=Копировать(Текст,11,2);
{Проверьте формат, содержащийся в маске ввода.}
aryTestYMD:='год';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=1;
aryTestYMD:='месяц';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=2;
aryTestYMD:='День';
если StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil, тогда
яГМД:=3;
{Используйте Try...кроме для преобразования входной даты}
пытаться
начинать
дело iYMD
1: {Маска ввода имеет формат «гггг год».}
начинать
dDate:=StrToDate(sYear+'-01-01') ;{Формат даты по умолчанию в китайской Windows: гггг-мм-дд. То же самое ниже}.
Sender.AsDateTime:=dDate;
конец;
2: {Маска ввода имеет формат «гггг год мм месяц».}
начинать
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
конец;
3: {Маска ввода имеет формат «гггг год мм месяц дд день».}
начинать
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
конец;
else {По умолчанию: формат «гггг год мм месяц дд день».}
начинать
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
конец;
конец;
DateFieldSetText:=Истина;
конец;
кроме
{Ошибка преобразования даты}
начинать
application.MessageBox(PChar(Text+'Недопустимая дата!'), 'Ошибка',mb_Ok+mb_IconError);
DateFieldSetText:=False;
конец;
конец;
конец;
конец.
{блок главного окна}
блок Главный;
интерфейс
использует
…{опустить другой контент}
процедура Table1BirthdayGetText (Отправитель: TField; var Text: String; DisplayText: Boolean);
процедура Table1BirthdaySetText (Отправитель: TField; const Text: String);
частный
{Частные заявления}
общественный
{Публичные заявления}
……{немного}
выполнение
{Включить специальные единицы}
использует DBDateEditMaskTrans;
{$R *.DFM}
...{Другие процессы опущены}
процедура TForm1.FormActivate(Отправитель: TObject);
{Установите маску ввода поля даты, которую можно поместить в определение поля TField. }
начинать
Table1.FieldByName('День рождения').EditMask:= '99-99-99;1;_';
конец;
процедура TForm1.Table1BirthdayGetText (Отправитель: TField; var Text: String; DisplayText: Boolean);
начинать
DateFieldGetText (Отправитель, Текст);
конец;
процедура TForm1.Table1BirthdaySetText(Отправитель: TField; const Text: String);
начинать
если DateFieldSetText(Sender,Text)=False, то
Прервать {Преобразование не удалось, дата недопустима};
конец;
конец.