设为首页 加入收藏

TOP

使用 MFC 串行化数据和 C++ 对象(二)
2011-04-28 12:40:16 来源: 作者: 【 】 浏览:2738
Tags:使用 MFC 串行 数据 对象
r Windows")); }else { // 用列表前一个记录内容更新视图成员数据 m_position = temp_pos; CPhone* pPhone = (CPhone*)m_pList->GetAt(m_position); m_Name = pPhone->m_Name; m_Phone = pPhone->m_Phone; UpdateData(FALSE); } // 控制输入焦点 ((CDialog*) this)->GotoDlgCtrl(GetDlgItem(IDC_NAME));

添加和删除列表记录:

//添加记录 // 清空屏幕输入控制 m_Name = ""; m_Phone = ""; UpdateData(FALSE); // 创建一个新的 CPhone 对象 CPhone* pPhone = new CPhone(); pPhone->m_Name = m_Name; pPhone->m_Phone = m_Phone; // 添加新的对象到列表尾部,并用新的位置更新 m_position m_position = m_pList->AddTail(pPhone); // 获得文档指针 CFooDoc* pDoc = (CFooDoc*) GetDocument(); // 置修改标志为 TRUE pDoc->SetModifiedFlag(); // 控制输入焦点 ((CDialog*) this)->GotoDlgCtrl(this->GetDlgItem(IDC_NAME)); //删除记录 // 删除前先保存旧的指针 CObject* pOld; pOld = m_pList->GetAt(m_position); // 从列表中删除元素 m_pList->RemoveAt(m_position); // 从内存中删除对象 delete pOld; // 如果列表已经清空则添加一个空记录 if ( m_pList->IsEmpty()) { OnBnClickedAddButton(); } // 获取文档指针 CPHNDoc* pDoc = (CPHNDoc*) GetDocument(); // 置修改标志为 TRUE pDoc->SetModifiedFlag(); // 显示列表的第一条记录 OnInitialUpdate();

串行化处理

  我们要串行化 CPhone 对象,把C++(www.cppentry.com)对象写入文件,所以需要在 CPhone 类的定义和实现文件中加入相应的串行化代码,首先要在 CPhone 头文件中加入一个 MFC 宏,这是串行化需要的宏,必须为它提供一个参数,也就是类的名字。

// 串行化宏定义 DECLARE_SERIAL(CPhone)  其次是声明串行化函数,这个原型是必须的,因为要串行化类 CPhone 对象列表,所以 CPhone 类必须有一个属于自己的 Serialize()函数:// 串行化函数 Serialize() virtual void Serialize(CArchive& ar);

  在 CPhone 实现文件中也要加入对应的代码,这个宏也是串行化需要的另一个宏,它有三个参数,第一个是类名,第二个是基类名,第三个是应用程序的版本号,可以将版本号定义为任何值,当串行化数据到文件时,此版本号也要写入文件。

// 串行化宏实现 IMPLEMENT_SERIAL(CPhone,CObject,0);串行化函数 Serialize() 实现if (ar.IsStoring()) { ar << m_Name << m_Phone; } else { ar >> m_Name >> m_Phone; }

这里要注意的是为了使用 CObList 类的成员函数 Serialize(),有几个前提条件需要满足:

  • 列表类对象必须是 MFC CObject 类的派生类对象,也就是说 CPhone 类必须是 CObject 的派生类;
  • 在列表中的对象类必须具备一个不带参数的构造函数。如果需要,也可以有其它带参数的构造函数;
  • 必须声明和实现列表类的串行化函数 Serialize(),即 CPhone::Serialize();
  • 实现列表对象的串行化必须使用 DECLARE_SERIAL/IMPLEMENT_SERIAL 宏;

调用列表 Serialize()函数

  这一步是串行化列表 m_PhoneList,也就是调用 m_PhoneList 的成员函数 Serialize()。在什么地方调用呢?记住,无论用户什么时候从“File”菜单中选择“Save”或者“Save as”或“Open”选项,都将执行文档类的 Serialize()函数,所以必须在文档类的 Serialize()函数中调用 m_PhoneList 的 Serialize()函数。
  这样一来,无论用户什么时候从 File 菜单中选择 Save/Save as 时,都将把 m_PhoneList 保存在用户选择的文件中,同样地,无论用户什么时候从选择 Open 时,都将把文件中保存的列表信息加载到 m_PhoneList 中来。m_PhoneList 的串行化调用如下:

m_PhoneList.Serialize(ar);

  只要在文档类的 Serialize() 函数中调用上面这条语句时,必须把 ar 作为参数传入,它将完成需要串行化 m_PhoneList 列表数据的所有工作。不必在if语句中再做其它处理。

定制串行化

——例子程序:ARCH

  串行化处理有时并不需要用户选择文件,此时仍要从或向一个特定文件串行化数据,本部分将描述怎样创建并定制一个 CArchive 对象。创建一个新的单文档 SDI 应用, 工程名为 ARCH。视图类仍然选择 CFormView。视图中两个编辑框和两个按钮,编辑框用于输入数据,“Save to File”按钮用于将输入的数据串行化到文件,“Load from File”按钮用于从文件中抽取数据。为简单起见,文件使用的硬编码。
下面是 “Save to File”的操作代码:

// 用屏幕输入内容更新 m_Var1 和 m_Var2 UpdateData(TRUE); // 创建文件 C:\ARC.ARC CFile f; f.Open("c:\\arc.arc",CFile::modeCreate|CFile::modeWrite); // 创建一个 CArchive 对象,并将文件与对象关联 CArchive ar(&f,CArchive::store); // 串行化 m_Var1 和 m_Var2 到文档 ar<<m_Var1<<m_Var2; // 关闭文档 ar.Close(); // 关闭文件 f.Close();

下面是 “Load from File”的操作代码:

// 打开文件 C:\ARC.ARC CFile f; if ( f.Open("c:\\arc.arc",CFile:
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇深入C++的new 下一篇C++编程对缓冲区的理解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: