Delphi的RTL自身就带有一套很好的资源持久化保存(IDE设计窗体时,保存为DFM格式及编译到EXE里面的资源文件)及恢复机制(EXE启动时对窗体资源的加载),那么应没必要再额外用xml/json格式保存程序的参数了,我们大可以将参数集中在一个参数类里面,然后通过这套机制进行保存及恢复。

由于我们的参数类型可能五花八门,除了传统的整数、小数、字符串、true/false、还有可能是数组、列表、枚举等,则需要override DefineProperties这个函数来自定义属性的保存及恢复。

废话少说,给出代码,此代码演示了如何自定义数据的保存及恢复、以及保存整个Form:

 unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTArrayOfInteger = array of integer;TSetting = class(TComponent)privatefIntVal: integer;fIntArr: TArrayOfInteger;procedure ReadIntArr(Reader: TReader);procedure WriteIntArr(Writer: TWriter);protectedprocedure DefineProperties(Filer: TFiler); override;publicproperty intArr: TArrayOfInteger read fIntArr write fIntArr;publishedproperty intval: integer read fIntVal write fIntVal;end;TForm1 = class(TForm)btnCloneClass: TButton;mmo1: TMemo;btnCloneForm: TButton;procedure btnCloneClassClick(Sender: TObject);procedure btnCloneFormClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}{ TSetting }procedure TSetting.DefineProperties(Filer: TFiler);begininherited;Filer.DefineProperty('intArr', ReadIntArr, WriteIntArr, true);end;procedure TSetting.ReadIntArr(Reader: TReader);varlvIdx: integer;beginfIntArr := nil;Reader.ReadListBegin;SetLength(fIntArr,Reader.ReadInteger);lvIdx:=low(fIntArr);while not Reader.EndOfList dobeginfIntArr[lvIdx] := Reader.ReadInteger;inc(lvIdx);end;Reader.ReadListEnd;end;procedure TSetting.WriteIntArr(Writer: TWriter);vari: integer;beginWriter.WriteListBegin;Writer.WriteInteger(integer(Length(fIntArr)));for i := Low(fIntArr) to High(fIntArr) dobeginWriter.WriteInteger(fIntArr[i]);end;Writer.WriteListEnd;end;function ClassToStr(pvClass: TComponent): ansiString;varinStream, outStream: TMemoryStream;begininStream := TMemoryStream.Create;outStream := TMemoryStream.Create;tryinStream.WriteComponentRes(pvClass.ClassName, pvClass);// inStream.WriteComponent(pvClass);inStream.Position := 0;ObjectResourceToText(inStream, outStream);// ObjectBinaryToText(inStream,outStream);outStream.Position := 0;SetLength(Result, outStream.Size + 1);FillChar(Result[1], outStream.Size + 1, 0);outStream.ReadBuffer(Result[1], outStream.Size);finallyFreeAndNil(inStream);FreeAndNil(outStream);end;end;function StrToClass(pvStr: ansiString; pvCmpToSetProperties: TComponent=nil): TComponent;varinStream, outStream: TMemoryStream;begininStream := TMemoryStream.Create;outStream := TMemoryStream.Create;tryif (pvStr <> '') theninStream.WriteBuffer(pvStr[1], length(pvStr));inStream.Position := 0;ObjectTextToResource(inStream, outStream);// ObjectTextToBinary(inStream,outStream);outStream.Position := 0;Result := outStream.ReadComponentRes(pvCmpToSetProperties);finallyFreeAndNil(inStream);FreeAndNil(outStream);end;end;procedure TForm1.btnCloneClassClick(Sender: TObject);varlvObj, lv1: TSetting;lvStr: String;lvArr: TArrayOfInteger;beginlvObj := TSetting.Create(nil);trylvObj.intval := 12345;SetLength(lvArr, 3);lvArr[0] := 222;lvArr[1] := 333;lvArr[2] := 444;lvObj.intArr := lvArr;lvStr := ClassToStr(lvObj);RegisterClass(TSetting);lvObj.intval := 1;lv1 := TSetting(StrToClass(lvStr, nil));if (lv1.intval > lvObj.intval) thenmmo1.Text := lvStr;finallyFreeAndNil(lvObj);FreeAndNil(lv1);end;// WriteComponentResFile(ExtractFilePath(ParamStr(0))+ 'd.res',self);end;procedure TForm1.btnCloneFormClick(Sender: TObject);var lvNewForm:TForm1;lvRes:string;beginlvRes:=ClassToStr(self);RegisterClass(TForm1);lvNewForm:=TForm1.CreateNew(application);StrToClass(lvRes,lvNewForm);lvNewForm.Left:=self.Left+50;lvNewForm.Top:=self.Top+50;end;end.

