09/12/2021 (Versi 1.2)
13/04/2021 (Versi 1.1)
27/03/2021 (Versi 1.0)
Saat Anda mengerjakan proyek perangkat lunak, Anda selalu perlu menyimpan beberapa data ke dalam file INI atau beberapa file teks, sebagai file konfigurasi atau informasi lainnya.
Jadi, pilihan yang Anda miliki adalah file INI, atau teks biasa. Dan hampir selalu Anda memerlukan tabel dengan beberapa bidang.
Dalam teks biasa, Anda dapat menggunakan satu rekaman per baris, dan memisahkan bidang menggunakan karakter tab, atau karakter pipa, atau karakter lainnya. Tetapi Anda memiliki beberapa masalah dengan metode ini: Anda harus berhati-hati dengan karakter pemisah, bukan menggunakannya pada nilai bidang; dan Anda mempunyai masalah terbesar: di versi mendatang, jika Anda perlu menambahkan kolom, Anda kehilangan kompatibilitas pada file ini ketika sudah ada data yang disimpan.
Jika Anda bekerja dengan file INI, Anda dapat menentukan nama field, namun demikian, Anda memiliki masalah untuk menyimpan satu record per bagian, dan sulit untuk menyusun ulang record, menghapus record dan memberi nama pada record.
Tapi jangan khawatir, ini solusinya.
DzXMLTable adalah komponen non-visual tempat Anda bisa menyimpan rekaman dengan bidang dan nilai, dan Anda bisa memberi nama bidang tersebut, jadi Anda tidak perlu khawatir dengan versi mendatang. Anda dapat menambahkan kolom baru kapan saja, cukup dengan membaca dan menulisnya.
Ini adalah konsep baru dari komponen DzMiniTable saya sebelumnya.
Mendukung 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 ;
Nama bidang selalu peka huruf besar-kecil di semua metode dan parameter properti.
FileName: string
= Menentukan nama file XML lengkap untuk Membuka dan Menyimpan tabel
RequiredFile: Boolean
= Ketika properti ini dinonaktifkan (default), jika file tidak ada pada metode Open, tabel akan dimuat kosong tanpa memunculkan pengecualian apa pun.
RequiredField: Boolean
= Ketika properti ini dinonaktifkan (default), Anda dapat membaca bidang yang tidak ada tanpa memunculkan dan pengecualian, mengembalikan nilai varian Unassigned
.
Rec[Index: Integer]: TDzRecord
(properti komponen default) = Mengembalikan objek rekaman berdasarkan indeks.
RecCount: Integer
= Mengembalikan jumlah rekaman.
procedure Load ;
Muat tabel dari file yang ditentukan di properti FileName
procedure Save ;
Simpan tabel ke file yang ditentukan di properti FileName
procedure Clear ;
Hapus semua data dalam tabel
function New (Index: Integer = - 1 ): TDzRecord;
Buat catatan baru di tabel dan kembalikan objek rekaman. Anda dapat menentukan posisi record baru dalam tabel, menggunakan parameter Index
. Jika Anda meninggalkan Index = -1
, catatan akan ditambahkan di akhir tabel.
procedure Delete (Index: Integer);
Hapus catatan berdasarkan indeks.
function FindIdxByField ( const Name : string; const Value : Variant): Integer;
Mengembalikan indeks rekaman pertama yang cocok dengan Nama dan Nilai yang sama. Jika tidak ada catatan yang ditemukan, fungsi akan mengembalikan nil
.
function FindRecByField ( const Name : string; const Value : Variant): TDzRecord;
Mengembalikan objek rekaman pertama yang cocok dengan Nama dan Nilai yang sama. Jika tidak ada catatan yang ditemukan, fungsi akan mengembalikan nil
.
function FindIdxBySameText ( const Name : string; const Value : Variant): Integer;
Mengembalikan indeks rekaman pertama yang cocok dengan Nama dan Nilai yang sama, di mana Nilai dibandingkan sebagai String menggunakan case-insensitive . Jika tidak ada catatan yang ditemukan, fungsi akan mengembalikan nil
.
function FindRecBySameText ( const Name : string; const Value : Variant): TDzRecord;
Mengembalikan objek rekaman pertama yang cocok dengan Nama dan Nilai yang sama, di mana Nilai dibandingkan sebagai String menggunakan case-insensitive . Jika tidak ada catatan yang ditemukan, fungsi akan mengembalikan nil
.
procedure Move (CurIndex, NewIndex: Integer);
Memindahkan catatan dari posisi CurIndex
ke NewIndex
dalam tabel.
Field[const Name: string]: Variant
= Mengembalikan atau mendefinisikan nilai bidang sebagai varian berdasarkan nama bidang. Saat mendapatkan nilai bidang, jika bidang tersebut tidak ada, pengecualian akan dimunculkan, kecuali properti RequiredField
adalah False (dalam hal ini, nilai Unassigned
akan dikembalikan. Saat mengatur nilai bidang, jika bidang tersebut tidak ada, maka akan secara otomatis dibuat dengan nama dan nilai tertentu.
FieldIdx[Index: Integer]: TDzField
= Mengembalikan objek bidang berdasarkan indeks bidang.
Peringatan: Satu record dapat berisi field yang berbeda dari record lainnya. Jadi, Anda tidak boleh menggunakan indeks tetap untuk bidang tertentu (seperti kolom) di seluruh catatan.
FieldCount: Integer
= Mengembalikan jumlah bidang dalam catatan ini.
function ReadDef ( const Name : string; DefValue: Variant): Variant;
Mengembalikan nilai bidang berdasarkan nama bidang. Jika bidang tidak ada dalam catatan, kembalikan DefValue
.
function FindField ( const Name : string): TDzField;
Mengembalikan objek bidang berdasarkan nama bidang. Jika bidang tidak ada, kembalikan nil
.
function FieldExists ( const Name : string): Boolean;
Mengembalikan nilai benar jika bidang ada dengan nama bidang yang ditentukan.
procedure ClearFields ;
Hapus semua data bidang dalam catatan (Ini tidak hanya menghapus nilai dari bidang, tetapi seluruh bidang).