📄 q_dateedit.cpp
字号:
#include "qcurses/Q_DateEdit.hpp"/*######################################### 函数功能:析构函数 ## 返 回 值:NULL ## 函数参数:NULL #########################################*/Q_DateEdit::~Q_DateEdit(){ delete []Value; delete []ErrorText;}//------------------------------------------------------------------------------------------/*######################################### 函数功能:构造函数 ## 返 回 值:NULL ## 函数参数:WINDOW *vMainWin 主窗口 ## int vYBegin 起始 ## int vXBegin 起始 ## int vCFront 文字颜色 ## int vCBack 背景色 ## int vMode 模式 #########################################*/Q_DateEdit::Q_DateEdit(WINDOW *vMainWin,int vYBegin,int vXBegin,int vCFront,int vCBack):Q_Edit(vMainWin, 10 , vYBegin, vXBegin, vCFront, vCBack, MINTAGER){ //在主窗口的前后加入 [] mvwaddch(MainWin,_beginy,_beginx-1,'['); mvwaddch(MainWin,_beginy,_beginx+WorkWin->_maxx+1,']'); wrefresh(MainWin); //将当前窗口刷新 wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); waddstr(WorkWin,"-"); wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); waddstr(WorkWin,"-"); wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); wmove(WorkWin,0,0); wrefresh(WorkWin); //初始化数值 ErrorText = new char(50); Set("1982-11-11"); GetNowDate();}//------------------------------------------------------------------------------------------/*######################################### 函数功能:设置文字 ## 返 回 值:NULL ## 函数参数:char *Text 要显示的文字 ## ... 用 vprintf #########################################*/void Q_DateEdit::Set(const char *String){ wattroff(WorkWin,A_UNDERLINE); sscanf(String,"%4d-%d-%d",&Date.YEAR,&Date.MONTH,&Date.DAY); sprintf(Value,"%4d-%02d-%02d",Date.YEAR,Date.MONTH,Date.DAY); mvwaddstr(WorkWin,0,0,Value); wattron(WorkWin,A_UNDERLINE); wrefresh(WorkWin);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:在控件上获取数值 ## 返 回 值:键盘的最后输入 ## 函数参数:NULL #########################################*/int Q_DateEdit::Get(){ curs_set(1); //打开光标 int x=strlen(Value); int FirstKey=0; //第一次输入,如果是0就略过 wattroff(WorkWin,A_UNDERLINE); mvwaddstr(WorkWin,0,0,Value); wattron(WorkWin,A_UNDERLINE); wrefresh(WorkWin); while (1) { GetKey(); wrefresh(WorkWin); if (isCheckBreak(NowKey)) //退出键 { GetValue(); ErrCode = CheckDate(); if (ErrCode!=0) { x = 10; continue; } break; } if (isFilterKey(NowKey)) //过滤键 continue; if (FirstKey==0) { wmove(WorkWin,0,0); wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); waddstr(WorkWin,"-"); wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); waddstr(WorkWin,"-"); wattron(WorkWin,A_UNDERLINE); waddstr(WorkWin," "); wattroff(WorkWin,A_UNDERLINE); x=0; FirstKey++; } //一切OK后开始录入数值 if(NowKey==KEY_BACKSPACE) { mvwaddch(WorkWin,0,x,' '); if (x==5 || x==8) x--; if(x>0) x--; else x=0; } else { if (isEnd()) continue; wattroff(WorkWin,A_UNDERLINE); mvwaddch(WorkWin,0,x,NowKey); wattron(WorkWin,A_UNDERLINE); if(x<WorkWin->_maxx) x++; if (x==4) x = 5; if (x==7) x = 8; } wmove(WorkWin,0,x); } GetValue(); curs_set(0); //关闭光标 ErrCode = CheckDate(); //检查 return(NowKey);}//------------------------------------------------------------------------------------------/*######################################### 函数功能:检查日期输入正确性 ## 返 回 值:错误号 ## 函数参数:NULL #########################################*/int Q_DateEdit::CheckDate(){ static int nian[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int xyear,xmonth,xday; int flagrn=0,fhz; fhz=sscanf(Value,"%4d-%d-%d",&xyear,&xmonth,&xday); if(fhz==-1||fhz==0) { strcpy(ErrorText,"日期数据录入不全"); return(103); } if((xyear<1949)) { strcpy(ErrorText,"年份值小于1949"); return(100); } if((xmonth<1)||(xmonth>12)) { strcpy(ErrorText,"月份值小于1或大于12"); return(101); } if(xmonth==2) if((!(xyear%4))&&(xyear%100)||(!(xyear%400))) flagrn=1; //不是闰年 flagrn+=nian[xmonth-1]; if((xday<1)||(xday>flagrn)) { strcpy(ErrorText,"日数大于本月天数"); return(102); } return(0);}//-----------------------------------------------------------------------------------void Q_DateEdit::GetValue(){ GetNowLine(Value); Value[11] = '\0'; sscanf(Value,"%4d-%d-%d",&Date.YEAR,&Date.MONTH,&Date.DAY); Set(Value);}//-----------------------------------------------------------------------------------char *Q_DateEdit::GetNowDate(){ char *NOWDATE = new char[11]; time_t timep; struct tm *p; time(&timep); p=localtime(&timep); sprintf(NOWDATE,"%4d%02d%02d",1900+p->tm_year,p->tm_mon,p->tm_mday); NowDate.DAY = p->tm_mday; NowDate.MONTH = p->tm_mon; NowDate.YEAR = 1900+p->tm_year; return NOWDATE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -