问一个有关文件存储的问题◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎

popyyb 2003-08-21 12:39:04
在文档视图结构中我在文档类中声明了一个CObArray,然后在文档类的Serialize函数中调用CObArray.Serialize(ar)进行存储,可以

我发现在文档类的Serialize函数中好像不能写ar<<m_a1;ar>>m_a1;(m_a1是一个CObArray的实例)

那如果我用自己定义的结构而不用CObArray,如何在该函数中存储呢?
...全文
25 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
canoe_eyes 2003-08-21
  • 打赏
  • 举报
回复
同意楼上
孤必有邻 2003-08-21
  • 打赏
  • 举报
回复
下面的可以看一下(示例):
class CA
{
public:
char name[9];
BOOL sex;
int age;
CString address;
public:
CA(){}
~CA(){}
public:
void Serialize(CArchive&ar);
};

void CA::Serialize(CArchive&ar)
{
CString text;
if(ar.IsStoring())
{
text=name;//char*不能用(定义成CString就好了)
ar<<text<<sex<<age<<address;
}
else
{
ar>>text>>sex>>age>>address;
strcpy(name,text.GetBuffer(0));
}
}

class CB
{
public:
int index;
CA ca;
public:
CB(){}
~CB(){}
//没有定义Serialize(),但完全可以象CA那样定义
};

void CAdoBlobDlg::OnButtonStore()
{
CB cb;
cb.index=1;
strcpy(cb.ca.name,"王进");
cb.ca.sex=TRUE;
cb.ca.age=30;
cb.ca.address="济南";
CFile file;
if(file.Open("c:\\abc.dat",CFile::modeWrite|CFile::modeCreate))
{
CArchive ar(&file,CArchive::store);
ar<<(cb.index);
cb.ca.Serialize(ar);
//如果CB也定义Serialize,一行调用就可以了,但这两句还是要有(放在Serialize中)
ar.Close();
file.Close();
}
}

void CAdoBlobDlg::OnButtonLoad()
{
CB cb;
CFile file;
if(file.Open("c:\\abc.dat",CFile::modeRead))
{
CArchive ar(&file,CArchive::load);
ar>>cb.index;
cb.ca.Serialize(ar);
//如果CB也定义Serialize,一行调用就可以了,但这两句还是要有(放在Serialize中)
ar.Close();
file.Close();
}
CString text;
text.Format("%d号\n%s %s %d %s",cb.index,cb.ca.name,cb.ca.sex?"男":"女",cb.ca.age,cb.ca.address);
AfxMessageBox(text);
}
孤必有邻 2003-08-21
  • 打赏
  • 举报
回复
类CArchive实现结构化存储。
ar<<或ar<<操作的只能是基本数据类型,如char,int,long,float,CString也可以。
你要使用自己定义的结构,你就要这样实现:
比如结构为
struct
{
CString name;
BOOL sex;
int age;
};
则要使用:
ar<<name<<sex<<age;
ar>>name>>sex>>age;
如果你把结构成员定义成类的成员,你也要这样使用,只不过是你可以把上面的两句放成自定义类的成员函数中,并在文档类中传递参数ar调用成员函数.如果自定义类有基类且为CObject,就不用自己添加函数了,重载一下就可以了(其实道理是一样的)
Serialize()可以一级一级的调用(在不断的派生中),但ar<</>>操作的只能是基本数据类型(不包括char*)
popyyb 2003-08-21
  • 打赏
  • 举报
回复
那在文档类中怎么操作?
onion_535 2003-08-21
  • 打赏
  • 举报
回复
同意楼上的,改写Serialize后,ar作为参数传入,如果你要使用"<<"和">>"这两个运算符的话就要重载这两个运算符了。
balas 2003-08-21
  • 打赏
  • 举报
