2021 年 9 月 12 日(1.2 版)
2021 年 4 月 13 日(1.1 版)
2021 年 3 月 27 日(1.0 版)
当您处理软件项目时,您总是需要将一些数据存储到 INI 文件或某些文本文件中,作为配置文件或其他信息。
因此,您可以选择 INI 文件或纯文本。而且几乎总是需要一个包含一些字段的表。
在纯文本中,您可以每行使用一个记录,并使用制表符、管道符或其他字符分隔字段。但是这种方法有一些问题:您需要注意分隔符,而不是在字段值中使用它;你有一个最大的问题:在未来的版本中,如果你需要添加一列,当已经存储了数据时,你会失去该文件的兼容性。
如果您正在使用 INI 文件,您可以指定字段名称,但即便如此,您在每个部分存储一条记录时也会遇到问题,并且很难对记录重新排序、删除记录和命名记录。
但别担心,这里有解决方案。
DzXMLTable 是一个非可视组件,您可以在其中存储带有字段和值的记录,并且可以命名字段,因此您无需担心将来的版本。您可以随时添加新字段,只需读取和写入即可。
这是我之前的 DzMiniTable 组件的一个新概念。
支持Delphi XE3..Delphi 11
type
TContact = class
ID: Integer;
Name : string;
Phone: string;
Active: Boolean; // new field in some new program version
end ;
procedure LoadContactsExample (List: TObjectList<TContact>);
var
XML: TDzXMLTable;
Rec: TDzRecord;
Contact: TContact;
begin
XML := TDzXMLTable.Create( nil );
try
XML.FileName := ' C:Data.xml ' ;
XML.Load;
for Rec in XML do
begin
Contact := TContact.Create;
Contact.ID := Rec[ ' ID ' ];
Contact. Name := Rec[ ' Name ' ];
Contact.Phone := Rec[ ' Phone ' ];
Contact.Active := Rec.ReadDef( ' Active ' , True); // saved xml in old version could not have this field, so, read with default value.
List.Add(Contact);
end ;
finally
XML.Free;
end ;
end ;
所有方法和属性参数中的字段名称始终不区分大小写。
FileName: string
= 指定打开和保存表的完整 XML 文件名
RequiredFile: Boolean
= 当禁用此属性(默认)时,如果 Open 方法中文件不存在,则表将被加载为空,而不会引发任何异常。
RequiredField: Boolean
= 当禁用此属性(默认)时,您可以读取不存在的字段,而不会引发异常,并返回Unassigned
变体值。
Rec[Index: Integer]: TDzRecord
(默认组件属性)= 按索引返回记录对象。
RecCount: Integer
= 返回记录数。
procedure Load ;
从 FileName 属性指定的文件加载表
procedure Save ;
将表保存到 FileName 属性指定的文件中
procedure Clear ;
清除表中所有数据
function New (Index: Integer = - 1 ): TDzRecord;
在表中创建一条新记录并返回记录对象。您可以使用Index
参数指定表中新记录的位置。如果保留Index = -1
,记录将添加到表的末尾。
procedure Delete (Index: Integer);
按索引删除记录。
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
返回与相同名称和值匹配的第一个记录索引。如果没有找到记录,该函数将返回nil
。
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
返回与相同名称和值匹配的第一个记录对象。如果没有找到记录,该函数将返回nil
。
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
返回与相同名称和值匹配的第一个记录索引,其中使用不区分大小写将值作为字符串进行比较。如果没有找到记录,该函数将返回nil
。
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
返回与相同名称和值匹配的第一个记录对象,其中使用不区分大小写将值作为字符串进行比较。如果没有找到记录,该函数将返回nil
。
procedure Move (CurIndex, NewIndex: Integer);
将记录从CurIndex
移动到表中的NewIndex
位置。
Field[const Name: string]: Variant
= 返回或定义字段值作为按字段名称的变体。获取字段值时,如果该字段不存在,则会抛出异常,除非RequiredField
属性为False(这种情况下,会返回一个Unassigned
值。设置字段值时,如果该字段不存在,则会抛出异常使用指定的名称和值自动创建。
FieldIdx[Index: Integer]: TDzField
= 按字段索引返回字段对象。
警告:一条记录可以包含与另一条记录不同的字段。因此,您永远不应该对记录中的特定字段(如列)使用固定索引。
FieldCount: Integer
= 返回此记录中的字段数。
function ReadDef ( const Name : string; DefValue: Variant): Variant;
按字段名称返回字段值。如果记录中不存在字段,则返回DefValue
。
function FindField ( const Name : string): TDzField;
按字段名称返回字段对象。如果字段不存在,则返回nil
。
function FieldExists ( const Name : string): Boolean;
如果指定字段名称存在字段,则返回 true。
procedure ClearFields ;
清除记录中的所有字段数据(它不仅从字段中删除值,而是将字段一起删除)。