界面动态配置:持久化反持久化

界面在可配置的情况下需要读写配置文件,VCL提供了一种方式 TReader 和 TWriter 方式保存界面资源。

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = ‘Form1‘
  ...  object lbl1: TLabel
    Left = 200
    Top = 152    ...
  end
  object btn1: TButton
    Left = 184
    ...  end
end

直接存成文本格式资源文件,只要是对象继承于TPersistent所有属性字段都能正常被初始化。同时他内部的子对象通过嵌套方式持久化。

基于这种比较简单的嵌套模式存贮方案。

1、读取配置并生成界面的过程

  1. 先加载自身的属性信息
  2. 在加载子模块的配置信息
  3. 触发界面初始化加载事件

通过上述三步骤实现对类似Delphi界面配置信息的读取。考虑到具体配置文件格式的存储位置和方式交由框架实现因此对其接口化

IViewStore 实现了基本的读写属性值的方式。

IViewStoreAttributs 接口并不是必须的,可以实现也可以不实现。增加这个接口的目的是为同一个地方配置所有需要持久化的属性。可以理解为Publish的公共属TFiler通过RTTI获取所需要持久化的信息,方便在获得所有相关的信息。

 1 //1 保存属性
 2 ///
 3 ///  界面需要保存和还原的的属性信息
 4 ///  为了减少复杂度,属性信息竟然不要嵌套
 5 IViewStoreAttributs = interface
 6   [‘{E4C17A34-83AC-4C32-BD18-4C76A9F56D75}‘]
 7   function GetCount: Integer; stdcall;
 8   function GetNames(Index: Integer): WideString; stdcall;
 9   function GetValues(Index: Integer): WideString; stdcall;
10   procedure SetValues(Index: Integer; const Value: WideString); stdcall;
11   property Count: Integer read GetCount;
12   property Names[Index: Integer]: WideString read GetNames;
13   property Values[Index: Integer]: WideString read GetValues write SetValues;
14 end;
15
16 //1 界面数据存储
17 ///
18 ///  用于保存界面特有数据信息
19 ///  比如视图位置
20 IViewStore = interface(IInterface)
21   [‘{BBC202FA-03D7-4A1F-BB28-13990DB87F1E}‘]
22   procedure Clear; stdcall;
23   function Count: Integer; stdcall;
24   procedure Erase(const AName: WideString); stdcall;
25   function Exists(const AName: WideString): Boolean; stdcall;
26   function GetNames(Index: Integer): WideString; stdcall;
27   function GetValueOfIndex(Index: Integer): WideString; stdcall;
28
29   function ReadBool(const AName: WideString; Default: Boolean): Boolean; stdcall;
30   function ReadFloat(const AName: WideString; Default: Double): Double; stdcall;
31   function ReadInteger(const AName: WideString; Default: Longint): LongInt; stdcall;
32   function ReadString(const AName, Default: WideString): WideString; stdcall;
33   procedure WriteBool(const AName: WideString; Value: Boolean); stdcall;
34   procedure WriteFloat(const AName: WideString; Value: Double); stdcall;
35   procedure WriteInteger(const AName: WideString; Value: Longint); stdcall;
36   procedure WriteString(const AName, Value: WideString); stdcall;
37
38   procedure WriteAttribs(const Attribs: IViewStoreAttributs); stdcall;
39   procedure ReadAttribs(const Attribs: IViewStoreAttributs); stdcall;
40   procedure Write(const AName:WideString; out AStore:IViewStore); stdcall;
41   function  Read(const AName:wideString; out AStore:IViewStore):Boolean stdcall;
42
43   property Names[Index: Integer]: WideString read GetNames;
44   property ValueOfIndex[Index: Integer]: WideString read GetValueOfIndex;
45 end;

对于模块嵌套考虑

1     procedure WriteAttribs(const Attribs: IViewStoreAttributs); stdcall;
2     procedure ReadAttribs(const Attribs: IViewStoreAttributs); stdcall;
3     procedure Write(const AName:WideString; out AStore:IViewStore); stdcall;
4     function  Read(const AName:wideString; out AStore:IViewStore):Boolean stdcall;

使用Write 和 Read 函数获得 IViewStore 这样外部不要考虑接口实例的具体创建方法。