回复
从CObject派生你的结构,重载Serialize
完全符合dicom3 0标准 具备良好的dicom兼容性 定位线可以在相关影像上显示 用来定位和识别这个影像与定位图的切片位置关系 在浏览ct或磁共振序列时参考影像上可以显示定位线 可以自由布局浏览图像 同时支持病人的多次检查 多序列比较 被选择的检查可以通过缩略图显示 这些缩略图包含序列 影像或者一个序列的子集 具有基本影像处理功能:zoom pan inverse fit rotate reverse flip 缩放 放大镜等功能 用户可以通过鼠标自由调节影像的窗宽窗位 也可以选择默认值 用户可以通过键盘 鼠标和鼠标的滚轮在序列和影像中自由浏览 可以以电影回放方式浏览影像 支持mpr 图像空间定位 方便医生诊断 支持同一检查的不同序列图像等比例显示 支持不同序列图像联动 支持多针图像浏览 工作站具有图像标记功能 可以一次选取单幅和多幅图像 可以一次选取也可以多次选取 用简单的步骤选取图像 可以在影像上增加注释 这些注释包括箭头 线条 矩形 任意文字 遮照 可以在同一影像上显示多个注释 用户可以在一个影像中测量对象:长度 圆形面积 矩形面积 曲线 心胸比 可以测量ct影像上的ct值 用户可以用 dcm jpg bmp png gif和tiff 格式文件保存影像 支持dicom打印机打印影像 具有dicom对象的导入 import 和导出 export 的功能 具有读取标准dicom dir影像文件功能 具有刻录cd dvd的功能 可直接连接dvd ±rw driver 将本机或服务器上影像数据直接备份至媒体中 支持dicom queryretrieve c s【tor】e suc scp c echo 支持内存管理 磁盘空间管理 大数据加载 支持菜单编辑 自定义快捷键 调整工具栏位置 工作站基于插件开发模式 支持动态组合诊断工作站的功能 不影响工作站的运行 "> 完全符合dicom3 0标准 具备良好的dicom兼容性 定位线可以在相关影像上显示 用来定位和识别这个影像与定位图的切片位置关系 在浏览ct或磁共振序列时参考影像上可以显示定位线
1、影像诊断工作站: 完全符合DICOM3.0标准,具备良好的DICOM兼容性。 定位线可以在相关影像上显示,用来定位和识别这个影像与定位图的切片位置关系。在浏览CT或磁共振序列时参考影像上可以显示定位线。 可以自由布局浏览图像、同时支持病人的多次检查、多序列比较。 被选择的检查可以通过缩略图显示,这些缩略图包含序列、影像或者一个序列的子集。 具有基本影像处理功能:Zoom、Pan、Inverse、Fit、Rotate、Reverse、Flip、缩放 、放大镜等功能。 用户可以通过鼠标自由调节影像的窗宽窗位,也可以选择默认值。 用户可以通过键盘、鼠标和鼠标的滚轮在序列和影像中自由浏览。 可以以电影回放方式浏览影像。 支持MPR、图像空间定位,方便医生诊断。 支持同一检查的不同序列图像等比例显示、支持不同序列图像联动。 支持多针图像浏览 工作站具有图像标记功能,可以一次选取单幅和多幅图像,可以一次选取也可以多次选取,用简单的步骤选取图像。 可以在影像上增加注释,这些注释包括箭头、线条、矩形、任意文字、遮照。可以在同一影像上显示多个注释。 用户可以在一个影像中测量对象:长度、圆形面积、矩形面积、曲线、心胸比。 可以测量CT影像上的CT值。 用户可以用 DCM、JPG、BMP、PNG、GIF和TIFF 格式文件保存影像。 支持DICOM打印机打印影像。 具有DICOM对象的导入(Import)和导出(Export)的功能。 具有读取标准DICOM DIR影像文件功能。具有刻录CD/DVD的功能,可直接连接DVD ±RW Driver,将本机或服务器上影像数据直接备份至媒体中。 支持Dicom QueryRetrieve、C-store suc/scp 、C-echo 支持内存管理、磁盘空间管理、大数据加载。 支持菜单编辑、自定义快捷键、调整工具栏位置。 工作站基于插件开发模式, 支持动态组合诊断工作站的功能,不影响工作站的运行。
它有强大的功能: ◆支持三种窗口模式:单窗口 (SDI),多窗口 (MDI) 和伪多窗口 (PMDI); ◆完全支持 Unicode 系统 (NT/2000/XP/2003/Vista/7) 上的 Unicode 字符串; ◆支持 Unicode 代码页 (UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE); ◆支持系统上已经安装的任何代码页; ◆支持 DOS/Windows、Unix 和 Mac 换行符格式; ◆文件打开前预览; ◆纠正错误代码页显示; ◆文本列选; ◆多级撤消; ◆支持“正则表达式”的查找/替换,可快速搜索/替换文本字串; ◆能记住文件的代码页和插入点的位置; ◆文档的打印预览和打印; ◆支持语言模块; ◆插件支持 (语法高亮显示、文本折叠、自动完成、脚本执行、键盘宏……)。 通过插件已实现的功能: Clipboard.dll: 捕捉剪贴板; Coder.dll: 支持多种编程语言的语法高亮显示、文本折叠、自动完成; ContextMenu.dll: 可以自定义主菜单,编辑区、MDI 标签、超链接和文件的右键菜单; Exit.dll: 提供退出 AkelPad 时的消息提示框和改变按 ESC 键的行为; Explorer.dll: 显示资源管理器面板; Fonts.dll: 字体不用安装到系统就可动态的加载; Format.dll: 行的排序和排列,提取唯一行,提取或删除重复行,固定换行……; FullScreen.dll: 全屏显示的切换插件; HexSel.dll: 文本与十六进制值的相互转换 (包含 ANSI 和 UNICODE); HotKeys.dll: 自定义热键; LineBoard.dll: 显示行号和支持书签操作; Log.dll: 监视日志或捕捉实时输出; Macros.dll: 录制用户的键盘动作并可随后重复它们; MinimizeToTray.dll: 最小化程序到系统托盘; QSearch.dll: 提供一个“快速”文本搜索的小面板; RecentFiles.dll: 管理文件列表; SaveFile.dll: 可以设置自动保存的间隔时间等; Scripts.dll: 脚本插件,基于 Windows 脚本宿主 (WSH) 引擎,因此您可以使用各 种各样的 Windows 组件对象模型 (COM) 的对象,例如,您可以使用 RegExp 对象来执行正则表达式查找替换、筛选文本行,去除行头尾的 空字符,使用 FileSystemObject 对象来操作文件,创建快捷方式, 使用 WshShell 对象来操作 Windows 注册表,或使用 WshNetwork 对 象来运行网络功能,此外,您可以创建和执行利用一个支持自动化的 外部应用程序 (如 Word 和 Excel) 脚本……不仅如此,Scripts.dll 还为 AkelPad 而预置了一些常用的方法调用,可以调用 WinAPI 函 数,从而可以创建有用户交互界面的脚本(如SearchReplace.js等,方 法调用见 Scripts-Chs.txt),和实现更多功能…… Scroll.dll: 拆分窗格或MDI窗口的水平/垂直的同步滚动、自动滚动操作; Sessions.dll: 保存和恢复程序 MDI 会话; SmartSel.dll: 选定文本时排除行尾标记,Home 和 End 键的智能操作; Sounds.dll: 打字时发出声音; SpecialChar.dll: 显示和高亮特殊字符 (空格、制表符、换行符、自动换行、垂直 制表符、换页符、空字符); Speech.dll: 机器朗读选定的文本。未翻译; Stats.dll: 统计显示文档的字符数、单词数、行数等; Templates.dll: 使用预设的模板来创建文档; ToolBar.dll: 工具栏插件,可显示和自定义常用操作的工具栏; XBrackets.dll: 可以在键入左括号时自动键入右括号并把光标置中 (可能与一些中 文输入法不兼容而无法自动完成右括号),高亮显示、跳转配对的括 号,选定括号间的文本。 主程序及所有插件是经过翻译了源代码后使用编译器编译生成的。
吸取前辈的经验,自己写了个VB6.0 DLL文件的编译链接插件,按照以下方法,可以在VB 6.0中直接编译生成带外部输出的DLL文件。   1. 把MakeDLL.dll和MakeDLL.exe两个文件复制入VB所在目录,例如   "C:\Program Files\Microsoft Visual Studio\VB98"   2. 把Module1DLL.bas和Standard DLL.vbp两个文件复制入VB所在目录下的   Template目录下的Projects目录,例如   "C:\Program Files\Microsoft Visual Studio\VB98\Template\Projects"   3. 启动VB 6.0,随便选择建立一种什么类型的程序,然后主菜单选择"外接程序"   再选择"外接程序管理器",你应该可以看到在列表中有"Create DLLs in VB 6.0,然后选择它,并在窗口右下方的"加载行为"中把"在启动中加载"和"加载/卸载"都钩选,点确定,再次关闭VB 6.0   4. 再次启动VB,建立一个ActiveX DLL程序,这个时候点主菜单"文件",可以看到"生成工程1.DLL(K)"和"选择DLL出口函数"菜单项目。   好了,大功告成,现在你的VB 6.0已经可以直接编译链接标准的DLL文件了,造作方法,如下:   建立ActiveX dll程序,添加一个模块(DLL的函数只能在模块中才有效),在模块中编写你的DLL function过程函数,编写完毕,点保存,然后点"文件"菜单下的”选择DLL出口函数",在弹出窗口中选择需要申明为可以外部调用的   function,然后确定,最后点"文件"->"生成xxx.dll(K)",编译生成DLL。   需要注意的地方如下:   1. 程序代码必须在模块中编写   2. 需要申明为外部调用的函数必须为Public   3. DLL代码中必须包含一个function DLLmain函数和一个sub Main,不过function DLLmain会被执行,而sub main只是摆设,其中的代码不会运行,但是必须有这个东西(_)。   4. DLL代码编写没有什么特殊的要求,可以做一切可以在VB中用的东西,比如调用API啊,编写嵌入代码啊(关键)……

16,471

社区成员

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

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

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