使用 MFC 串行化数据和 C++ 对象(一)
来源:互联网 发布:淘宝店主有什么模块 编辑:程序博客网 时间:2024/05/22 02:00
串行化数据
——例子程序:Memo
创建一个新的单
当用户启动应用程序;
当用户在“File”菜单中选择“New”选项;
当用户启动应用程序;
当用户在“File”菜单中选择“New”选项;
当用户从“File”菜单中选择 “Open”选项;
在视图类中获得文档类指针的方法是:CFooDoc* pDoc = GerDocument();
用此文档指针便可以操作文档类数据:m_ViewData = pDoc->m_DocData;
串行化的代码很简单,ar 是一个与用户选择的文件相对应的文档对象(CArchive 对象):
// CFooDoc 序列化
void CFooDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// 将数据写入文件
ar << m_DocData;
}
else
{
// 从文件中读取数据
ar >> m_DocData;
}
}
这样就将数据写入了文件,选择“File”菜单中的“Save”或者“Save as”即可完成数据的
串行化C++对象
——例子程序:PHN
创建一个新的单文档 SDI 应用,视图类选择 CFormView,以便可以有窗口中用户可以输入。
声明一个要串行化的 C++ 类。如 CPhone;
文档类的处理:
在文档类中声明一个 MFC CObList 类
CObList m_PhoneList;
上面的声明可以是 public 类型,这样其它类可以直接访问它。也可以是 private 类型,这样就必须声明一个公共的访问函数,比如:GetPhoneList(),这个函数能返回 m_PhoneList 的地址。
通常可以在文档类的 OnNewDocument()函数中进行数据初始化;
// Create a CPhone Object
CPhone* pPhone = new CPhone();
pPhone->m_Name = "";
pPhone->m_Phone = "";
// Add new object to the m_PhoneList list
m_PhoneList.AddHead(pPhone);
在此 CPhone 类的成员变量的初始化不是必须的,因为 CPhone 的构造函数已经完成了这个工作。AddHead()函数向 m_PhoneList 列表添加刚创建的 CPhone 对象。所以,无论什么时候创建新文档(如启动应用程序)都会向 m_PhoneList 列表中添加一个空的 CPhone 对象。注意类 CObList 的成员函数 AddHead() 是向列表的“头部”添加对象(列表的开始),所以参数是想要添加的对象的地址。
删除 m_PhoneList
因为 m_PhoneList 是在内存中维护的,所以要随时维护,只要下面三个事件中的任何一个事件发生,都需要从内存中删除 m_PhoneList 列表中的对象:
用户退出应用程序;
用户开始一个新的
用户打开一个已存在的文档,如从“File”菜单中选择“Open”选项;
在文档类的头文件中声明删除操作的函数:
virtual void DeleteContents();
其实现如下:
// 删除列表中的所有项目并释放列表对象占用的内存
while ( ! m_PhoneList.IsEmpty() )
{
delete m_PhoneList.RemoveHead();
}
视图类处理:
声明视图类的数据成员:
POSITION m_position; // 在文档类列表中的当前位置
CObList* m_pList; // 指向文档类的列表
在 OnInitialUpdate()函数中初始化视图类的数据成员
POSITION m_position;
CObList* m_pList;
// 获取文档类指针
CFooDoc* pDoc = (CFooDoc*) GetDocument();
// 获得文档类 m_PhoneList 的地址
m_pList = &(pDoc->m_PhoneList);
// 获得列表头位置
m_position = m_pList->GetHeadPosition();
// 用文档类数据更新视图类数据成员
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));
更新文档数据
当用户修改了视图类的数据成员,即修改了窗体编辑框中的内容时,执行这些代码后也会修改文档类的数据成员。
void CFooView::OnEnChangeName()
{
// 用屏幕输入更新控件变量
UpdateData(TRUE);
// 获得文档指针
CFooDoc* pDoc =(CFooDoc*)GetDocument();
// 更新文档
CPhone* pPhone = (CPhone*)m_pList->GetAt(m_position);
pPhone->m_Name = m_Name;
// 置修改标志为 TRUE
pDoc->SetModifiedFlag();
}
在列表中移动记录,修改视图类中相应的函数。
// 声明一个临时的位置变量
POSITION temp_pos;
// 用当前的列表位置更新 temp_pos
temp_pos = m_position;
// 用前一个/或后一个位置更新 temp_pos
m_pList->GetPrev(temp_pos);
if ( temp_pos == NULL)
{
// no previous element
MessageBox(_T("Bottom of file encountered!"),_T("Phone for 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_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();
- 使用 MFC 串行化数据和 C++ 对象(一)
- 使用 MFC 串行化数据和 C++ 对象
- 使用 MFC 串行化数据和 C++ 对象
- 使用 MFC 串行化数据和 C++ 对象(二)
- 使用MFC串行化保存程序数据
- 对象串行化和反串行化
- 使用thrift串行化对象
- 对象的串行化和反串行化
- java中对象的串行化和反串行化
- 使用MFC的CFile文件类和CArchive串行化类进行二进制文件读写操作
- MFC-串行化
- MFC 串行化(Serialization)
- MFC串行化原理
- MFC 文档串行化
- MFC 用串行化实现文档存储和读取功能
- MFC Windows程序设计学习笔记--文件和串行化
- PHP面向对象之对象串行化和反串行化
- 对象的串行化
- 日期
- CListView常用用法
- c# webBrowser 获取Ajax信息 .
- php&mysql初探
- 如何分析一个网站的真实流量大小
- 使用 MFC 串行化数据和 C++ 对象(一)
- Android实战技巧:Handler与线程间通信ITC
- 使用 MFC 串行化数据和 C++ 对象(二)
- 网络推广用的数据分析工具
- listview的工作原理与BaseAdapter的执行过程
- 不甘心(续)
- 国外程序员推荐:每个程序员都应读的书
- 用控件聚合技术为FlexGrid增添PickList功能
- XAML实例教程系列 – 开篇