同时对于一些简单的对象只要实现 IViewStoreAttributs 接口,在持久化和初始化的时候不用考虑谁帮你初始化。

相关问题:

如果要实现全自动加载,是否应该加强IViewStoreAttributs 接口就能达到目的?

http://www.cnblogs.com/gleam/archive/2012/12/06/2804933.html

时间: 2024-10-18 01:28:55

界面动态配置:持久化反持久化的相关文章

Quartz动态配置表达的方法

在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度.有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间,非常easy.比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好. Spring配置文件 Xml代码?? <bean?id="jobDetail"?class="org.springframework.

Quartz 在 Spring 中如何动态配置时间--转

原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源调度组件,因为很多项目使用过,Spring结合Quartz静态配置调度任务时间,非常easy.比如:每天凌晨几点定时运行一个程序,这只要在工程中的spring配置文件中配置好spring整合quartz的几个属性就好. Spring配置文件 引用 <bean id="jobDetail&quo

三大框架 之 Hibernate生成策略与缓存策略(主键生成策略、持久化、持久化类划分、一级缓存、事物管理)

目录 Hibernate生成策略与缓存策略 主键生成策略 主键分类 主键的生成策略 持久化 什么是持久化 什么是持久化类 持久化类编写规则 持久化类的划分 三种状态区分 持久态对象特征 一级缓存 什么是缓存 一级缓存 一级缓存特点 一级缓存内部结构 事务管理 什么是事务 事务特性 事务的隔离级别 Hibernate设置事务的隔离级别 事务业务层连接 Hibernate生成策略与缓存策略 主键生成策略 主键分类 自然主键 主键本身就是表中的一个字段 实体中一个具体的属性,对象本身唯一的特性 创建一

SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-2

接 SpringBoot 动态配置数据源-进阶-可视化动态配置数据源-1 配置文件修改后,需要使配置生效 采用springcloud 配置 jar :  spring-cloud-starter-config + spring-boot-starter-actuator <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuat

Quartz实现JAVA定时杏彩平台出租任务的动态配置

先说点无关杏彩平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com 本文的问题,这段时间特别的不爽,可能有些同学也遇到过.其实也可以说是小事一桩,但感觉也是不容忽视的.我刚毕业时的公司,每个人每次提交代码都有着严格的规范,像table和space的缩进都有严格的要求,可以说你不遵守开发规范就相当于线上bug问题,还是比较严重的.现在发现外面的公司真的是没那么重视这个不重要却又特别重要的问题啊,啊啊啊啊啊啊!!! 什么是动态配置定时任务?

微服务架构:动态配置中心搭建

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息处理方式是将配置信息写入xml..properties等配置文件中,和应用一起打包,每次修改配置信息,都需要重新进行打包,效率极低,动态配置中心就是为了解决这一问题.动态配置中心也是一个微服务,我们把微服务中需要动态配置的配置文件存放在远程git私有仓库上,微服务会去服务器读取配置信息,当我们在本地

AnimalWindow使用,实现界面动态消失

http://m.blog.csdn.net/blog/shufac/24932279 http://blog.sina.com.cn/s/blog_455245fc01000a42.html AnimalWindow使用,实现界面动态消失 创建一个窗口,拖进一个按钮,添加下列消息响应 void CMFCApplication4Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 //定义AnimateWindow的函数指针 //测试一 // t

选择优势股票,动态配置

选择优势股票,动态配置 [ 孤舟一叶飘 ] 于:2009-06-03 13:35:36 复:2222673 设法将市场趋势和价值趋势有机结合,选择优势股票,动态配置,具体作法是: 选择优势股票: 1.优势行业 选出未来5年稳步.快速发展的6个优势行业.每周或每月要重新审查一次. 2.优势企业 在各优势行业中选出1-2家的优势企业(行业第一名或唯一). 3.善于利用市场的情绪化特点来发现.捕获优势股票投资时机. 动态配置: 不断检视手中股票,发现市场安全边际更大或价值趋势更明显的优势股票立即换股,

Spring动态配置多数据源

Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. 基本信息 1.Spring配置多数据源的方式和具体使用过程. 2.Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况: 一是,表级上的跨数据库.即,对于不同的数据库却有相同的表(表名和表结构完全相