《Mastering Delphi 6》学习笔记之十

原创 2001年12月04日 09:49:00

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也不是遥不可及的事情了吧!

 

【机器学习-斯坦福】学习笔记6 - 朴素贝叶斯

本次课程大纲: 1、 朴素贝叶斯 - 朴素贝叶斯事件模型 2、 神经网络(简要) 3、 支撑向量机(SVM)铺垫 – 最大间隔分类器...
  • maverick1990
  • maverick1990
  • 2013年11月14日 12:41
  • 4766

视觉slam14讲学习笔记(持续更新中)

写在最前面: SLAM特指:特指搭载传感器的主体,在没有环境先验的信息情况下,在运动过程中建立环境模型,通过估计自己的运动。 SLAM的目的是解决两个问题:1、定位 2、地图构建 也就是...
  • David_Han008
  • David_Han008
  • 2017年05月07日 21:37
  • 8041

C++primer第五版第十一章学习笔记

练习11.1:描述map和vector的不同。 vector这种顺序容器,元素在其中按顺序存储,每个元素都有唯一对应的位置编号,所有操作都是按编号进行的。例如,获取元素,插入删除元素,遍历元素。底层的...
  • sunhero2010
  • sunhero2010
  • 2015年11月14日 09:32
  • 1268

Delphi中Chrome Chromium、Cef3学习笔记(二)

用Tchromium替换webbrowser   用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。   要把用习惯的EmbeddedWB换成完全...
  • xtfnpgy
  • xtfnpgy
  • 2015年06月25日 14:09
  • 2779

AppleScript学习笔记(六)处理程序Handler

进入AS4AS书中的最后一章了,本章说的内容类似于OC中的方法和其调用。本文的内容:(1)定义和调用Handler (2)load script...
  • u010962810
  • u010962810
  • 2014年03月01日 10:55
  • 2999

理解windows消息机制-delphi消息机制学习笔记。

一、什么是消息? 消息是windows对应用程序发送的有关‘发生了某种事件’的通知。例如点击鼠标,调整窗口大小或键盘上按下一个键,都会引起windows发送一条消息到应用程序中去,去通知应用程序...
  • chinajobs
  • chinajobs
  • 2016年06月23日 16:39
  • 453

学习理论之模型选择——Andrew Ng机器学习笔记(八)

内容提要这篇博客主要的内容有: 1. 模型选择 2. 贝叶斯统计和规则化(Bayesian statistics and regularization)最为核心的就是模型的选择,虽然没有那么多复杂...
  • A_cainiao_A
  • A_cainiao_A
  • 2016年01月09日 19:07
  • 1236

CAN总线学习笔记四:CAN总线通信

CAN总线学习笔记四:CAN总线通信     在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置的,分析P...
  • delphi308
  • delphi308
  • 2013年03月08日 21:41
  • 2067

Delphi中Chrome Chromium、Cef3学习笔记(一)

官方下载地址:https://cefbuilds.com/ CEF简介:     嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在20...
  • xtfnpgy
  • xtfnpgy
  • 2015年06月25日 13:25
  • 4877

《机器学习》--周志华 (第六章学习笔记)

支持向量机间隔与支持向量​ 在样本空间中寻找一个超平面,将不同类别的样本分开​ “正中间”的:鲁棒性最好,泛化能力最强​ ​ 对偶问题 拉格朗日乘子法第...
  • Cristal_yin
  • Cristal_yin
  • 2017年07月30日 08:31
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Mastering Delphi 6》学习笔记之十
举报原因:
原因补充:

(最多只允许输入30个字)