Movatterモバイル変換


[0]ホーム

URL:


Wayback Machine
9 captures
25 Jan 2008 - 20 May 2015
NovDECMar
Previous capture24Next capture
200920112013
success
fail
COLLECTED BY
Organization:Alexa Crawls
Starting in 1996,Alexa Internet has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to theWayback Machine after an embargo period.
Collection:Alexa Crawls
Starting in 1996,Alexa Internet has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to theWayback Machine after an embargo period.
TIMESTAMPS
loading
The Wayback Machine - https://web.archive.org/web/20111224011112/http://www.codeproject.com:80/KB/edit/datetimedit.aspx
Click here to Skip to main content
8,358,997 members and growing!
EmailPassword Lost password?
Home
Search within:




Licence 
First Posted 25 Mar 2000
Views 117,798
Bookmarked 41 times

Date-Time Edit Control

ByTri VU KHAC | 25 Mar 2000
A simple masked date-time editor.
 
See Also
Print Article
add
Add to your CodeProject bookmarks
Discuss
Discuss this article
24
  4.59 (31 votes)

1

2
2 votes, 16.7%
3
3 votes, 25.0%
4
7 votes, 58.3%
5
4.59/5 - 31 votes
μ 4.05, σa 1.39 [?]
Sponsored Links

Sample Image - datetimedit.jpg

Introduction

Many articles about the masked edit control could be discovered from MFC sites. Their Date Time Edit controls show some faults such as out-of-range values are not verified, slow processing, etc. Why? Maybe because they are too general and cover many things.

ThisVDateTimeEdit class based onMaskEdit's idea is very simple and understandable for any programmer. You can choose either numeric keys or up/down keys to change the date & time displayed. The Date-Time display is configurable bySetMask().

Mask convention:

DDDayhhHour
MMMonthmmminute
YYYYYearsssecond

Enjoy yourself and please report me the bugs you have found.

Source Code

/////////////////////////////////////////////////////////////////////////////// VDateTimeEdit windowconst UINT WM_DATETIME_EDIT = ::RegisterWindowMessage("WM_DATETIME_EDIT");#define DTE_DATETIMECHANGED 0x0001class VDateTimeEdit :public CEdit{// Constructionpublic:    VDateTimeEdit();// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(VDateTimeEdit)protected:virtualvoid PreSubclassWindow();//}}AFX_VIRTUAL// Implementationpublic:    CString GetMask()const {return m_strMask;}void SetMask(CString mask);    COleDateTime GetDateTime();    COleDateTime GetDateTime(CString str);void SetDateTime(COleDateTime dt);virtual ~VDateTimeEdit();// Generated message map functionsprotected:    afx_msgvoid OnContextMenu(CWnd*, CPoint point);    CString m_strMask;//{{AFX_MSG(VDateTimeEdit)    afx_msgvoid OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);    afx_msgvoid OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);    afx_msgvoid OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);    afx_msgvoid OnMouseMove(UINT nFlags, CPoint point);//}}AFX_MSG    DECLARE_MESSAGE_MAP()};bool VAtoi(CString str,int &res){    str.Remove(char(32));if (str.IsEmpty())returnfalse;bool error =false;for (int i =0; i< str.GetLength() && !error; i++) {int c = ::tolower(str[i]);        error = !(            (c>='0' && c<='9')            || ((c =='-' || c =='+') && i ==0)            );    }if (!error) res = atoi(LPCTSTR(str));return !error;}template<class TYPE>void VSetInRange(TYPE &x, TYPE min, TYPE max) {    ASSERT(min<=max);if (x< min) x = min;elseif (x> max) x = max;}/************************** VDateTimeEdit **************************/VDateTimeEdit::VDateTimeEdit(){    m_strMask = _T("DD/MM/YYYY hh:mm:ss");}VDateTimeEdit::~VDateTimeEdit(){}BEGIN_MESSAGE_MAP(VDateTimeEdit, CEdit)    ON_WM_CONTEXTMENU()//{{AFX_MSG_MAP(VDateTimeEdit)    ON_WM_CHAR()    ON_WM_KEYUP()    ON_WM_KEYDOWN()    ON_WM_MOUSEMOVE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// VDateTimeEdit message handlersvoid VDateTimeEdit::OnChar(UINT nChar, UINT/*nRepCnt*/, UINT/*nFlags*/) {    CString old;    GetWindowText(old);int pos;    TCHAR c;    GetSel(pos, pos);switch (nChar) {case VK_BACK: pos--;break;case VK_UP: pos--;break;case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':if (pos< old.GetLength()                  && pos< m_strMask.GetLength()                  && (UINT)old[pos] != nChar                  && ((c = m_strMask[pos]) =='D' ||                   c =='M' || c =='Y' || c =='h'                   || c =='m' || c =='s')) {                CString str = old;                str.SetAt(pos, (TCHAR)nChar);                COleDateTime dt = GetDateTime(str);if (dt.GetStatus() == COleDateTime::valid) SetDateTime(dt);            }if (++pos< m_strMask.GetLength())for ( c = m_strMask[pos]; pos< m_strMask.GetLength()                     && c !='D' &&                     c !='M' && c !='Y' &&                     c !='h' && c !='m' && c !='s';                  c = m_strMask[pos]) pos++;break;default:if (++pos< m_strMask.GetLength())for ( c = m_strMask[pos]; pos< m_strMask.GetLength()                       && c !='D' && c !='M'                       && c !='Y' && c !='h'                       && c !='m' && c !='s';                    c = m_strMask[pos]) pos++;break;    }    SetSel(pos, pos);}void VDateTimeEdit::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {    CEdit::OnKeyUp(nChar, nRepCnt, nFlags);}void VDateTimeEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {switch (nChar) {case VK_DELETE:case VK_INSERT:break;case VK_UP:case VK_DOWN:            {                CString old;                GetWindowText(old);int pos;                GetSel(pos, pos);if (pos< m_strMask.GetLength()) {                    TCHAR c = m_strMask[pos];if (c !='D' && c !='M' &&                       c !='Y' && c !='h' &&                       c !='m' && c !='s')if (--pos>=0) c = m_strMask[pos];                    tm t;                    COleDateTime dt = GetDateTime();                    t.tm_mday = dt.GetDay();                    t.tm_mon = dt.GetMonth();                    t.tm_year = dt.GetYear();                    t.tm_hour = dt.GetHour();                    t.tm_min = dt.GetMinute();                    t.tm_sec = dt.GetSecond();switch (c) {case'D':                            t.tm_mday += (nChar!=VK_UP) ? -1 :1;break;case'M':                            t.tm_mon += (nChar!=VK_UP) ? -1 :1;break;case'Y':                            t.tm_year += (nChar!=VK_UP) ? -1 :1;break;case'h':                            t.tm_hour += (nChar!=VK_UP) ? -1 :1;break;case'm':                            t.tm_min += (nChar!=VK_UP) ? -1 :1;break;case's':                            t.tm_sec += (nChar!=VK_UP) ? -1 :1;break;default    :                             CEdit::OnKeyDown(nChar, nRepCnt, nFlags);break;                    }                    dt.SetDateTime(t.tm_year, t.tm_mon, t.tm_mday,                                       t.tm_hour, t.tm_min, t.tm_sec);if (dt.GetStatus() == COleDateTime::valid)                         SetDateTime(dt);                }else CEdit::OnKeyDown(nChar, nRepCnt, nFlags);            }break;default:            CEdit::OnKeyDown(nChar, nRepCnt, nFlags);break;    }}void VDateTimeEdit::OnMouseMove(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default        CEdit::OnMouseMove(nFlags, point);}void VDateTimeEdit::PreSubclassWindow() {    SetDateTime(COleDateTime::GetCurrentTime());    CEdit::PreSubclassWindow();}void VDateTimeEdit::SetDateTime(COleDateTime dt){    CString str;int i, n = m_strMask.GetLength();for (i =0; i< n; i++) {        CString s;int val;        TCHAR c = m_strMask[i];switch (c) {case'D':case'M':case'Y':case'h':case'm':case's':for (; i< n; i++) {if (m_strMask[i] == c) s += c;else {i--;break;}                }break;default :break;        }        CString format;        format.Format("%%0%dd", s.GetLength());switch (c) {case'D':                val = dt.GetDay();                ::VSetInRange(val,0,31);                s.Format(format, val);break;case'M':                val = dt.GetMonth();                ::VSetInRange(val,1,12);                s.Format(format, val);break;case'Y':                val = dt.GetYear();                ::VSetInRange(val,1900,9990);                s.Format(format, val);break;case'h':                val = dt.GetHour();                ::VSetInRange(val,0,23);                s.Format(format, val);break;case'm':                val = dt.GetMinute();                ::VSetInRange(val,0,59);                s.Format(format, val);break;case's':                val = dt.GetSecond();                ::VSetInRange(val,0,59);                s.Format(format, val);break;default :                s = c;break;        }        str += s;    }int pos;    GetSel(pos, pos);    SetWindowText(str);    SetSel(pos, pos);    CWnd *pOwner = GetParent();if (pOwner != NULL)       pOwner->PostMessage(WM_DATETIME_EDIT,                   (WPARAM)DTE_DATETIMECHANGED, (LPARAM)0);}COleDateTime VDateTimeEdit::GetDateTime(){    CString str;    GetWindowText(str);return GetDateTime(str);}COleDateTime VDateTimeEdit::GetDateTime(CString str){    tm t;    COleDateTime dt;    dt.SetStatus(COleDateTime::invalid);    CTime::GetCurrentTime().GetLocalTm(&t);    t.tm_mon +=1;    t.tm_year +=1900;int i, n = m_strMask.GetLength();for (i =0; i< n; i++) {        CString s;        TCHAR c = m_strMask[i];switch (c) {case'D':case'M':case'Y':case'h':case'm':case's':for ( ; i< n; i++) {if (str.GetLength()<= s.GetLength())break;if (m_strMask[i] == c) s += str[s.GetLength()];else {i--;break;}                }break;default :if (str.GetLength()<0 || str[0] != (s = c))return dt;break;        }        str = str.Right(str.GetLength() - s.GetLength());int val;switch (c) {case'D':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,1,31);                t.tm_mday = val;break;case'M':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,1,12);                t.tm_mon = val;break;case'Y':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,1900,9990);                t.tm_year = val;break;case'h':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,0,23);                t.tm_hour = val;break;case'm':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,0,59);                t.tm_min = val;break;case's':if (!::VAtoi(s, val))return dt;                ::VSetInRange(val,0,59);                t.tm_sec = val;break;default :break;        }    }    dt.SetStatus(COleDateTime::valid);    dt.SetDateTime(t.tm_year, t.tm_mon,             t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);return dt;}void VDateTimeEdit::OnContextMenu(CWnd*, CPoint){}void VDateTimeEdit::SetMask(CString mask) {    COleDateTime time = GetDateTime();    m_strMask = mask;    SetDateTime(time);}

