// SimpleDate.cpp: implementation of the CSimpleDate class. // // Most of the date alogrithms used in this class can be found at // http://www.capecod.net/~pbaum/date/date0.htm ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "SimpleDate.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #pragma message( "Compiling " __FILE__ ) #pragma message( "Last modified on " __TIMESTAMP__ ) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// static int monthtotals[]= { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 } ; static char* daysofweek[] = { { "Sun" }, { "Mon" }, { "Tue" }, { "Wed" }, { "Thu" }, { "Fri" }, { "Sat" }, } ; static char* days_of_week[] = { { "Sunday" }, { "Monday" }, { "Tuesday" }, { "Wednesday" }, { "Thursday" }, { "Friday" }, { "Saturday" }, } ; static char* monthsofyear[] = { { "" }, { "Jan" }, { "Feb" }, { "Mar" }, { "Apr" }, { "May" }, { "Jun" }, { "Jul" }, { "Aug" }, { "Sep" }, { "Oct" }, { "Nov" }, { "Dec" }, } ; static char* months_of_year[] = { { "" }, { "January" }, { "February" }, { "March" }, { "April" }, { "May" }, { "June" }, { "July" }, { "August" }, { "September" }, { "October" }, { "November" }, { "December" }, } ; //-------------------------------------------------------------------- // Function name : CSimpleDate::CSimpleDate // Description : Simple Constructor object is set to todays date // Return type : //-------------------------------------------------------------------- CSimpleDate::CSimpleDate(int FormatType) { m_Format=FormatType; SetToday(); m_JulianDate=ConvertToJulian(); SetTime(); } //-------------------------------------------------------------------- // Function name : CSimpleDate::CSimpleDate // Description : paramaterized constructor object is set to date in string. Parsing will be done based on formattype // Return type : // Argument : LPCSTR DateString //-------------------------------------------------------------------- CSimpleDate::CSimpleDate(LPCSTR DateString,int FormatType) { m_Format=FormatType; ParseDateString(DateString); m_JulianDate=ConvertToJulian(); SetTime(); } //-------------------------------------------------------------------- // Function name : CSimpleDate::CSimpleDate // Description : // Return type : // Argument : long JD // Argument : int FormatType //-------------------------------------------------------------------- CSimpleDate::CSimpleDate(long JD,int FormatType) { m_Format=FormatType; m_JulianDate=JD; ConvertFromJulian(); // note: m_JulianDate must be set prior to this call SetTime(); } //added constructor JC 10/05/00 CSimpleDate::CSimpleDate( int month,int day,int year,int FormatType) { m_Format=FormatType; m_JulianDate=ConvertToJulian( month, day, year); //// Added initialization ///// m_Year=year; m_Month=month; m_Day=day; ////////////////////////////// SetTime(); } //-------------------------------------------------------------------- // Function name : CSimpleDate::~CSimpleDate // Description : // Return type : //-------------------------------------------------------------------- CSimpleDate::~CSimpleDate() { } //-------------------------------------------------------------------- // Function name : CSimpleDate::SetToday // Description : // Return type : BOOL //-------------------------------------------------------------------- BOOL CSimpleDate::SetToday() { long time_val ; struct tm *tm_ptr ; time( (time_t *)&time_val ) ; tm_ptr = localtime( (time_t *)&time_val ) ; m_Year=1900 + tm_ptr->tm_year; m_Month=tm_ptr->tm_mon + 1; m_Day=tm_ptr->tm_mday; return TRUE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::IsValid // Description : Hope that this is right and Y2K OK // Return type : BOOL //-------------------------------------------------------------------- BOOL CSimpleDate::IsValid() { int is_leap, month_days ; is_leap = ( m_Year%4 == 0 && m_Year%100 != 0 || m_Year%400 == 0 ) ? 1 : 0 ; if(m_Month > 12 || m_Day > 31) return FALSE; month_days = monthtotals[ m_Month+1 ] - monthtotals[ m_Month] ; if ( m_Month == 2 ) month_days += is_leap ; if ( m_Year < 0 || m_Month < 1 || m_Month > 12 || m_Day < 1 || m_Day > month_days ) return FALSE ; return TRUE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::ParseDateString // Description : // Return type : BOOL // Argument : LPCSTR TheDate //-------------------------------------------------------------------- BOOL CSimpleDate::ParseDateString(LPCSTR TheDate) { ParseDateString(TheDate,m_Month,m_Day,m_Year); return TRUE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::ParseDateString // Description : See CParseIt class in Parseit.cpp for details // Return type : BOOL // Argument : LPCSTR date // Argument : int& m // Argument : int& d // Argument : int& y //-------------------------------------------------------------------- BOOL CSimpleDate::ParseDateString(LPCSTR date,int& m,int& d,int& y) { CParseIt ParseIt(date,"/.-"); ParseIt.Parse(); int one,two,three; one=two=three=0; int N=ParseIt.GetNumFields(); one=(int)ParseIt.GetField(1); if(N > 1) two=(int)ParseIt.GetField(2); if(N > 2) three=(int)ParseIt.GetField(3); switch(m_Format) { case MMDDYY: m=one;d=two;y=three; if(y < 100) // ajust two digit year to the range of 1900-1999 y+=1900; break; case DDMMYY: d=one;m=two;y=three; if(y < 100) y+=1900; break; case YYMMDD: y=one;m=two;d=three; if(y < 100) y+=1900; break; case MMDDYYYY: m=one;d=two;y=three; if(y < 100) y+=1900; break; case DDMMYYYY: d=one;m=two;y=three; if(y < 100) y+=1900; break; case YYYYMMDD: y=one;m=two;d=three; if(y < 100) y+=1900; break; default: m=y=d=0; } return TRUE; } //-------------------------------------------------------------------- // JULIAN DATE CONVERSION BELOW //-------------------------------------------------------------------- // Function name : CSimpleDate::ConvertToJulian // Description : // Return type : long //-------------------------------------------------------------------- long CSimpleDate::ConvertToJulian() { return ConvertToJulian(m_Month,m_Day,m_Year); } //-------------------------------------------------------------------- // Function name : CSimpleDate::ConvertToJulian // Description : go to http://www.capecod.net/~pbaum/date/date0.htm for details // Return type : long // Argument : int month // Argument : int day // Argument : int year //-------------------------------------------------------------------- long CSimpleDate::ConvertToJulian( int m,int d,int y) { if(m < 3) { m = m + 12; y=y-1 ; } long jd = d + (153 * m - 457) / 5 + 365 * y + (y / 4) - (y / 100) + (y / 400) + 1721119; return jd; } //-------------------------------------------------------------------- // Function name : CSimpleDate::ConvertFromJulian // Description : // Return type : void //-------------------------------------------------------------------- void CSimpleDate::ConvertFromJulian() { ConvertFromJulian(m_Month,m_Day,m_Year); } //-------------------------------------------------------------------- // Function name : CSimpleDate::ConvertFromJulian // Description : goto http://www.capecod.net/~pbaum/date/date0.htm for details // Return type : void // Argument : int Month // Argument : int DAy // Argument : int Year //-------------------------------------------------------------------- void CSimpleDate::ConvertFromJulian(int& Month,int& Day,int& Year) { long L = m_JulianDate + 68569; long N = (long) ((4*L)/146097) ; L = L - ((long)((146097 * N + 3)/4) ); long I = (long) ((4000 *(L + 1)/1461001)) ; L = L - (long)((1461*I)/4) + 31; long J = (long)((80*L)/2447); Day = L - (long)((2447*J)/80); L=(long)(J/11) ; Month = J + 2 - 12*L; Year = 100*(N-49) + I + L ; } //-------------------------------------------------------------------- // JULIAN DATE CONVERSION ABOVE //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Function name : CSimpleDate::GetDayOfWeek // Description : goto http://www.capecod.net/~pbaum/date/date0.htm for details // Return type : int //-------------------------------------------------------------------- int CSimpleDate::GetDayOfWeek() { if(!IsValid()) return 0; int res= ((int) (m_JulianDate + 1.5)) % 7; return res; } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetFullDateString // Description : // Return type : LPCSTR //-------------------------------------------------------------------- LPCSTR CSimpleDate::GetFullDateString() { if(!IsValid()) return NULL; m_DateString.Format("%s %s %02d %04d", daysofweek[GetDayOfWeek()],monthsofyear[m_Month],m_Day,m_Year); return m_DateString; } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetFullDateStringLong // Description : // Return type : LPCSTR //-------------------------------------------------------------------- LPCSTR CSimpleDate::GetFullDateStringLong() { if(!IsValid()) return NULL; m_DateString.Format("%s %s %02d %04d", days_of_week[GetDayOfWeek()],months_of_year[m_Month],m_Day,m_Year); return m_DateString; } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetJulianDate // Description : // Return type : long //-------------------------------------------------------------------- long CSimpleDate::GetJulianDate() { if(!IsValid()) return 0L; return m_JulianDate; } //-------------------------------------------------------------------- // overloaded operators and copy constructors here //-------------------------------------------------------------------- // Function name : LPCSTR // Description : // Return type : CSimpleDate::operator return LPCSTR //-------------------------------------------------------------------- CSimpleDate::operator LPCSTR() { if(!IsValid()) return (LPCSTR)0; switch(m_Format) { case MMDDYY: m_DateString.Format("%02d/%02d/%02d",m_Month,m_Day,m_Year > 99 ? m_Year-1900:m_Year); return (LPCSTR)m_DateString; case DDMMYY: m_DateString.Format("%02d/%02d/%02d",m_Day,m_Month,m_Year > 99 ? m_Year-1900:m_Year); return (LPCSTR)m_DateString; case YYMMDD: m_DateString.Format("%02d/%02d/%02d",m_Year > 99 ? m_Year-1900:m_Year,m_Month,m_Day); return (LPCSTR)m_DateString; case MMDDYYYY: m_DateString.Format("%02d/%02d/%04d",m_Month,m_Day,m_Year ); return (LPCSTR)m_DateString; case DDMMYYYY: m_DateString.Format("%02d/%02d/%04d",m_Day,m_Month,m_Year); return (LPCSTR)m_DateString; case YYYYMMDD: m_DateString.Format("%04d/%02d/%02d",m_Year ,m_Month,m_Day); return (LPCSTR)m_DateString; default: return (LPCSTR)NULL; } } //-------------------------------------------------------------------- // OPERATORS //-------------------------------------------------------------------- // Function name : long // Description : // Return type : CSimpleDate::operator return long //-------------------------------------------------------------------- CSimpleDate::operator long() { if(!IsValid()) return 0L; return m_JulianDate; } //-------------------------------------------------------------------- // Function name : = // Description : // Return type : CSimpleDate::operator //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::operator =(const CSimpleDate& Date) { if(*this==Date) return *this; // self assignment m_Year=Date.m_Year; m_Month=Date.m_Month; m_Day=Date.m_Day; m_JulianDate=Date.m_JulianDate; m_Format=Date.m_Format; return *this; } //-------------------------------------------------------------------- // Function name : = // Description : // Return type : CSimpleDate::operator //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::operator =(LPCSTR Date) { ParseDateString(Date); m_JulianDate=ConvertToJulian(); return *this; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator > (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate > Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator >= (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate >= Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator < (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate < Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator <= (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate <= Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator == (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate == Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator != (const CSimpleDate& Date) { if(!IsValid()) return FALSE; return m_JulianDate != Date.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator > (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate > TheDate.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator < (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate < TheDate.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator >= (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate >= TheDate.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator <= (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate <= TheDate.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator == (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate == TheDate.m_JulianDate; } //-------------------------------------------------------------------- BOOL CSimpleDate::operator != (LPCSTR Date) { if(!IsValid()) return FALSE; CSimpleDate TheDate(Date); if(!TheDate.IsValid()) return FALSE; return m_JulianDate != TheDate.m_JulianDate; } //-------------------------------------------------------------------- // Date Math routines //-------------------------------------------------------------------- // Function name : CSimpleDate::YearsOld // Description : // Return type : int //-------------------------------------------------------------------- int CSimpleDate::YearsOld() { if(!IsValid()) return 0; CSimpleDate ToDay; if(ToDay <= *this) return 0; long t=ToDay.GetJulianDate(); long b=GetJulianDate(); return (int)((t-b)/365.2425); } //-------------------------------------------------------------------- // Function name : CSimpleDate::AddMonths // Description : // Return type : const CSimpleDate& // Argument : int Mon //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::AddMonths(int Mon) { if(!IsValid()) return *this; m_Month+=Mon; if(m_Month > 12) { while(m_Month > 12) { m_Month-=12; ++m_Year; } } AdjustDays(); m_JulianDate=ConvertToJulian(); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::SubtractMonths // Description : // Return type : const CSimpleDate& // Argument : int Mon //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::SubtractMonths(int Mon) { if(!IsValid()) return *this; if(Mon > 12) { int t= Mon/12; m_Year-=t; Mon=Mon-(t*12); } m_Month-=Mon; if(m_Month < 1) { --m_Year; m_Month+=12; } AdjustDays(); m_JulianDate=ConvertToJulian(); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::AddYears // Description : // Return type : const CSimpleDate& // Argument : int Yrs //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::AddYears(int Yrs) { if(!IsValid()) return *this; m_Year+=Yrs; AdjustDays(); m_JulianDate=ConvertToJulian(); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::SubtractYears // Description : // Return type : const CSimpleDate& // Argument : int Yrs //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::SubtractYears(int Yrs) { if(!IsValid()) return *this; m_Year-=Yrs; AdjustDays(); m_JulianDate=ConvertToJulian(); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::AddDays // Description : // Return type : const CSimpleDate& // Argument : int Days //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::AddDays(int Days) { if(!IsValid()) return *this; m_JulianDate+=Days; ConvertFromJulian(m_Month,m_Day,m_Year); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::SubtractDays // Description : // Return type : const CSimpleDate& // Argument : int Days //-------------------------------------------------------------------- const CSimpleDate& CSimpleDate::SubtractDays(int Days) { if(!IsValid()) return *this; m_JulianDate-=Days; ConvertFromJulian(m_Month,m_Day,m_Year); return *this; } //-------------------------------------------------------------------- // Function name : CSimpleDate::AdjustDays // Description : // Return type : void //-------------------------------------------------------------------- void CSimpleDate::AdjustDays() { int is_leap, month_days ; is_leap = ( m_Year%4 == 0 && m_Year%100 != 0 || m_Year%400 == 0 ) ? 1 : 0 ; month_days = monthtotals[ m_Month+1 ] - monthtotals[ m_Month] ; if ( m_Month == 2 ) month_days += is_leap ; while(m_Day > month_days) --m_Day; } //-------------------------------------------------------------------- // Time functions //-------------------------------------------------------------------- // Function name : CSimpleDate::SetTime // Description : The only time function: Sets the variables for later use // Return type : void //-------------------------------------------------------------------- void CSimpleDate::SetTime() { long time_val ; struct tm *tm_ptr ; time( (time_t *)&time_val) ; tm_ptr = localtime( (time_t *)&time_val) ; m_Hour=tm_ptr->tm_hour; m_Min=tm_ptr->tm_min; m_Second=tm_ptr->tm_sec; if(m_Hour > 12) { m_bPM=TRUE; m_Hour-=12; } else m_bPM=FALSE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetTimeString // Description : // Return type : void // Argument : CString& s // Argument : BOOL AmPm //-------------------------------------------------------------------- void CSimpleDate::GetTimeString(CString& s,BOOL AmPm) { if(!IsValid()) { s.Empty(); return; } SetTime(); int Flag=0; if(AmPm==TRUE) { if(m_bPM) Flag=1; else Flag=2; } s.Format("%02d:%02d:%02d %s",m_Hour==0 ? 12:m_Hour,m_Min,m_Second,Flag==0 ? "":Flag==1 ? "PM":"AM"); } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetTimeString // Description : // Return type : void // Argument : LPSTR s // Argument : int nLen // Argument : BOOL AmPm //-------------------------------------------------------------------- void CSimpleDate::GetTimeString(LPSTR s,int nLen,BOOL AmPm) { CString cs; GetTimeString(cs,AmPm); strncpy(s,cs,nLen); } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetTimeStringShort // Description : // Return type : void // Argument : CString& s // Argument : BOOL AmPm //-------------------------------------------------------------------- void CSimpleDate::GetTimeStringShort(CString& s,BOOL AmPm) { if(!IsValid()) { s.Empty(); return; } SetTime(); int Flag=0; if(AmPm==TRUE) { if(m_bPM) Flag=1; else Flag=2; } s.Format("%02d:%02d %s",m_Hour==0 ? 12:m_Hour,m_Min,Flag==0 ? "":Flag==1 ? "PM":"AM"); } //-------------------------------------------------------------------- // Function name : CSimpleDate::GetTimeStringShort // Description : // Return type : void // Argument : LPSTR s // Argument : int nLen // Argument : BOOL AmPm //-------------------------------------------------------------------- void CSimpleDate::GetTimeStringShort(LPSTR s,int nLen,BOOL AmPm) { CString cs; GetTimeStringShort(cs,AmPm); strncpy(s,cs,nLen); } //-------------------------------------------------------------------- // Static member functions //-------------------------------------------------------------------- // Function name : CSimpleDate::FixDateFormat // Description : // Return type : BOOL // Argument : LPSTR str //-------------------------------------------------------------------- BOOL CSimpleDate::FixDateFormat(LPSTR str) { CString s; s=str; if(FixDateFormat(s)) { strcpy(str,s); return TRUE; } return FALSE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::FixDateFormat // Description : // Return type : BOOL // Argument : CString& str //-------------------------------------------------------------------- BOOL CSimpleDate::FixDateFormat(CString& str) { char Buff[20]; if(str.IsEmpty()) return FALSE; if(str.GetLength() < 6 || str.GetLength() > 11) return FALSE; CParseIt ParseIt(str,"/.-"); ParseIt.Parse(); int N=ParseIt.GetNumFields(); if(N > 1) return FALSE; strcpy(Buff,str.Left(2)); strcat(Buff,"/"); strcat(Buff,str.Mid(2,2)); strcat(Buff,"/"); if(str.GetLength()==6) strcat(Buff,str.Right(2)); else strcat(Buff,str.Right(str.GetLength()-4)); str=Buff; return TRUE; } //-------------------------------------------------------------------- // Function name : CSimpleDate::VerifyDateFormat // Description : // Return type : BOOL // Argument : LPCSTR date //-------------------------------------------------------------------- BOOL CSimpleDate::VerifyDateFormat(LPCSTR date) { BOOL HasSeperators=FALSE; CString TheDate; // allow blank dates if(strlen(date)==0) return TRUE; // shortest possible date if(strlen(date) < 6) return FALSE; // look for unacceptable characters for(int x=0;x < (signed)strlen(date);++x) { if( date[x] !='/' && date[x] !='-' && date[x] !='.' && !isdigit(date[x])) return FALSE; } for(x=0;x < (signed)strlen(date);++x) { if( date[x] =='/' || date[x] =='-' || date[x] =='.') HasSeperators=TRUE; } TheDate=date; if(!HasSeperators) { if(!FixDateFormat(TheDate)) return FALSE; } CSimpleDate s(TheDate); return s.IsValid(); } //-------------------------------------------------------------------- //-------------------------------------------------------------------- //-------------------------------------------------------------------- // NON CLASS MEMBER HELPER FUNCTIONS //-------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////// // data input a validation for the CSimpleDate class. These routines will allow // input of date strings into a C type string or a CString or a long and will verify that // the data is correct and will supply formatting if none is provided. /////////////////////////////////////////////////////////////////////////// //-------------------------------------------------------------------- //-------------------------------------------------------------------- //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Function name : DDX_SimpleDate // Description : This is not real efficient but works. Makes extensive use // of static class members so speed is not the greatest // Return type : void // Argument : CDataExchange *pDX // Argument : int nID // Argument : LPSTR str // Argument : int nLen //-------------------------------------------------------------------- void DDX_SimpleDate(CDataExchange *pDX,int nID,LPSTR str,int nLen) { char buff[50]; pDX->PrepareEditCtrl(nID); CEdit *ptr=(CEdit *)pDX->m_pDlgWnd->GetDlgItem(nID); if(pDX->m_bSaveAndValidate) { pDX->m_pDlgWnd->GetDlgItem(nID)->GetWindowText(buff,50); if(CSimpleDate::FixDateFormat(buff)) pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(buff); if(ptr->LineLength() > nLen) { sprintf(buff,"Max Length is %d",nLen); pDX->m_pDlgWnd->MessageBox(buff,"",MB_OK); pDX->Fail(); } pDX->m_pDlgWnd->GetDlgItem(nID)->GetWindowText(str,nLen+1); if(CSimpleDate::VerifyDateFormat(str)==FALSE) { sprintf(buff,"Invalid Date or Format"); pDX->m_pDlgWnd->MessageBox(buff,"",MB_OK); pDX->Fail(); } } else { ptr->LimitText(nLen); pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(str); } } //-------------------------------------------------------------------- // Function name : DDX_SimpleDate // Description : This is not real efficient but works. Makes extensive use // of static class members so speed is not the greatest // Return type : void // Argument : CDataExchange *pDX // Argument : int nID // Argument : CString& str //-------------------------------------------------------------------- void DDX_SimpleDate(CDataExchange *pDX,int nID,CString& str) { char buff[50]; pDX->PrepareEditCtrl(nID); if(pDX->m_bSaveAndValidate) { pDX->m_pDlgWnd->GetDlgItem(nID)->GetWindowText(str); if(CSimpleDate::FixDateFormat(str)) pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(str); if(CSimpleDate::VerifyDateFormat(str)==FALSE) { sprintf(buff,"Invalid Date or Format"); pDX->m_pDlgWnd->MessageBox(buff,"",MB_OK); pDX->Fail(); } else pDX->m_pDlgWnd->GetDlgItem(nID)->GetWindowText(str); } else { pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(str); } } //-------------------------------------------------------------------- // Function name : DDX_SimpleDate // Description : This is not real efficient but works. Makes extensive use // of static class members so speed is not the greatest // Return type : void // Argument : CDataExchange *pDX // Argument : int nID // Argument : long& jdate //-------------------------------------------------------------------- void DDX_SimpleDate(CDataExchange *pDX,int nID,long& jdate) { char buff[50]; pDX->PrepareEditCtrl(nID); if(jdate < 0) // just a precaution. This way we only check for a 0 value for init jdate=0; if(pDX->m_bSaveAndValidate) { pDX->m_pDlgWnd->GetDlgItem(nID)->GetWindowText(buff,50); if(jdate > 0 && strlen(buff)==0) // program changed value not user input { CSimpleDate Date(jdate); strcpy(buff,(LPCSTR)Date); pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(buff); } if(CSimpleDate::FixDateFormat(buff)) pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(buff); if(CSimpleDate::VerifyDateFormat(buff)==FALSE) { sprintf(buff,"Invalid Date or Format"); pDX->m_pDlgWnd->MessageBox(buff,"",MB_OK); pDX->Fail(); } CSimpleDate Date(buff); jdate=(long)Date; } else { if(jdate==0) // had to be init value strcpy(buff,""); else { CSimpleDate Date(jdate); strcpy(buff,(LPCSTR)Date); } pDX->m_pDlgWnd->GetDlgItem(nID)->SetWindowText(buff); } } void CSimpleDate::SetDate( int month,int day,int year,int FormatType) { m_Format=FormatType; m_JulianDate=ConvertToJulian( month, day, year); //// Added initialization ///// m_Year=year; m_Month=month; m_Day=day; ////////////////////////////// SetTime(); }