기술 문서

Delphi 5에서 TDateTimePicker 형식 설정

· Delphi 프로그래밍

오래된 VCL 샘플에 Delphi 5 호환성을 추가하던 중, 최신 Delphi 버전에서는 완전히 정상인 한 줄에서 프로젝트가 실패했습니다. 코드는 사용자 지정 날짜 패턴을 TDateTimePicker.Format 속성에 직접 할당하려고 했습니다.

1
DateTimePicker.Format := 'MM/dd/yyyy';

TDateTimePicker 는 Windows 공통 컨트롤을 감싼 VCL 래퍼입니다. 최신 Delphi 버전은 편리한 Format 속성을 제공하지만 Delphi 5에는 없습니다. Delphi 5와 그 이전 버전에서는 기본 공통 컨트롤 메시지를 직접 보내지 않는 한 컨트롤이 보통 Windows 지역 날짜 설정을 따릅니다.

Delphi 5에서는 공통 컨트롤 API 사용

호환성 수정은 Delphi 5에서 DateTime_SetFormatCommCtrl 유닛에서 호출하고, 최신 컴파일러에서는 직접 속성 할당을 유지하는 것입니다. Delphi 5 분기를 컴파일할 때는 CommCtrluses 절에 추가하십시오.

1
2
3
4
5
{$IFDEF D5}
DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy'));
{$ELSE}
DateTimePicker.Format := 'MM/dd/yyyy';
{$ENDIF}

실무 참고

형식 문자열은 Windows date-time picker 구문을 사용하며, Delphi의 모든 서식 토큰을 의미하지는 않습니다. 패턴은 단순하게 유지하고, 애플리케이션을 국제적으로 배포한다면 지역 설정이 다른 컴퓨터에서 테스트하십시오.

Delphi 5, Delphi 6, 최신 Delphi 릴리스에 걸쳐 공용 샘플 코드를 유지한다면 이 분기를 D5같은 컴파일러 심벌 뒤에 격리하십시오. 그러면 최신 코드를 읽기 쉽게 유지하면서도 오래된 공통 컨트롤 우회 방법을 문서화할 수 있습니다.

호환성 체크리스트

  • Delphi 5 분기에서 CommCtrl 가 필요한 위치에만 DateTime_SetFormat를 추가하십시오.
  • 폼 핸들이 아니라 picker 핸들을 전달하십시오.
  • 일반 문자열 리터럴이나 안정적인 변수를 전달해 호출 동안 형식 문자열이 살아 있게 하십시오.
  • 대상 Windows 로캘에서 표시되는 날짜를 확인하십시오.

ShortDateFormat만으로 부족한 이유

Delphi의 전역 날짜 형식 변수를 변경해도 Windows 공통 컨트롤이 뒷받침하는 date-time picker가 안정적으로 바뀌지는 않습니다. picker는 컨트롤 설정과 수신한 메시지에 따라 렌더링합니다. 그래서 DateTime_SetFormat 가 Delphi 5에 맞는 올바른 호환성 계층입니다.

이 차이는 오래된 샘플 프로젝트에서 중요합니다. 그런 프로젝트는 여러 Delphi 버전에 걸쳐 컴파일되는 경우가 많기 때문입니다. Delphi 7 또는 Delphi 2009에서는 깨끗한 한 줄이 Delphi 5에는 없을 수 있지만, Windows 공통 컨트롤 메시지는 여전히 사용할 수 있습니다. 조건부 컴파일은 각 컴파일러가 가장 자연스러운 경로를 사용하게 합니다.

이전 버전 호환성 테스트

우회 방법을 적용한 뒤에는 표시 값과 저장 값을 모두 테스트하십시오. 형식은 사용자가 보는 내용에 영향을 주지만, 계산에 사용되는 기본 TDateTime 값은 바꾸지 않아야 합니다. 이러한 분리는 표시 형식과 숫자 날짜 값이 일관되어야 하는 구매 주문, 송장, 스프레드시트 내보내기에서 중요합니다.

창 핸들을 다시 만든 뒤의 폼도 확인하십시오. 일부 VCL 컨트롤은 핸들이 파괴되고 다시 생성되면 네이티브 컨트롤 상태를 잃을 수 있습니다. 애플리케이션이 런타임에 스타일이나 부모를 바꾼다면 핸들이 사용 가능해진 뒤 형식을 적용하십시오.

장기 유지보수 참고

프로젝트가 더 이상 Delphi 5 지원을 필요로 하지 않으면 조건 분기를 제거하고 직접 Format 속성 할당만 유지하십시오. 그때까지는 호환성 코드를 관련 없는 비즈니스 로직에 숨기지 말고 컨트롤 설정 가까이에 두십시오. 그래야 이 우회 방법이 구매 주문 계산이 아니라 VCL 컨트롤 제한 때문에 존재한다는 점이 분명해집니다.