That's it!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be foundhere

About the Author

Tri VU KHAC



Belgium Belgium

Member


loading...
Sign Up to vote  PoorExcellent
Add a reason or comment to your vote:x
Votes of 3 or less require a comment

Comments and Discussions

 
 RefreshFirstPrevNext
Suggestionmy attempt using Allow Edit propertymemberzriniadhi8:44 3 Oct '11  
Generalproblem with functionalitymemberKipo Kiposki13:54 5 Apr '10  
GeneralWonderful - thank you!memberPaul Roberts8:50 26 Jul '08  
GeneralControl not visiblememberSteve's Mom's Son9:47 2 May '05  
GeneralSome slight modificationsmemberKenGuru4:35 24 Aug '04  
GeneralGood butmemberStudent0077:02 28 Mar '04  
GeneralGreat Code!membersoftyan19:14 7 Oct '03  
GeneralRe: Great Code!membersoftyan19:17 7 Oct '03  
GeneralBUGmemberAizz16:29 3 Jul '03  
GeneralNULL DATEmemberSteven Henthorn5:17 4 Jun '03  
Last Visit: 19:00 31 Dec '99     Last Update: 15:11 23 Dec '11123Next »

General General   News News   Suggestion Suggestion   Question Question   Bug Bug   Answer Answer   Joke Joke   Rant Rant   Admin Admin   

Permalink |Advertise |Privacy |Mobile
Web04 |2.5.111208.1 |Last Updated 26 Mar 2000
Article Copyright 2000 by Tri VU KHAC
Everything elseCopyright ©CodeProject, 1999-2011
Terms of Use
Layout:fixed|fluid

The Daily Insider

[8]ページ先頭

©2009-2025 Movatter.jp