CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

VCL有MFC里 串行化 那样的机制么,怎样实现的,如何使用

楼主llwwwww(小风(我的帖子顶起来都有分,这一点你放心))2003-08-03 10:37:53 在 Delphi / VCL组件开发及应用 提问

小弟刚从VC转过来,什么也不懂,还请各位说清楚一点 问题点数:100、回复次数:7Top

1 楼ljmanage(过客)回复于 2003-08-03 10:52:22 得分 100

TReader  
  TWriter  
  和VC中的Serie...一样的  
  Top

2 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 10:54:01 得分 0

学习........Top

3 楼wenxj()回复于 2003-08-03 12:04:27 得分 0

delphi里的很多对象都有savetofile(filename   :string)和Loadfromfile(filename   :   string)这样的过程,直接调用就行了。Top

4 楼llwwwww(小风(我的帖子顶起来都有分,这一点你放心))回复于 2003-08-03 19:16:23 得分 0

VC里类中加入成员变量,要改写virtual   void   Serialize(   CArchive&   ar   );  
   
  Dephi   如何做类似的事呢Top

5 楼llwwwww(小风(我的帖子顶起来都有分,这一点你放心))回复于 2003-08-03 19:17:20 得分 0

二楼的  
   
  都一颗红心了,说点什么啊Top

6 楼ljmanage(过客)回复于 2003-08-03 19:30:13 得分 0

跟你说了你又不信就是用TReader  
  TWriter  
  我把全部代码贴给你好了  
      Delphi中的Serialiation          
      Delphi中的Serialiation    
  熟悉MFC的人对Serialize这个虚拟函数大概不会陌生。在MFC中,如果要用Serialization机制读取和保存数据,大概是这样:  
   
  void   CMyDoc::Serialize(CArchive&   ar)  
   
  {  
   
  if   (ar.IsStoring())  
   
  {  
   
  ar   <<   myString;  
   
  ar   <<   myInt;  
   
  }  
   
  else  
   
  {  
   
  ar   >>   myString;  
   
  ar   >>   myInt;  
   
  }  
   
  }  
   
  Object   Pascal中有没有类似的机制呢?接触到TReader和TWriter这两个类之后,我知道我找到答案了。  
   
  不需多讲理论,来看一个实际的例子。在Form上面放三个Edit和两个Button,另外再加一个OpenDialog和SaveDialog。代码如下:  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
   
  begin  
   
  if   SaveDialog1.Execute   then  
   
  Serialize(SaveDialog1.FileName,True);  
   
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
   
  begin  
   
  if   OpenDialog1.Execute   then  
   
  Serialize(OpenDialog1.FileName,False);  
   
  end;  
   
  procedure   TForm1.Serialize(const   FileName:string;   bSave:   Boolean);  
   
  var  
   
  Reader   :   TReader;  
   
  Writer   :   TWriter;  
   
  Stream   :   TFileStream;  
   
  begin  
   
  if   bSave   then   begin  
   
  Stream   :=   TFileStream.Create(FileName,fmOpenWrite   or   fmCreate);  
   
  Writer   :=   TWriter.Create(Stream,4096);  
   
  Writer.WriteString(Edit1.Text);  
   
  Writer.WriteInteger(StrToInt(Edit2.Text));  
   
  Writer.WriteFloat(StrToFloat(Edit3.Text));  
   
  Writer.Free;  
   
  Stream.Free;  
   
  end  
   
  else   begin  
   
  Stream   :=   TFileStream.Create(FileName,fmOpenRead);  
   
  Reader   :=   TReader.Create(Stream,4096);  
   
  Edit1.Text   :=   Reader.ReadString;  
   
  Edit2.Text   :=   IntToStr(Reader.ReadInteger);  
   
  Edit3.Text   :=   FloatToStr(Reader.ReadFloat);  
   
  Reader.Free;  
   
  Stream.Free;  
   
  end;  
   
  end;  
   
  如果愿意的话,完全可以将Serialize包装成一个virtual   method,从而让派生类中的实现更加简洁。  
   
  TReader和TWriter不仅能够读取和写入Object   Pascal中绝大部分标准数据类型,而且能够读写Collection/List/Variant这些高级类型,甚至能够读写Perperties和Component。不过,TReader/TWriter自身实际上提供的功能很有限,大部分实际的工作是由TStream这个非常强大的类来完成的。从TReader和TWriter的声明中可以看到一些特别为Component而设计的方法,不难猜想,Delphi开发环境本身很可能就是利用TReader/TWriter,将构件的属性写入.DFM文件以及从.DFM文件中读取属性值的。  
   
  下面的例子很有用也非常有趣,它的效果完全相当于Form   Designer中的View   As   Text命令:  
   
  var  
   
  DFMBuf,   TextBuf   :   TStream;  
   
  begin  
   
  DFMBuf   :=   TMemoryStream.Create;  
   
  DFMBuf.WriteComponent(Self);  
   
  TextBuf   :=   TMemoryStream.Create;  
   
  DFMBuf.Seek(0,soFromBeginning);  
   
  ObjectBinaryToText(DFMBuf,TextBuf);  
   
  TextBuf.Seek(0,soFromBeginning);  
   
  Memo1.Lines.LoadFromStream(TextBuf);  
   
  TextBuf.Free;  
   
  DFMBuf.Free;  
   
  甚至可以从可执行文件中读取Form的信息:  
   
  var  
   
  DFMBuf,   TextBuf   :   TStream;  
   
  buf   :   pointer;  
   
  begin  
   
  DFMBuf   :=   TResourceStream.Create(HInstance,'TForm1',RT_RCDATA);  
   
  DFMBuf.Position   :=   0;  
   
  TextBuf   :=   TMemoryStream.Create;  
   
  DFMBuf.Seek(0,soFromBeginning);  
   
  ObjectBinaryToText(DFMBuf,TextBuf);  
   
  TextBuf.Seek(0,soFromBeginning);  
   
  Memo1.Lines.LoadFromStream(TextBuf);  
   
  TextBuf.Free;  
   
  DFMBuf.Free;  
   
  end;  
   
  (说明:如果窗体不是TForm1,那么请将TResourceStream.Create一句中的第二个参数改为相应的窗体类名。)  
   
  好好读懂这些代码,相信自己做一个DFM   Viewer也不是遥不可及的事情了吧!Top

7 楼llwwwww(小风(我的帖子顶起来都有分,这一点你放心))回复于 2003-08-19 21:26:36 得分 0

谢谢,还有一点疑问  
   
  如果要存一棵树,每个结点都有自定义数据  
   
  该怎么做有利于扩展?Top

相关问题

  • 请问delphi(VCL)中有没有类似Mfc中Update_Command_UI的机制?
  • VCL中使用MFC
  • 在mfc结构中,怎样用串行化读取一个文本文件
  • xzgyb(老达摩)等高手能否撰文谈谈vcl的内部运行机制?就像<深入浅出mfc>那样.
  • 关于MFC消息机制的问题
  • 可以在atl中使用mfc的消息机制吗?
  • 高手帮忙:mfc中sdi程序菜单的机制。
  • .NET里面得消息机制和MFC的一样吗?
  • 谁知道,MFC的CTreeView与CTreeCtrl的调用机制
  • MFC文档的串行化讲解(通俗易懂、量少),请不明之人进来学习,请高手指正。

关键词

  • 代码
  • 文件
  • 数据
  • delphi
  • textbuf
  • dfmbuf
  • twriter
  • treader
  • sofrombeginning
  • beginif

得分解答快速导航

  • 帖主:llwwwww
  • ljmanage

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo