Delphi语言怎样对自己定义类进行持久化保存及恢复 (性能远比json/xml高)

本文主要是介绍Delphi语言怎样对自己定义类进行持久化保存及恢复 (性能远比json/xml高),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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高)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/441289

相关文章

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