2021 年 9 月 12 日 (バージョン 1.2)
2021 年 4 月 13 日 (バージョン 1.1)
2021 年 3 月 27 日 (バージョン 1.0)
ソフトウェア プロジェクトで作業しているときは、常に何らかのデータを構成ファイルやその他の情報として INI ファイルまたはテキスト ファイルに保存する必要があります。
したがって、選択できるのは INI ファイルかプレーンテキストです。そして、ほとんどの場合、いくつかのフィールドを含むテーブルが必要になります。
プレーン テキストでは、1 行に 1 つのレコードを使用し、タブ文字、パイプ文字、またはその他の文字を使用してフィールドを区切ることができます。しかし、この方法にはいくつか問題があります。区切り文字をフィールド値で使用するのではなく、区切り文字に注意する必要があります。そして最大の問題があります。将来のバージョンで列を追加する必要がある場合、既にデータが保存されている場合、このファイルでの互換性が失われます。
INI ファイルを使用している場合は、フィールド名を指定できますが、それでもセクションごとに 1 つのレコードを保存するのに問題があり、レコードの並べ替え、レコードの削除、およびレコードの名前付けが困難です。
でも心配しないでください。これが解決策です。
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
= フィールド インデックスによってフィールド オブジェクトを返します。
警告: 1 つのレコードには、別のレコードとは異なるフィールドが含まれる場合があります。したがって、レコード全体の特定のフィールド (列など) に対して固定インデックスを使用しないでください。
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 ;
レコード内のすべてのフィールド データをクリアします (フィールドから値が削除されるだけでなく、フィールド全体が削除されます)。