2012-07-31 3 views
1

변환시 예외를 트래핑하지 않고 Delphi TDateTime 변수에 유효한 내용이 있는지 확인하는 방법이 있습니까?TDateTime 내용이 유효한지 확인하는 방법

필자는 TDateTime 필드가 포함 된 원시 델파이 레코드로 작성된 수백 개의 거대한 파일을 구문 분석해야하는 응용 프로그램을 작성했습니다. 때로는 내용이 2.0927117954e + 262와 같은 TDateTime 값을 가진 레코드를 얻습니다. 변환 루틴에 전달 될 때 Floating point invalid Operation 예외가 발생합니다. 나는 단순히 예외를 잡아낼 수 있지만, 디버거가 멈추지 않고 디버깅 할 때 이런 불편 함을 느낍니다. 다른 오류가 발생했을 때 계속 사용하도록하고 싶습니다.

+3

"유효한 내용"을 정의하십시오. 'TDateTime'은 기본적으로 특별한 의미를 갖는 단지'Double'입니다. 모든 가치는 기술적으로 유효합니다. 변환 루틴에서 오류가 발생하는 경우 실제 변환 루틴, 입력 값 및 오류를 표시하십시오. –

답변

10

귀하의 예제 값은 분명히 유효한 DateTime 범위 밖에 있습니다. 변환을 수행하기 전에 범위 내에 있는지 테스트 할 수 있습니다.

var 
    d: TDateTime; 
.. 

d := 2.0927117954e+262; 
if (d <= MaxDateTime) and (d >= MinDateTime) then 
    s := DateTimeToStr(d) 
else 
    .. 
4

문제가 디버거가 중지되면 나중에 Delphi 버전의 IDE에서 수정할 수 있습니다. 예외가 발생할 행 앞뒤에 두 개의 중단 점을 설정하십시오. 예 : Delphi 2007에서 첫 번째 BP의 여백 빨간색 점을 마우스 오른쪽 버튼으로 클릭하고 BreakPoint properties/Advanced/Ignore subsequent exceptions를 선택합니다. 두 번째 BP에서 '후속 예외 처리'

+0

이전에는 알지 못했습니다. 팁 고마워! – Peter

3

VCL에는이 목적을 위해 정확히 SysUtils.TryFloatToDateTime 함수가 포함되어 있으며 사용하는 것이 가장 좋은 옵션 인 것으로 나타났습니다. 델파이로 "이식"...

bool isValidDateTime(const double dt) { 
    TDateTime dummy; 
    return Sysutils::TryFloatToDateTime(dt, dummy); 
} 

쉬운 것 같다 빌더 -

내가 손에는 델파이가 없기 때문에, 여기에 C++에 대한 사용 예이다.

+0

모르겠다. * 나는 지금까지 * 최선의 선택이지만 + 1이라고 생각하지 않는다. Ctrl + 클릭으로 내 대답과 똑같은 일을하고, MinDateTime과 비교한다. 및 MaxDateTime. 그러나 내 대답은 MaxDateTime에 따라 1 씩 해제 될 수 있습니다. –

+0

@SertacAkyuz 당신의 대답은 지금까지 내가 가장 좋아하는 것이지만 기능 (나는 기본적으로 똑같은지 이미 확인했다)은 더 작고 표현이 풍부한 이름을 가지고있다. 나는 네임 스페이스'MinTimeValue'와'MaxTimeValue'가 살고있는 곳에서 우연히 발견했습니다 ... – Wolf