데이터베이스 디자인을 위해 델파이를 사용할 때 날짜 필드 입력이 불가피합니다. 그러나 마이크로소프트의 access 97 중국어 버전과 비교하면, 델파이 자체에서 제공하는 날짜 필드의 표시 및 입력 방법은 중국인의 습관에 적합하지 않습니다. 따라서 날짜 필드 처리를 위해 많은 솔루션이 제안되었지만 처리 결과가 표시 및 입력에서 균일하지 않습니다. 예를 들어 표시 시 "yyyy 년 mm 월 dd 일" 형식을 구현할 수 있지만 여전히 필요합니다. 입력시 외국관례에 따라 "yyyy-mm-dd"를 사용하여 입력합니다. 양식 입력; 선택 입력을 위해 TdateTimePicker를 사용하는 것은 항상 번거롭습니다. 일부 방법은 시스템의 일부 설정 속성을 수정해야 하므로 타사 컨트롤을 사용하여 시스템 속성을 조정해야 합니다. 포장되어 출시됩니다. 또한 "1999년" 및 "1999년 11월"과 같이 일반적으로 사용되는 날짜 형식은 그에 따라 처리되지 않습니다. 여기서는 내 자신의 연습을 바탕으로 날짜 필드의 표시 및 입력을 통합하기 위해 TField의 OnGetText 및 OnSetText 이벤트 조합을 사용하고 "1999" 및 "1999년 11월"과 같은 공통 날짜를 처리할 수 있습니다. 폼의 입력과 입력은 모두 Delphi에서 제공하는 이벤트를 사용하여 구현되므로 시스템 설정을 수정할 필요가 없습니다. 해당 확장 후에는 "hh 포인트 mm 분" 등과 같은 시간 표시 및 입력에도 사용할 수 있습니다. 동시에 TField의 이벤트는 TDBGrid를 사용하든 TDBEdit를 사용하든 직접 제어되므로 별도로 고려할 필요 없이 통일된 방식으로 처리할 수 있습니다. 데이터베이스가 아닌 애플리케이션의 날짜 입력에도 유사한 접근 방식을 적용할 수 있습니다.
1 기본 아이디어
TField의 EditMask 속성을 사용하여 표시 및 입력 마스크 역할을 합니다. 날짜 필드의 표시는 TField의 OnGetText 이벤트에서 처리되고, 입력 값의 유효성 판단은 OnSetText 이벤트에서 처리됩니다. 코드를 재사용하려면 OnGetText 및 OnSetText 이벤트 핸들러가 호출하는 프로시저와 함수를 별도의 단위에 넣습니다.
2 특정 구현 코드
{표시 및 판단부}
단위 DBDateEditMaskTrans;
인터페이스
용도
Windows, SysUtils, 컨트롤, 양식, Db;
{OnGetText 이벤트에서 호출되는 날짜 필드 표시 프로세스}
PRocedure DateFieldGetText(Sender: TField; var Text: String);
{OnSetText 이벤트에서 호출되는 날짜 필드 입력 판단 함수}
function DateFieldSetText(Sender: TField; const Text: String):Boolean;
구현
절차 DateFieldGetText(Sender: TField; var Text: String);
var
dDate:TDate;
w년,w월,w일:단어;
aryTestYMD:Char 배열 [1..2];{테스트 입력 마스크용 임시 배열}
iYMD:정수;
시작하다
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);
{입력 마스크에 포함된 형식을 테스트합니다.}
aryTestYMD:='연도';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=1;
aryTestYMD:='월';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=2;
aryTestYMD:='요일';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=3;
iYMD의 경우
1:{입력 마스크는 "yyyy 연도" 형식입니다.}
Text:=IntToStr(wYear)+'연도';
2: {입력 마스크는 "yyyy 년 mm 월" 형식입니다.}
Text:=IntToStr(wYear)+'연도'+IntToStr(wMonth)+'월';
3: {입력 마스크는 "yyyy 년 mm 월 dd 일" 형식입니다.}
Text:=IntToStr(wYear)+'연도'+IntToStr(wMonth)+'월' +IntToStr(wDay)+'일';
else {기본값은 "yyyy 년 mm 월 dd 일" 형식입니다.}
Text:=IntToStr(wYear)+'연도'+IntToStr(wMonth)+'월' +IntToStr(wDay)+'일';
끝;
끝;
function DateFieldSetText(Sender: TField; const Text: String):Boolean;
var
dDate:TDate;
s연도,s월,s일:문자열;
aryTestYMD:Char의 배열 [1..2];
iYMD:정수;
시작하다
{사용자가 입력한 날짜를 가져옵니다}
sYear:=Copy(텍스트,1,4);
s월:=복사(텍스트,7,2);
SDay:=복사(텍스트,11,2);
{입력 마스크에 포함된 형식을 테스트합니다.}
aryTestYMD:='연도';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=1;
aryTestYMD:='월';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=2;
aryTestYMD:='요일';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil 그런 다음
iYMD:=3;
{Try를 사용해 보세요...입력 날짜 변환을 제외하고}
노력하다
시작하다
iYMD의 경우
1: {입력 마스크는 "yyyy 연도" 형식입니다.}
시작하다
dDate:=StrToDate(sYear+'-01-01') ;{중국어 Windows의 기본 날짜 형식은 다음과 같습니다: yyyy-mm-dd.}
Sender.AsDateTime:=dDate;
끝;
2: {입력 마스크는 "yyyy 년 mm 월" 형식입니다.}
시작하다
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
끝;
3: {입력 마스크는 "yyyy 년 mm 월 dd 일" 형식입니다.}
시작하다
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
끝;
else {기본값은 "yyyy 년 mm 월 dd 일" 형식입니다.}
시작하다
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
끝;
끝;
DateFieldSetText:=참;
끝;
제외하고
{날짜 변환 오류}
시작하다
application.MessageBox(PChar(Text+'유효한 날짜가 아닙니다!'), 'Error',mb_Ok+mb_IconError);
DateFieldSetText:=거짓;
끝;
끝;
끝;
끝.
{메인 창 단위}
유닛 메인;
인터페이스
용도
…{다른 내용은 생략}
절차 Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
절차 Table1BirthdaySetText(Sender: TField; const Text: String);
사적인
{비공개 선언}
공공의
{공개 선언}
……{약간}
구현
{맞춤 단위 포함}
DBDateEditMaskTrans를 사용합니다.
{$R *.DFM}
...{그 외 공정 생략}
절차 TForm1.FormActivate(Sender: TObject);
{TField 필드 정의에 배치할 수 있는 날짜 필드의 입력 마스크를 설정합니다. }
시작하다
Table1.FieldByName('생일').EditMask:= '99-99-99;1;_';
끝;
절차 TForm1.Table1BirthdayGetText(Sender: TField; var Text: String;DisplayText: Boolean);
시작하다
DateFieldGetText(발신자,텍스트);
끝;
절차 TForm1.Table1BirthdaySetText(Sender: TField; const Text: String);
시작하다
DateFieldSetText(Sender,Text)=False인 경우
중단합니다. {변환 실패, 날짜가 잘못되었습니다.}
끝;
끝.