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 ;
清除記錄中的所有欄位資料(它不僅從欄位中刪除值,而是將欄位一起刪除)。