2024年备忘录实验报告_第1页
2024年备忘录实验报告_第2页
2024年备忘录实验报告_第3页
2024年备忘录实验报告_第4页
2024年备忘录实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

试验三.备忘录试验规定:用VC++实現备忘录小程序,可以设定事件告知信息,并按照设定的時间進行事件告知,详细规定如下:1.界面友好,美观大方;2.支持事件的录入,包括時间、事件、备注信息等;3.支持在设定的時间進行事件提醒;4.支持對已录入事件大的查看、修改和删除;5.其他更多功能,可根据状况自行添加。題目分析:由題意可知,建立备忘录小程序需要操作的對象是“事件”和“事件列表”。因此,我們建立了事件类(classEvent)和事件链表类(classEventList)。如下是對类的详细分析:事件类的组员变量中应當包括如下信息:◆内容(content)◆標识符用以唯一標识(id)◆与否设置提醒(reminder)◆事件提醒時间(time)◆標題(title)對应组员变量的组员函数有:Event():构造一种空事件getContent():获得事件内容getOleTime():获得COleDateTime對象的時间getReminder():获得与否提醒getTime():获得字符串格式時间getTitle():获得標題setContent(..),setID(..),setReminder(..),setTime(..),setTitle(..)分别设置内容,ID,提醒,時间,和標題。创立一种事件的详细過程:1.申明一种事件Event對象,调用默认构造函数。2.根据顾客输入调用對应的set函数給事件组员变量赋值。需要注意的是:content,id,tiltle都是CString类對象,而time是COleDateTime對象。3.调用setIDAuto()函数,給该事件自動加上ID,ID對应著目前時间點。如下是setIDAuto的详细实現代码:voidsetIDAuto() { COleDateTimecur_time; cur_time.GetCurrentTime(); intday=cur_time.GetDay(); intmonth=cur_time.GetMonth(); intyear=cur_time.GetYear(); intminute=cur_time.GetMinute(); inthour=cur_time.GetHour(); intsecond=cur_time.GetSecond();//根据目前時间设定ID id.Format(_T("%.4d-%.2d-%.2d%.2d:%.2d:%.2d"),year,month,day,hour,minute,second); }下面是對事件链表类EventList的分析:首先引入STL中的vector类,為事件构造一种向量(動态数组)。語句為:std::vector<Event>event_vector而该类的所有操作都是围绕著這個事件向量進行的。如下是對组员变量的讲解:Eventleft_event:標识即将发生事件,在背面的【事件提醒】有详细简介。intsize:记录目前的事件数量组员函数:addEvent:添加事件check():检查left_event与否抵达提醒時间deleteEvent:從id或下標删除事件GetEvent:從下標获取事件getLeftEvent:设置left_event,并返回它getSize:或取目前事件数Read:從传入途径讀取文献,获取已保留事件数据Save:從传入途径写入文献如下是添加一种事件的流程:创立事件调用EventList的组员函数addEvent添加事件程序共含两個窗体:即主窗体和事件添加编辑窗体。如下是窗体截图:两個窗体分别為两個类,其中主窗体类名為CbeiwangluDlg,包括如下私有组员。Cur_event:一种事件對象,新建和编辑對象時用的临時变量event_list:事件链表,伴伴随窗体的生命周期left_event:保留即将发生的事件事件添加编辑窗体类為CNewEventDlg,类关系图為:如下是對该类的组员变量進行阐明:Event*cur_event:保留一种事件指针,而该类的所有操作均是對该指针所指向的對象進行操作BoolifEdit:判断与否為编辑窗口,默认是添加事件窗口EventContext:事件内容,和一种EditBox绑定EventID:事件ID,自動设置EventReminder:事件与否提醒,和一种CheckBox绑定EventTitle:事件標題,与一种EditBox绑定SelectedTime:和一种CDateTimeCtrl控件绑定,用以获得选择的年月曰Time_of_hms:和一种CDateTimeCtrl控件绑定,用以获得详细的時分秒SetEvent:根据EventID,EventReminder,EventTitle,SelectedTime為cur_event所指向的事件赋值。1.文献讀写程序运行,创立事件链表,然後调用EventList的Read函数從文献中讀入事件列表。在了争讀取文献時,我們不妨先看一看保留的格式,即Save函数的实現,如下是Save函数的实現代码:(有关注释已在代码间表明) CStringSave(constCString&path) { CStdioFilef; CFileExceptione; if(!f.Open(path,CFile::modeWrite|CFile::modeCreate|CFile::typeText|CFile::typeBinary,&e)) { return_T("Filecouldnotbeopened\n"); } std::vector<Event>::iteratorit=event_vector.begin(); CStringtemp; while(it!=event_vector.end())//無限循环,直至迭代器走到向量尾端 { f.WriteString(it->getTime());//写入時间 f.WriteString(_T("\n"));//换行 f.WriteString(it->getTitle());//写入標題 f.WriteString(_T("\n"));//换行 if(it->getReminder()==TRUE) { f.WriteString(_T("TRUE"));//写入与否提醒 } else { f.WriteString(_T("FALSE"));//写入与否提醒 } f.WriteString(_T("\n"));//换行 f.WriteString(it->getContent());//写入事件内容 f.WriteString(_T("\n\r"));//换行 f.WriteString(it->getID());//写入ID f.WriteString(_T("\n"));//换行 it++;//迭代器向前進一 } return_T("OK"); }Save的实現方式是将每個事件均有次序地保留進一种文本文献裏,這样有条不紊的写入文献保证了文献讀入時稳定性。如下是Read函数是详细实現代码:CStringRead(constCString&path) { CStdioFilef; CFileExceptione; if(!f.Open(path,CFile::modeRead|CFile::typeBinary,&e)) { return_T("Filecouldnotbeopened\n"); } CStringstr,temp_str; Eventcur_event; COleDateTimeevent_time; CStringstrii; intcount=1; while(f.ReadString(str)) { if(str=="\n"||str=="\r") { continue; } switch(count) { case1://第一行,讀入時间 intyear,month,day,hour,minute,second; temp_str=str.Mid(0,4); year=_wtoi(temp_str); temp_str=str.Mid(5,2); month=_wtoi(temp_str); temp_str=str.Mid(8,2); day=_wtoi(temp_str); temp_str=str.Mid(11,2); hour=_wtoi(temp_str); temp_str=str.Mid(14,2); minute=_wtoi(temp_str); temp_str=str.Mid(17,2); second=_wtoi(temp_str); event_time.SetDateTime(year,month,day,hour,minute,second); cur_event.setTime(event_time); break; case2://第二行,讀入標題 cur_event.setTitle(str); break; case3://第三行,讀入与否提醒 if(str==_T("TRUE")) { cur_event.setReminder(TRUE); } else { cur_event.setReminder(FALSE); } break; case4://讀入事件内容 cur_event.setContent(str); break; case5://讀入ID cur_event.setID(str); break; } if(count==5)//若count==5,表达一种事件已經讀入完毕,则使count变回,并向列表中添加 { count=1; this->addEvent(cur_event); } else { count++;//否则使count自增 } } return_T("OK"); }Read操作即為Save的逆向操作,根据Save的保留次序依次讀入各個事件,将原字符串格式的信息转化為需要的类型添加進事件中,最终依次添加每一种事件進入事件链表中。事件添加事件的添加,即為當單击新建事件按钮時调出添加事件對话框。但我們需要在主對话框和添加事件對话框建立信息桥梁,因此我們让添加事件對话框的组员变量*cur_event指向主窗口的组员变量cur_event,详细实現代码如下: Eventcur_event; CNewEventDlgdlg; dlg.setEvent(&cur_event);//设置指针指向cur_event intdd=dlg.DoModal();//對话框弹出 if(cur_event.getTitle()!=_T(""))//假如標題未设置则认為未确认添加 { event_list.addEvent(cur_event); RefreshList();//刷新显示列表 }如下是添加事件對话框的详细实現代码,如OnBnClickedOk函数上進行响应:voidCNewEventDlg::OnBnClickedOk(){ //TODO:在此添加控件告知处理程序代码 UpdateData(TRUE);//获得各变量的值 intyear=SelectedTime.GetYear(); intmonth=SelectedTime.GetMonth(); intday=SelectedTime.GetDay(); inthour=time_of_hms.GetHour(); intminute=time_of_hms.GetMinute(); intsecond=time_of_hms.GetSecond(); SelectedTime.SetDateTime(year,month,day,hour,minute,second); //為事件的各组员变量赋值 cur_event->setTime(this->SelectedTime); cur_event->setTitle(this->EventTitle); cur_event->setReminder(this->EventReminder); cur_event->setContent(this->EventContext); COleDateTimecur_time=COleDateTime::GetCurrentTime(); cur_event->setID(cur_time); OnOK();}至此,便完毕了對事件的添加。事件删除事件删除的详细实現是:获得选中事件通過获得下標對事件進行删除详细实現代码為:voidCbeiwangluDlg::OnBnClickedButton3(){ //TODO:在此添加控件告知处理程序代码 CStringstr; POSITIONpos=m_list.GetFirstSelectedItemPosition(); if(pos==NULL) TRACE0("Noitemswereselected!\n"); else { while(pos) { intnItem=m_list.GetNextSelectedItem(pos); Eventcur_event=event_list.GetEvent(nItem); event_list.deleteEvent(nItem); RefreshList(); MessageBox(_T("删除成功!")); } }}4.事件编辑對事件進行编辑,需要得到目前列表的选中项,并要调出事件编辑窗口。如下是主窗口對事件编辑的代码: CStringstr; POSITIONpos=m_list.GetFirstSelectedItemPosition(); if(pos==NULL) TRACE0("Noitemswereselected!\n"); else { while(pos) { intnItem=m_list.GetNextSelectedItem(pos);//将pos转化為下標 Eventcur_event=event_list.GetEvent(nItem);//由下標获得事件,并赋值給临時事件 event_list.deleteEvent(nItem);//删除事件 //等同于添加事件 CNewEventDlgdlg; dlg.setEvent(&cur_event); dlg.setIfEdit(true); intdd=dlg.DoModal(); event_list.addEvent(cur_event); RefreshList(); }}编辑事件的流程是:获取要编辑事件,并将其赋值給临時变量cur_event删除该事件调用事件添加模块,但使事件添加窗口在窗口创立時加载cur_event的各项参数。不管顾客确定還是取消编辑,均無条件添加cur_event進入事件链表中刷新显示列表5.事件提醒事件的提醒处理思想如下:设置一种Timer,每1秒响应一次因此,我們在主窗口的OnInitDlg函数裏添加了下面這一句代码:SetTimer(32,1000,NULL);设置Timer响应函数,為了使窗口跳到最前,并弹出對话框,因此我們在OnTimer函数中写了如下代码:voidCbeiwangluDlg::OnTimer(UINT_PTRnIDEvent){ //TODO:在此添加消息处理程序代码和/或调用默认值 COleDateTimecur_time=COleDateTime::GetCurrentTime(); if(nIDEvent==32) { if(event_list.check()==true)//當检查返回true時,执行提醒 { //使窗口跳到最前,并弹出對话框 ShowWindow(SW_SHOW); SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); SetForegroundWindow(); HWNDhCurWnd=NULL; DWORDlMyID; DWORDlCurID; hCurWnd=::GetForegroundWindow(); lMyID=::GetCurrentThreadId(); lCurID=::GetWindo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论