12/09/2021 (เวอร์ชั่น 1.2)
13/04/2021 (เวอร์ชัน 1.1)
27/03/2021 (เวอร์ชัน 1.0)
เมื่อคุณทำงานในโปรเจ็กต์ซอฟต์แวร์ คุณจะต้องจัดเก็บข้อมูลบางส่วนไว้ในไฟล์ INI หรือไฟล์ข้อความบางไฟล์เป็นไฟล์การกำหนดค่าหรือข้อมูลอื่น ๆ เสมอ
ดังนั้น ตัวเลือกที่คุณมีคือไฟล์ INI หรือข้อความธรรมดา และเกือบทุกครั้งคุณจะต้องมีตารางที่มีบางฟิลด์
ในข้อความธรรมดา คุณสามารถใช้หนึ่งระเบียนต่อบรรทัด และแยกฟิลด์โดยใช้อักขระแท็บ อักขระไปป์ หรืออีกอันหนึ่ง แต่คุณมีปัญหากับวิธีนี้: คุณต้องดูแลอักขระตัวคั่น ไม่ใช้มันตามค่าของฟิลด์ และคุณประสบปัญหาใหญ่ที่สุด: ในเวอร์ชันอนาคต หากคุณต้องการเพิ่มคอลัมน์ คุณจะสูญเสียความเข้ากันได้ในไฟล์นี้เมื่อมีข้อมูลที่เก็บไว้แล้ว
หากคุณกำลังทำงานกับไฟล์ INI คุณสามารถระบุชื่อฟิลด์ได้ แต่ถึงอย่างนั้น คุณยังมีปัญหาในการจัดเก็บหนึ่งเรคคอร์ดต่อส่วน และเป็นเรื่องยากที่จะจัดลำดับเรคคอร์ดใหม่ ลบเรคคอร์ด และตั้งชื่อเรคคอร์ด
แต่ไม่ต้องกังวล นี่คือวิธีแก้ปัญหา
DzXMLTable เป็นส่วนประกอบที่ไม่ใช่ภาพซึ่งคุณสามารถจัดเก็บเรกคอร์ดด้วยฟิลด์และค่าต่างๆ และคุณสามารถตั้งชื่อฟิลด์ได้ ดังนั้นคุณจึงไม่ต้องกังวลกับเวอร์ชันในอนาคต คุณสามารถเพิ่มฟิลด์ใหม่ได้ตลอดเวลา เพียงแค่อ่านและเขียนฟิลด์เหล่านั้น
นี่เป็นแนวคิดใหม่ของคอมโพเนนต์ DzMiniTable ก่อนหน้าของฉัน
รองรับ Delphi XE3..เดลฟี 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
= เมื่อคุณสมบัตินี้ถูกปิดใช้งาน (ค่าเริ่มต้น) หากไม่มีไฟล์อยู่ที่วิธีการเปิด ตารางจะถูกโหลดว่างเปล่าโดยไม่มีข้อยกเว้นใดๆ
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
จะเป็นเท็จ (ในกรณีนี้ จะส่งกลับค่า 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;
คืนค่าเป็นจริงหากมีฟิลด์ตามชื่อฟิลด์ที่ระบุ
procedure ClearFields ;
ล้างข้อมูลฟิลด์ทั้งหมดในเรกคอร์ด (ไม่เพียงแค่ลบค่าออกจากฟิลด์ แต่ลบฟิลด์ทั้งหมด)