对话框的序列化

frank_yufu 2002-10-04 12:25:07
我想编个基于对话狂的程序,要让它支持序列化,并在对话框显示时就能显示一部分序列化中的数据,不知道该怎么做。我给对话框类添加了自己的序列化函数,但在对话框显示时编辑框中不能显示数据。不是UpdateData()的问题。
...全文
231 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
帮帮忙,我在线等!!!
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
对话框关闭时能自动调用序列化函数吗?
caitou123 2002-10-04
  • 打赏
  • 举报
回复
http://jjhou.csdn.net/
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
既然不会,那我该怎么添代码?我身边没有这方面的书,网上有这方面的文章吗,有的话请给出详细网址。
yousen 2002-10-04
  • 打赏
  • 举报
回复
不会的。
Leryan 2002-10-04
  • 打赏
  • 举报
回复
我没有写储存的代码,对话框关闭时序列化函数会自己存数据吗?



这是问题所在。

anakine 2002-10-04
  • 打赏
  • 举报
回复
csdn_lee的例子不是已经说得很明白了?
yousen 2002-10-04
  • 打赏
  • 举报
回复
Load、Save是自定义的成员函数。你可以参考csdn_lee的代码
shan_ghost 2002-10-04
  • 打赏
  • 举报
回复
就是 caitou123(自向红尘取烦恼)所说的,你先到侯捷网站上下载《深入浅出MFC>看吧。
看来你还不大懂serialize的机理
yousen 2002-10-04
  • 打赏
  • 举报
回复
Load、Save当然是你自己写的代码了!
Serialize里面就包含的啊!不过对话框程序没必要弄一个CDocuent来凑热闹的。你自己给Dialog加两个成员函数(或一个Serialize也行)Save、Load就行了啊!

Serialize函数参看csdn_lee的代码。

C***Dialog::Save()
{
CFile cfFile;
if(cfFile.Open("file.ext",CFile::modeWrite|CFile::modeCreate))
{
CArchive archive(&cfFile, CArchive::store);
UpdateData();
ar<<m_strEdit1;
ar<<m_iEdit2;
ar<<m_nEdit3;
.....
ar.Close();
cfFile.Close();
}
}

C***Dialog::Load()
{
CFile cfFile;
if(cfFile.Open("file.ext",CFile::modeRead))
{
CArchive archive(&cfFile, CArchive::load);
UpdateData();
ar>>m_strEdit1;
ar>>m_iEdit2;
ar>>m_nEdit3;
.....
UpdateData(FALSE);
ar.Close();
cfFile.Close();
}
}
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
我在对话框初始化函数中加入:
CArchive* ar;
ar->IsStoring();
在 Onok中加入:
CArchive* ar;
ar->Close();
但是关闭对话框时出现错误。
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
To yousen(一个人流浪)

请问你有Load,Save 方面的代码吗,我从来没遇到过,在单文档的程序里也找不到,能不能告诉我哪儿有这方面的代码,谢了
caitou123 2002-10-04
  • 打赏
  • 举报
回复
还是到侯捷网站上下载《深入浅出MFC>看吧,我想你应该对serialize的机理搞清楚。
csdn_lee 2002-10-04
  • 打赏
  • 举报
回复
先在对话框程序加Serialize虚函数.然后在你要调用的地方显式加读写代码.下面是一个例子.它是要选择文件名的,你可以去掉该对话框
///读取文件////////
void CDlgAnyTest::OnFileOpen()
{
CFileDialog dlg(TRUE,_T("at"),NULL,OFN_OVERWRITEPROMPT,_T("*.at|*.*||"));
if(dlg.DoModal()==IDOK)
{
CFile theFile;
ASSERT(theFile.Open(dlg.GetPathName(), CFile::modeRead));
CArchive archive(&theFile, CArchive::load);
Serialize(archive);
//close
archive.Close();
theFile.Close();
}
UpdateData(FALSE);
}
////////写文件///////////
void CDlgAnyTest::OnFileSaveAs()
{
UpdateData();//save data to memory var
CFileDialog dlg(FALSE,_T("at"),_T("任意测试"),OFN_OVERWRITEPROMPT,_T("*.at|*.*||"));
if(dlg.DoModal()==IDOK)
{
CFile theFile;
ASSERT(theFile.Open(dlg.GetPathName(), CFile::modeWrite|CFile::modeCreate));
CArchive archive(&theFile, CArchive::store);
Serialize(archive);
//close
archive.Close();
theFile.Close();
}
}
//////////要写的数据////////
void CDlgAnyTest::Serialize(CArchive& ar)
{

if (ar.IsStoring())
{
ar<<m_dIAFrequence;
ar<<m_dIAPhase;
}
else
{
ar>>m_dIAFrequence;
ar>>m_dIAPhase;
}

}
yousen 2002-10-04
  • 打赏
  • 举报
回复
在Dialog里用CDocument的话应该都要手动的。
也就是说你先创建Dialog,然后在OnInitDialog()里面加上Load的代码
然后在关闭Dialog的时候,在OnClose()里面加上Save的代码。这样才行
frank_yufu 2002-10-04
  • 打赏
  • 举报
回复
我不太清楚当程序运行时是先调入数据还是对对话框初始化。
代码我写了后发现不对就删了。
如果我用文档序列化那运行程序时是先调入文档数据还是先对对话框初始化
还有,我没有写储存的代码,对话框关闭时序列化函数会自己存数据吗?
我好像笨苯的:)
yousen 2002-10-04
  • 打赏
  • 举报
回复
晕倒!搞得这么麻烦啊?
那先看看Load的时候给EDIT赋完值有没有 UpdateData(FALSE); 这一句啊?
有的话把序列化相关的代码贴上来吧!
mujc1111 2002-10-04
  • 打赏
  • 举报
回复
序列化由cdocument完成
你得添加自己的cdocument类
yousen 2002-10-04
  • 打赏
  • 举报
回复
具体代码呢?
OnInitDialog()和OnClose()的?

16,551

社区成员

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

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

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