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 ;レコード内のすべてのフィールド データをクリアします (フィールドから値が削除されるだけでなく、フィールド全体が削除されます)。