欢迎来到天天文库
浏览记录
ID:18085470
大小:86.00 KB
页数:25页
时间:2018-09-13
《mfc 串行化数据和 c++ 对象》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、使用MFC串行化数据和C++对象作者:JerryZ串行化数据——例子程序:Memo 创建一个新的单文档SDI应用,视图类选择CFormView,以便用户可以在窗口中输入。在界面中创建三个编辑框,然后再添加三个相应的编辑框变量。这三个变量是视图类的成员变量,为了交互数据,文档类中也要创建三个对应的变量。然后,文档类和视图类都要对数据成员进行初始化操作,在文档类中这个工作通常都在OnNewDocument()函数中进行。因为下面任何一个操作发生时都触发文档类OnNewDocument()函数执行:·当用户启动应用程序;·当用户在“File”菜单中选择“New”选项
2、;视图类的初始化通常由OnInitialUpdate()负责,下面的任何一个操作发生时,代码都会触发视图类OnInitialUpdate()函数执行:·当用户启动应用程序;·当用户在“File”菜单中选择“New”选项;·当用户从“File”菜单中选择“Open”选项;在视图类中获得文档类指针的方法是:CFooDoc*pDoc=GerDocument();用此文档指针便可以操作文档类数据:m_ViewData=pDoc->m_DocData;串行化的代码很简单,ar是一个与用户选择的文件相对应的文档对象(CArchive对象)://CFooDoc序列化voidC
3、FooDoc::Serialize(CArchive&ar){if(ar.IsStoring()){//将数据写入文件ar<>m_DocData;}} 这样就将数据写入了文件,选择“File”菜单中的“Save”或者“Saveas”即可完成数据的串行化。如果没有保存数据,退出程序是会提示用户是否保存修改过的数据。具体细节请参考源代码。串行化C++对象——例子程序:PHN创建一个新的单文档SDI应用,视图类选择CFormView,以便可以有窗口中用户可以输入。声明一个要串行化的C++类。如CPhone;
4、文档类的处理: 在文档类中声明一个MFCCObList类对象,这个类很有用,功能也很强,用它可以很轻松地维护C++对象列表,例如添加、删除列表元素等。在文档类的头文件中作如下声明:CObListm_PhoneList; 上面的声明可以是public类型,这样其它类可以直接访问它。也可以是private类型,这样就必须声明一个公共的访问函数,比如:GetPhoneList(),这个函数能返回m_PhoneList的地址。通常可以在文档类的OnNewDocument()函数中进行数据初始化;//CreateaCPhoneObjectCPhone*pPhone=n
5、ewCPhone();pPhone->m_Name="";pPhone->m_Phone="";//Addnewobjecttothem_PhoneListlistm_PhoneList.AddHead(pPhone); 在此CPhone类的成员变量的初始化不是必须的,因为CPhone的构造函数已经完成了这个工作。AddHead()函数向m_PhoneList列表添加刚创建的CPhone对象。所以,无论什么时候创建新文档(如启动应用程序)都会向m_PhoneList列表中添加一个空的CPhone对象。注意类CObList的成员函数AddHead()是向列表的“
6、头部”添加对象(列表的开始),所以参数是想要添加的对象的地址。删除m_PhoneList列表中的内容 因为m_PhoneList是在内存中维护的,所以要随时维护,只要下面三个事件中的任何一个事件发生,都需要从内存中删除m_PhoneList列表中的对象:·用户退出应用程序;·用户开始一个新的文档,如从“File”菜单中选择“New”选项;·用户打开一个已存在的文档,如从“File”菜单中选择“Open”选项;在文档类的头文件中声明删除操作的函数:virtualvoidDeleteContents();其实现如下://删除列表中的所有项目并释放列表对象占用的内存
7、while(!m_PhoneList.IsEmpty()){deletem_PhoneList.RemoveHead();}视图类处理:声明视图类的数据成员:POSITIONm_position;//在文档类列表中的当前位置CObList*m_pList;//指向文档类的列表在OnInitialUpdate()函数中初始化视图类的数据成员POSITIONm_position;CObList*m_pList;//获取文档类指针CFooDoc*pDoc=(CFooDoc*)GetDocument();//获得文档类m_PhoneList的地址m_pList=&(pD
8、oc->m_PhoneL
此文档下载收益归作者所有