Delphi语言如何对自定义类进行持久化保存及恢复 (性能远比json/xml高)相关推荐

  1. 安卓自定义View的状态保存与恢复

    安卓自定义View的状态保存与恢复 我们在开发某些安卓应用(如安卓小游戏)时,可能会用到自定义View,这时候往往需要保存自定义View的状态信息,以便在遇到某些情况(如由于系统内存资源紧张被系统杀死 ...

  2. Flex 序列化自定义类 解决 sharedObject 保存自定义对象

    问题 我想把自定义类实例存储到LSO 解决办法 使用flash.net.registerClassAlias( )方法保留类型信息并把类实例添加到共享对象的data属性上. 讨论 LSOs 使用特殊的 ...

  3. joblib自定义类的使用细节

    问题根源: 问题描述: 自定义类与joblib保存的代码放在一块: one.py: class Own():      pass if __name__=="__main__": ...

  4. Tensorflow |(5)模型保存与恢复、自定义命令行参数

    Tensorflow |(1)初识Tensorflow Tensorflow |(2)张量的阶和数据类型及张量操作 Tensorflow |(3)变量的的创建.初始化.保存和加载 Tensorflow ...

  5. DELPHI 中的自定义类笔记(一) OBJECT 创建类 不用 CREATE 【转】

    原文:http://www.cnblogs.com/delphi-xe5/articles/3884154.html Delphi 中的自定义类笔记(一) 类的声明 有两种声明办法 一.自定义类的父类 ...

  6. matlab 自定义对象,面向对象:MATLAB的自定义类 [MATLAB]

    这几天刚刚开始学习MATLAB的面向对象编程.以前做的事情都是用MATLAB写一些简单的脚本或者函数,这方面MATLAB成熟的函数和直截了当的矩阵运算方法和语法都很容易上手,方便人专注于算法本身.前几 ...

  7. C语言中的自定义类型

    C语言中的自定义类型 (一)结构体 结构体的声明 结构体是一些值的集合,这些值称为成员变量,结构体的成员可以是不同类型的变量: 结构体的声明 struct tag { member-list; }va ...

  8. python类定义的讲解_python面向对象、自定义类等使用实例讲解

    python 面向对象相对别的语言来说缺少两个功能: 1.python不具备重载,重载是指在同一个类中,使得方法有相同的名称,但是有不同的参数列表,但由于python函数具有强大的参数处理功能,因此这 ...

  9. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用

    我无法解决看似微不足道的问题.我的问题可能是缺乏对Kotlin语言的经验(和理解).不过,我将需要帮助. 我做了一个自定义类,其中包含一个自定义函数.看起来很简单,但是当我尝试使用此功能时,我一直收到 ...

最新文章

  1. 团队工具_「管理工具」部门有效管理的5个工具,打造高效团队
  2. Java 7代码层面上的更新
  3. NSUserDefaults的用法(轻量级本地数据存储)
  4. 深度学习在美图个性化推荐的应用实践
  5. jvm系列(九):如何优化Java GC「译
  6. SAP S/4HANA key user tool extensibility原理
  7. 【渝粤题库】国家开放大学2021春4010渠道管理题目
  8. liunx常用命令笔记
  9. CString TCHAR互相转换
  10. 阿里格林深瞳计算机视觉岗实习面经
  11. NSLog各数据类型的输出
  12. 腾讯社交广告转化率预估初探
  13. python selenuim使用代理的方式
  14. 各类原版系统下载:在MSDN下载Windows、MacOS、Linux原版系统镜像
  15. 基于FPGA(cyclone IV)的NOR FLASH的应用
  16. UnityAR-平面检测
  17. 东京奥组委公布奥运志愿者和城市志愿者昵称
  18. java 判断图片否旋转,Java实现图片任意角度旋转
  19. java.security.cert.CertificateException: X.509 not found,X.509证书找不到
  20. 序 -- 慕司板IAP15

热门文章

  1. 新农慕课python答案、第七周_中国大学MOOC(慕课)_Python机器学习应用_章节答案期末答案...
  2. OverFeat 论文 笔记
  3. 通俗理解JavaScript闭包
  4. WinXP优化 全面消除操作系统的复制乱码(转)
  5. [太原理工大学] 2023 信息安全技术考试 选择填空判断简答
  6. 国产机开始在海外大卖了?网友:简直是火得一塌糊涂
  7. Compatibility模式安装windows7后改为AHCI模式无法启动Windows7的解决办法
  8. tortoise.exceptions.OperationalError: near “ORDER“: syntax error
  9. 91-----100
  10. 感知世界的最新利器、毫米波技术的继任者——超宽带(UWB)雷达技术