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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

90基于matlab的无迹卡尔曼滤波器参数估计的非线性最小二乘优化

基于matlab的无迹卡尔曼滤波器参数估计的非线性最小二乘优化&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 90matlab无迹卡尔曼滤波器参数估计 (xiaohongshu.com)

基于社区电商的Redis缓存架构-缓存数据库双写、高并发场景下优化

基于社区电商的Redis缓存架构 首先来讲一下 Feed 流的含义&#xff1a; Feed 流指的是当我们进入 APP 之后&#xff0c;APP 要做一个 Feed 行为&#xff0c;即主动的在 APP 内提供各种各样的内容给我们 在电商 APP 首页&#xff0c;不停在首页向下拉&#xff0c;那么每次拉的…

SQL Server 2008 使用concat报错

SQL Server 2008 使用concat报错 在 SQL Server中&#xff0c;CONCAT 函数是从 SQL Server 2012 版本开始引入的&#xff0c;所以在 SQL Server 2008 中使用 CONCAT 函数会导致错误。 如果你想要连接字符串&#xff0c;有几种替代方法可以考虑&#xff1a; 使用 运算符&…

CBV源码

views: from django.views import Viewclass MyLogin(View):def get(self,request):return HttpResponse(get方法)def post(self,request):return HttpResponse(post方法) urls: path(MyLogin,views.MyLogin.as_view()), CBV源码分析: as_view()为入口 path(MyLogin,vie…

CentOS 7 部署 Nacos (单机版)

CentOS 7 部署 Nacos &#xff08;单机版&#xff09; 1. 下载 Nacos 安装包 历史版本&#xff1a;https://github.com/alibaba/nacos/releases/ 我选的是 2.1.0 版本&#xff0c;https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz 2. …

C# WPF 基础教程——触发器、行为、形状、变换与透明、路径和几何图形

触发器 简单触发器 单条件触发器 多条件触发器 事件触发器 行为 形状 矩形和椭圆 Viewbox缩放控件&#xff0c;直线&#xff0c;折线&#xff0c;多边形 画刷 普通画刷 线性渐变画刷 环形渐变画刷 位图画刷 虚拟画刷&#xff08;复制元素外观&#xff09; 位图缓存画刷 变换…

Django 用户验证与权限管理

Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探究一下Django如何处理用户验证和权限管理的。 用…

Halcon Solution Guide I basics(5): 1D Measuring(一维测距)

文章专栏 我的Halcon开发 CSDN 专栏 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 随笔分类 - Halcon入门学习教程 前言 今天来学直线测距&#xff0c;主要是用来测量连点之间的线段距离。感觉是用来得到工业产品精度的。 文章解读 一维测距是非常简单的这里…

分开站两排

体育课上全班同学站成一排&#xff0c;体育老师让同学们从第1位同学开始&#xff0c;按1、2、1、2、1、2……的方式报数&#xff0c;报1的同学留在原地&#xff0c;报2的同学向后退一步&#xff0c;报数完毕后形成两排。现在我们已经知道同学们学号的分布&#xff0c;那么你能分…

小航助学题库蓝桥杯题库c++选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

burp2023专业版,配置上游代理太难找

burpsuite2023专业版的工具栏与之前的版本不同的是&#xff0c;工具栏中没有了user options这一选项 但在通常的使用过程中&#xff0c;常用到配置上游代理。之前的版本呢&#xff0c;上游代理的配置都在user options选项中设置&#xff0c;user options选项还在工具栏中&#…

血的教训---入侵redis并免密登录redis所在服务器

血的教训—入侵redis并免密登录redis所在服务器 今天就跟着我一起来入侵redis并免密登录redis所在服务器吧&#xff0c;废话不多说&#xff0c;我们直接开始吧。 这是一个体系的学习步骤&#xff0c;当然如果基础扎实的话可以继续往下面看 以下都是关联的文章&#xff0c;可以学…

机器学习:DBSCAN算法(效果比K-means好)

基本概念 核心对象&#xff1a;以点为圆心半径为r的圆&#xff0c;如果圈里面的样本点大于给定的阈值(minPts)&#xff0c;那么这个点就叫做核心点 直接密度可达&#xff1a;点p在q为圆心的圆内 密度可达&#xff1a; p1与p2直接密度可达&#xff0c;p2与p3直接密度可达&…

[node]Node.js多线程

[node]Node.js多线程 Node.js 多进程exec()使用语法示例 spawn()使用语法示例 fork()使用语法示例 Node.js 多进程 Node.js 是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提…

记录创建粒子的轻量级JavaScript库——particles.js(可用于登录等背景显示)

文章目录 前言一、下载particles.js二、引入particles.js并使用三、配置数据说明如有启发&#xff0c;可点赞收藏哟~ 前言 本文记录使用创建粒子的轻量级JavaScript库 particles.js 可用于登录等背景显示 一、下载particles.js 先下载particles.js库&#xff0c;放在项目libs…

msyql迁移到mongodb

关系型数据库迁移到mongodb的理由 高并发需求&#xff0c;关系型数据库不容易扩展 快速迭代 灵活的json模式 大数据量需求 应用迁移难度&#xff1a; 关系型到关系 oracle-》mysql oracle -》 postgresql 关系到文档- oracle -》 mongodb 需要考虑&#xff1a; 总体架构&#…

vue3实现元素拖拽移动功能

效果图 实现拖拽移动 首先我们给需要实现功能的元素加一个draggable"true"让元素能够被拖拽 先来认识两个搭配draggable属性一起使用的事件——ondragstart和ondragend&#xff0c;它们的定义分别为&#xff1a; ①. ondragstart 事件在用户开始拖动元素或选择的文…

如何使用录屏软件在电脑录制PDF文件

我有一个PDF文件&#xff0c;想用录屏软件将它录制下来并添加上详细的注释&#xff0c;然后发给客户看&#xff0c;请问应该如何录制呢&#xff1f;有没有推荐的录屏软件呢&#xff1f; 不用担心&#xff0c;本文将会详细的为您讲解如何使用录屏软件在电脑端录制PDF文件&#…

PTA 哈利波特的考试

哈利波特要考试了&#xff0c;他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha&#xff0c;将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念&#xff0c;例如ahah可以将老鼠变成猫。另外&…

从0到1搭建kafka集群

准备服务器 3台服务器对应3个node&#xff0c;分别如下&#xff1a; node1:192.168.1.101 node2:192.168.1.102 node3:192.168.1.103 下载安装包 下载zookeeper https://dlcdn.apache.org/zookeeper/ 下载kafka https://kafka.apache.org/downloads 安装步骤 zookeeper…