串行化的一个练习问题

wangjun_2008 2005-11-22 04:49:36
各位好:
我初学vc,做了一个关于串行化的练习,项目名称:Customers,MDI目的是单击编辑菜单下的Add user菜单项,添加user,addr能实现保存和装载,运行后,只能保存,但却打不开,现将练习祥录如下,请教我如何才能既能保存,又能打开:
一、声名类:Users.h
#pragma once
class CUser:public CObject
{
DECLARE_SERIAL(CUser);
public:
//CoNstructors
CUser();
CUser(const CString& szName,const CString& szAddr);
//Attributes
void Set (const CString& szName,const CString& szAddr);
CString GetName ()const;
CString GetAddr ()const;
//Operations
virtual void Serialize(CArchive& ar);
//Implementation
private:
//The user' s name
CString m_szName;
CString m_szAddr;
};
二、定义类:Users.cpp
#include "stdafx.h"
#include "Users.h"

IMPLEMENT_SERIAL (CUser,CObject ,1);
//Constructer
CUser::CUser() { }
CUser::CUser(const CString& szName,const CString& szAddr)
{
Set (szName,szAddr);
}
//Attribute
void CUser::Set(const CString& szName,const CString& szAddr)
{
m_szName = szName;
m_szAddr = szAddr;
}

CString CUser::GetName() const
{
return m_szName;
}

CString CUser::GetAddr() const
{
return m_szAddr;
}
//Serialize Support
void CUser::Serialize(CArchive& ar)
{
if(ar.IsLoading() )
{
ar >>m_szName >> m_szAddr;
}
else
{
ar << m_szName << m_szAddr;
}
}
三、创建菜单项(Add user,在编辑菜单最底下),响应菜单项的消息处理函数(onEditUser),对话框,处理对话框的类UsersDlg,对话框上的控件(两个Edit,用来输入name和addr,一个button)。
UsersDlg.h中的主要语句:
// Dialog Data
//{{AFX_DATA(CUsersDlg)
enum { IDD = IDD_USER_DLG };
CString m_szAddr;
CString m_szName;
//}}AFX_DATA
UsersDlg.cpp :中的主要语句:

#include "stdafx.h"
#include "Customers.h"
#include "UsersDlg.h"

CUsersDlg::CUsersDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUsersDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUsersDlg)
m_szAddr = _T("");
m_szName = _T("");
//}}AFX_DATA_INIT
}


void CUsersDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUsersDlg)
DDX_Text(pDX, IDC_EDIT_ADDR, m_szAddr);
DDX_Text(pDX, IDC_EDIT_NAME, m_szName);
//}}AFX_DATA_MAP
}


四、其他主要代码如下:
// CustomersDoc.h : interface of the CCustomersDoc class
#include "Users.h"
void AFXAPI SerializeElements(CArchive& ar, CUser** pUser, int nCount);
class CCustomersDoc : public CDocument
{
// Attributes
public:
int GetCount() const;
CUser* GetUser(int nUser) const;
protected:
CArray<CUser*,CUser* &>m_setOfUsers;

// Implementation
public:
virtual ~CCustomersDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

};

// CustomersDoc.cpp : implementation of the CCustomersDoc class

#include "stdafx.h"
#include "Customers.h"

#include "CustomersDoc.h"
#include "UsersDlg.h"
#include "Users.h"
/////////////////////////////////////////////////////////////////////////////
// CCustomersDoc

IMPLEMENT_DYNCREATE(CCustomersDoc, CDocument)

BEGIN_MESSAGE_MAP(CCustomersDoc, CDocument)
//{{AFX_MSG_MAP(CCustomersDoc)
ON_COMMAND(ID_EDIT_USER, OnEditUser)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCustomersDoc serialization

void CCustomersDoc::Serialize(CArchive& ar)
{
m_setOfUsers.Serialize(ar);

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CCustomersDoc commands
void AFXAPI SerializeElements(CArchive& ar,CUser** pUser,int nCount)
{
for(int i = 0; i<nCount; i++,pUser++)
{
if(ar.IsLoading() )
{
CUser* pStoredUser = *pUser;
pStoredUser->Serialize(ar);
}
else
{
CUser* pNewUser = new CUser;
pNewUser->Serialize(ar);
*pUser = pNewUser;
}
}
}

void CCustomersDoc::OnEditUser()
{
// TODO: Add your command handler code here
CUsersDlg dlg;
if (dlg. DoModal() == IDOK)
{
CUser* pUser = new CUser(dlg.m_szName,dlg.m_szAddr);
m_setOfUsers. Add(pUser);
UpdateAllViews(NULL);
SetModifiedFlag();
}

}

int CCustomersDoc::GetCount() const
{
return m_setOfUsers.GetSize();
}

CUser* CCustomersDoc::GetUser(int nUser) const
{
CUser* pUser = 0;
if( nUser <m_setOfUsers.GetSize() )
pUser = m_setOfUsers.GetAt( nUser);
return pUser;
}


// CustomersView.h 是appwizard自动生成的
// CustomersView.cpp : implementation of the CCustomersView class

#include "stdafx.h"
#include "Customers.h"

#include "CustomersDoc.h"
#include "CustomersView.h"
#include "Users.h"
/////////////////////////////////////////////////////////////////////////////
// CCustomersView drawing

void CCustomersView::OnDraw(CDC* pDC)
{
CCustomersDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
TEXTMETRIC tm; //根据当前上下文信息填充TEXTMETRIC
pDC->GetTextMetrics(&tm);
int nLineHeight = tm.tmHeight + tm.tmExternalLeading;
CPoint ptText(200,200); for(int nIndex = 0; nIndex < pDoc->GetCount(); nIndex ++)
{
CString szName;
CUser* pUser = pDoc->GetUser(nIndex);
szName.Format("User = %s,email = %s",pUser->GetName(),pUser->GetAddr());
pDC->TextOut(ptText.x,ptText.y,szName);
ptText.y += nLineHeight;
}

}
/////////////////////////////////////////////////////////////////////////////
);
}
其他除了在StdAfx.h中添加#include <afxtempl.h>外,再无其他改动。请指点,谢谢



...全文
116 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