一般来说,程序多少都会有一些自己的配置信息要保存,不论是通常用的保存到INI还是注册表,或者是XML甚至YAML,总归是要写不少代码处理的。
问题的麻烦在于,程序中实现操作配置信息通常并不需要关注它是保存在什么地方,以什么格式保存,但是传统的方法不论是调用TIniFile还是TRegistry或者是DOM,都是需要开发者花一些时间精力浪费在这上面。
我前一阵写个小程序,不高兴弄配置这些麻烦事,于是利用前些年写的一个框架代码,实现了一套通用的配置序列化机制,这样配置信息管理起来就方便多了。
代码详见MDConfig单元。
基本组成是这样:
TMCustomConfigSection
类实现了IMSerializable接口(定义在框架的MDComm中),意味着它可以被递归序列化——不过在已实现的INI文件和注册表文件序列化
中,这种递归仅限于一层:即一个配置文件可以包括多个配置段,但是配置段下不能再有配置段。当然,框架中实现的通用序列化(二进制和XML)不受此限。
TMCustomConfig类则是可序列化的配置文件,派生自TPersistent。这个类里除了可以包含配置信息以外,还可以包括配置段。
TMCustomConfigSerializer类则是配置序列化基类,实现配置序列化的公共部分——即与具体序列化方式无关的部分。
TMIniSerializer类是INI文件的序列化类,通过它可以把配置文件序列化到INI文件中去。
TMRegSerializer类是注册表序列化类。
配置的基本使用方法是这样的:
分别从TMCustomConfigSection和TMCustomConfig派生自己的配置段类和配置类,在其中定义配置项目供程序使用。示例代码如:
TMTestConfigSection = class(TMCustomConfigSection)
Private
FStringItem : String;
FIntItem : Integer;
FFloatItem : Double;
FDateItem : TDateTime;
Published
Property StringItem : String Read FStringItem Write FStringItem;
Property IntItem : Integer Read FIntItem Write FIntItem;
Property FloatItem : Double Read FFloatItem Write FFloatItem;
Property DateItem : TDateTime Read FDateItem Write FDateItem;
End;
TMTestConfig = class(TMCustomConfig)
Private
FSectionItem : TMTestConfigSection;
FStringItem : String;
public
Constructor Create(aDefaultSerializer : IMSerializer = Nil);
destructor Destroy; Override;
Published
Property SectionItem : TMTestConfigSection Read FSectionItem Write FSectionItem;
Property StringItem : String Read FStringItem Write FStringItem;
End;
Constructor TMTestConfig.Create(aDefaultSerializer : IMSerializer = Nil);
begin
Inherited Create(aDefaultSerializer);
FSectionItem := TMTestConfigSection.Create();
end;
destructor TMTestConfig.Destroy;
begin
FSectionItem.Free;
Inherited
end;
序
列化方式则可以自由选择目前已经实现的四种:INI文件,注册表,二进制文件,XML。序列化操作也可以选择默认序列化或是指定序列化。默认序列化就是在
Config对象构造时传入默认的序列化方式,指定序列化就是在调用Config对象的Load/Save方法时指定序列方式。当然,即使设置了默认序列
化方式,也是可以在调用Load/Save方法时重新指定的。
默认序列化:
conf := TMTestConfig.Create(TMIniSerializer.Create('e:\temp\test.ini'));
conf.StringItem := 'This is default section item';
conf.SectionItem.StringItem := 'This is Section item';
conf.SectionItem.IntItem := 12345;
conf.SectionItem.FloatItem := 9.87654;
conf.SectionItem.DateItem := EncodeDate( 2009, 01, 02 );
conf.Save;
指定序列化:
conf := TMTestConfig.Create;
conf.Load(TMIniSerializer.Create('e:\temp\test.ini'));
conf.Save(TMRegSerializer.Create(HKEY_CURRENT_USER, 'software\mental studio\devotee\test'));
注意,其中序列化器是通过引用计数维护的,会自动释放,不需要显示释放。
mdf框架全部源码下载。
只使用配置序列化部分的话,只需要MDComm和MDConfig两个单元文件(二进制和XML序列化需要MSerializ单元)。
在BCB中使用的特别注意事项:
要用一个Delphi单元来定义配置类,因为用到了Delphi的RTTI,虽然用C++来写配置类也可以编译,但是会发生运行时错误。特别关键的是序列化器对象必须在Delphi单元中创建。形如:
Constructor TMainConfig.Create(aIniName : String);
begin
Inherited Create(TMIniSerializer.Create(aIniName, 'Default'));
end;
// 然后在BCB中这样使用
TMainConfig * MainCfg = new TMainConfig(ChangeFileExt(Application->ExeName,".ini"));
分享到:
相关推荐
这个示例很可能是通过编程语言实现的一个具体应用,用于演示如何在多线程环境中使用消息机制来协调工作,并利用RTTI进行动态类型处理。 线程消息驱动是一种编程模型,它在多线程程序中使用消息队列来管理不同线程间...
在Delphi编程环境中,RTTI(Run-Time Type Information)是一种强大的特性,允许程序在运行时获取类型信息。本文将深入探讨如何利用RTTI来实现TdxDBGrid和TDBGrid组件的动态配置,包括标题、列宽、显示顺序以及字体...
在Delphi编程环境中,RTTI(Run-Time Type Information)是一种强大的特性,允许程序在运行时获取类型信息。这个“rtti-inspector-combo.zip”压缩包包含了一个利用Delphi RTTI机制创建的“RTTIInspector”工具,它...
使用`rtti-obfuscator` 需要先解压`rtti-obfuscator-master`压缩包,然后按照项目文档的指示配置和运行。通常包括编译源代码,链接到你的目标二进制文件,最后执行混淆操作。 ### 6. 注意事项 - 混淆RTTI可能会...
RTTI 是 Delphi 中一个强大的特性,允许程序在运行时获取类和对象的信息,包括它们的类型、属性、方法等。在 Delphi 2009 及以后的版本中,RTTI 功能得到了显著增强,使得开发者可以更方便地利用这些信息。 这个...
Qt的pro配置文件是Qt构建项目以及生成Makefile的配置文件,它主要由一系列的配置项组成,这些配置项可以控制项目的编译选项、链接库、文件包含路径等重要信息。下面详细介绍各个配置项的功能和用法。 1. CONFIG ...
3. **启用RTTI**:继续在项目设置中,转到C/C++选项卡下的“C++语言”部分,勾选“启用运行时类型信息(RTTI)”。这样做是为了避免出现类似`warning: EventObject ‘with/GR-’; unpredictable behavior may result...
- 在这里,确保“允许允许时间类型信息(RTTI)”是选中的,这是SystemC所需的C++特性。 - 接下来,切换到“链接”部分,在“对象/库模块”中,你需要添加systemc.lib,直接在文本框内输入`systemc.lib`。 3. **...
2. **使Apache识别PHP文件**:编辑Apache的配置文件`/usr/share/apache2/conf/httpd.conf`,确保启用了`LoadModule php_module modules/libphp.so`,并且在`$>`段落中配置了正确的处理程序。 完成以上步骤后,LAMP...
- 接着介绍Delphi语言的进阶知识,例如使用匿名方法、编写可枚举类型、利用RTTI运行时配置类、使用Delphi的RTTI进行鸭子类型化等。 - 最后,介绍了Delphi RTL(运行时库)的知识,包括使用正则表达式检查字符串、...
RTTI是C++的一项特性,允许程序在运行时检查对象的类型信息。在MFC中,RTTI常用于多态性操作,例如在派生类对象指针上调用虚函数时,确保调用到正确的方法。MFC的类层次结构广泛使用RTTI来实现动态类型检查和转换。...
这里 `/Zc:wchar_t-` 关闭了对宽字符的某些警告,`/GR` 启用了运行时类型信息(RTTI),`/EHsc` 设置了异常处理模型,而 `/DWIN32`, `/D_WINDOWS` 和 `/D_SCL_SECURE_NO_WARNINGS` 则定义了一些预处理器宏。...
你可以设定代码的警告级别、是否启用RTTI(运行时类型信息)、异常处理策略等。此外,还可以配置头文件和库的搜索路径,确保编译器能找到所有必要的依赖项。 3. **链接器设置**:链接器将编译后的.obj文件转换为可...
- Debug info:选择生成不同类型的调试信息,包括无调试信息、行号信息、C7兼容模式、程序数据库(PDB)以及支持“编辑并继续”功能的PDB。 2) C++ Language设置: - Pointer-to-member representation:决定指针...
- **RTTI(Run-Time Type Information)**:运行时类型信息,允许程序在运行时检查对象的类型,支持多态性。 - **异常处理**:VC++支持标准C++的异常处理机制,有助于错误的检测和处理。 3. **面向对象编程在...
- **Enable Run-Time Type Information (RTTI)**:开启运行时类型信息,允许在运行时检查对象的实际类型。 - **Disable Construction Displacements**:与构造/析构函数及虚函数的调用有关,防止某些特定问题。 3...
6. **配置选项**:库的构建可以设置不同的配置选项,例如是否启用RTTI(运行时类型信息)和异常处理,以适应不同项目的需要。 使用yaml-cpp库的步骤通常包括以下几步: 1. **安装库**:解压yaml-cpp.tar.gz,编译...