กลไกการอ่านและการเขียนส่วนประกอบของ Delphi (1)
1. รู้เบื้องต้นเกี่ยวกับการสตรีมออบเจ็กต์ (สตรีม) และออบเจ็กต์แบบอ่าน-เขียน (Filer)
ในการเขียนโปรแกรมเชิงวัตถุ การจัดการข้อมูลเชิงวัตถุมีบทบาทสำคัญ ใน Delphi การสนับสนุนการจัดการข้อมูลแบบออบเจ็กต์ถือเป็นคุณสมบัติหลัก
Delphi คือสภาพแวดล้อมการพัฒนาแบบผสมผสานที่ผสมผสานการออกแบบภาพเชิงวัตถุเข้ากับภาษาเชิงวัตถุ แกนหลักของ Delphi คือส่วนประกอบ ส่วนประกอบคือประเภทของวัตถุ แอปพลิเคชัน Delphi สร้างขึ้นจากส่วนประกอบทั้งหมด ดังนั้นการพัฒนาแอปพลิเคชัน Delphi ที่มีประสิทธิภาพสูงจะต้องเกี่ยวข้องกับเทคโนโลยีการจัดการข้อมูลแบบอ็อบเจ็กต์อย่างหลีกเลี่ยงไม่ได้
การจัดการข้อมูลออบเจ็กต์ประกอบด้วยสองด้าน:
● ใช้ออบเจ็กต์เพื่อจัดการข้อมูล
● การจัดการออบเจ็กต์ข้อมูลต่างๆ (รวมถึงออบเจ็กต์และส่วนประกอบ)
Delphi สรุปคลาสการจัดการข้อมูลตามออบเจ็กต์เป็นออบเจ็กต์ Stream (สตรีม) และออบเจ็กต์ Filer (Filer) และนำไปใช้กับทุกแง่มุมของ Visual Component Class Library (VCL) มีฟังก์ชันมากมายสำหรับการจัดการอ็อบเจ็กต์ในหน่วยความจำ ที่จัดเก็บข้อมูลภายนอก และทรัพยากรของ Windows
ออบเจ็กต์สตรีมหรือที่เรียกว่าออบเจ็กต์สตรีมมิง เป็นชื่อรวมของ TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream และ TBlobStream พวกมันแสดงถึงความสามารถในการจัดเก็บข้อมูลบนสื่อต่าง ๆ ตามลำดับ โดยสรุปการดำเนินการจัดการของข้อมูลประเภทต่าง ๆ (รวมถึงอ็อบเจ็กต์และส่วนประกอบ) ในหน่วยความจำ หน่วยความจำภายนอก และฟิลด์ฐานข้อมูลเป็นวิธีการของอ็อบเจ็กต์ และใช้ประโยชน์จากเทคโนโลยีเชิงวัตถุอย่างเต็มที่ ข้อดีคือแอปพลิเคชันสามารถคัดลอกข้อมูลในออบเจ็กต์ Stream ต่างๆ ได้อย่างง่ายดาย
อ็อบเจ็กต์การอ่าน-เขียน (Filer) รวมถึงอ็อบเจ็กต์ TFiler, อ็อบเจ็กต์ TReader และอ็อบเจ็กต์ TWriter ออบเจ็กต์ TFiler เป็นออบเจ็กต์พื้นฐานสำหรับการอ่านและเขียนไฟล์ TReader และ TWriter ส่วนใหญ่จะใช้ในแอปพลิเคชัน ทั้งวัตถุ TReader และ TWriter สืบทอดโดยตรงจากวัตถุ TFiler วัตถุ TFiler กำหนดคุณสมบัติพื้นฐานและวิธีการของวัตถุ Filer
ออบเจ็กต์ Filer ทำหน้าที่หลักสองประการให้เสร็จสมบูรณ์เป็นหลัก:
● เข้าถึงไฟล์แบบฟอร์มและส่วนประกอบในไฟล์แบบฟอร์ม
●จัดให้มีการบัฟเฟอร์ข้อมูลเพื่อเพิ่มความเร็วในการอ่านและเขียนข้อมูล
เพื่อให้มีความเข้าใจอย่างเข้าใจเกี่ยวกับการสตรีมออบเจ็กต์และออบเจ็กต์การอ่าน-เขียน เรามาลองดูตัวอย่างกันก่อน
ก) เขียนไฟล์
PROcedure TFomr1.WriteData (ผู้ส่ง: TObject);
วาร์
FileStream:TFilestream;
นักเขียนของฉัน:TWriter;
ฉัน: จำนวนเต็ม
เริ่ม
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//สร้างวัตถุสตรีมไฟล์
Mywriter:=TWriter.create(FileStream,1024); //เชื่อมโยง Mywriter กับ FileStream
Mywriter.writelistbegin; //เขียนรายการเริ่มต้นธง
สำหรับ i:=0 ถึง Memo1.lines.count-1 ทำ
Mywriter.writestring(memo1.lines[i]); //บันทึกข้อมูลข้อความในองค์ประกอบ Memo ลงในไฟล์
Mywriter.writelistend; //เขียนเครื่องหมายสิ้นสุดรายการ
FileStream.seek(0,sofrombeginning); //ตัวชี้ออบเจ็กต์สตรีมไฟล์จะย้ายไปที่จุดเริ่มต้นของสตรีม
Mywriter.free; // ปล่อยวัตถุ Mywriter
FileStream.free; //ปล่อยวัตถุ FileStream
จบ;
b) อ่านไฟล์
ขั้นตอน TForm1.ReadData (ผู้ส่ง: TObject);
วาร์
FileStream:TFilestream;
Myreader:TReader;
เริ่ม
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //เชื่อมโยง Myreader กับ FileStream
Myreader.readlistbegin; //อ่านเครื่องหมายเริ่มต้นรายการที่เขียน
Memo1.lines.clear; //ล้างเนื้อหาข้อความของส่วนประกอบ Memo1
แม้ว่าจะไม่ใช่ myreader.endoflist ให้ //ใส่ใจกับวิธีการของ TReader: endoflist
เริ่ม
Memo1.lines.add(myreader.readstring); //เพิ่มสตริงการอ่านลงในองค์ประกอบ Memo1
จบ;
Myreader.readlistend; //อ่านเครื่องหมายสิ้นสุดรายการที่เขียน
Myreader.free; // ปล่อยวัตถุ Myreader
FileStream.free; //ปล่อยวัตถุ FileStream
จบ;
สองกระบวนการข้างต้น กระบวนการหนึ่งคือกระบวนการเขียน และอีกกระบวนการคือกระบวนการอ่าน กระบวนการเขียนผ่าน TWriter และใช้ TFilestream เพื่อบันทึกเนื้อหา (ข้อมูลข้อความ) ในบันทึกช่วยจำเป็นไฟล์ไบนารีที่บันทึกไว้ในดิสก์ กระบวนการอ่านเป็นสิ่งที่ตรงกันข้ามกับกระบวนการเขียน TReader ใช้เพื่อแปลงเนื้อหาของไฟล์ไบนารี่เป็นข้อมูลข้อความและแสดงใน Memo เมื่อคุณรันโปรแกรม คุณจะเห็นว่ากระบวนการอ่านคืนค่าข้อมูลที่บันทึกไว้โดยกระบวนการเขียนอย่างซื่อสัตย์
แผนภาพต่อไปนี้อธิบายความสัมพันธ์ระหว่างออบเจ็กต์ข้อมูล (รวมถึงออบเจ็กต์และส่วนประกอบ) ออบเจ็กต์สตรีมมิ่ง และออบเจ็กต์การอ่านและเขียน
รูปที่ (1)
เป็นที่น่าสังเกตว่าอ็อบเจ็กต์การอ่าน-เขียน เช่น อ็อบเจ็กต์ TFiler, อ็อบเจ็กต์ TReader และอ็อบเจ็กต์ TWriter มักไม่ค่อยถูกเรียกโดยผู้เขียนแอปพลิเคชันโดยตรง -เขียนกลไกส่วนประกอบ
สำหรับสตรีมออบเจ็กต์ สื่ออ้างอิงจำนวนมากมีการแนะนำโดยละเอียด ในขณะที่วัสดุอ้างอิงสำหรับออบเจ็กต์ TFiler, ออบเจ็กต์ TReader และออบเจ็กต์ TWriter โดยเฉพาะอย่างยิ่งกลไกการอ่านและการเขียนส่วนประกอบนั้นหาได้ยาก และกลไกการเขียน
2. การอ่านและการเขียนวัตถุ (Filer) และกลไกการอ่านและการเขียนส่วนประกอบ
วัตถุ Filer ส่วนใหญ่จะใช้เพื่อเข้าถึงไฟล์ฟอร์ม Delphi และส่วนประกอบในไฟล์ฟอร์ม ดังนั้นเพื่อให้เข้าใจวัตถุ Filer อย่างชัดเจน คุณต้องทราบโครงสร้างของไฟล์ฟอร์ม Delphi (ไฟล์ DFM)
ไฟล์ DFM ใช้สำหรับแบบฟอร์มการจัดเก็บ Delphi แบบฟอร์มเป็นแกนหลักของการเขียนโปรแกรมด้วยภาพ Delphi แบบฟอร์มสอดคล้องกับหน้าต่างในแอปพลิเคชัน Delphi ส่วนประกอบภาพในแบบฟอร์มสอดคล้องกับองค์ประกอบอินเทอร์เฟซในหน้าต่าง และส่วนประกอบที่ไม่ใช่ภาพเช่น TTimer และ TOpenDialog สอดคล้องกับฟังก์ชันบางอย่างของแอปพลิเคชัน Delphi การออกแบบแอปพลิเคชัน Delphi นั้นมีศูนย์กลางอยู่ที่การออกแบบแบบฟอร์ม ดังนั้นไฟล์ DFM จึงครองตำแหน่งที่สำคัญมากในการออกแบบแอปพลิเคชัน Delphi องค์ประกอบทั้งหมดในแบบฟอร์ม รวมถึงคุณสมบัติของแบบฟอร์มนั้น จะรวมอยู่ในไฟล์ DFM
ในหน้าต่างแอปพลิเคชัน Delphi องค์ประกอบอินเทอร์เฟซจะสัมพันธ์กันตามความสัมพันธ์ของความเป็นเจ้าของ ดังนั้นโครงสร้างต้นไม้จึงเป็นรูปแบบการแสดงออกที่เป็นธรรมชาติที่สุด ดังนั้น ส่วนประกอบในแบบฟอร์มจึงถูกจัดระเบียบตามโครงสร้างต้นไม้ด้วย ไฟล์ DFM เพื่อแสดงความสัมพันธ์นี้ด้วย ไฟล์ DFM จะถูกจัดเก็บทางกายภาพในรูปแบบข้อความ (ก่อนเวอร์ชัน Delphi2.0 ไฟล์เหล่านี้จะถูกจัดเก็บเป็นไฟล์ไบนารี) และในทางตรรกะ ความสัมพันธ์ระหว่างส่วนประกอบต่างๆ จะถูกจัดเรียงในโครงสร้างต้นไม้ โครงสร้างต้นไม้ของแบบฟอร์มสามารถเห็นได้ชัดเจนจากข้อความนี้ ด้านล่างนี้คือเนื้อหาของไฟล์ DFM:
วัตถุ Form1: TForm1
ซ้าย = 197
บน = 124
-
PixelsPerInch = 96
ความสูงข้อความ = 13
วัตถุ Button1: TButton
ซ้าย = 272
-
คำบรรยาย = 'Button1'
ลำดับแท็บ = 0
จบ
วัตถุ Panel1: TPanel
ซ้าย = 120
-
คำบรรยายภาพ = 'แผง1'
ลำดับแท็บ = 1
วัตถุ CheckBox1: TCheckBox
ซ้าย = 104
-
คำบรรยายภาพ = 'ช่องทำเครื่องหมาย1'
ลำดับแท็บ = 0
จบ
จบ
จบ
ไฟล์ DFM นี้สร้างโดย TWriter ผ่านการสตรีมออบเจ็กต์ แน่นอนว่ายังมีกระบวนการแปลงจากไฟล์ไบนารีไปเป็นไฟล์ข้อมูลข้อความ
เมื่อโปรแกรมเริ่มทำงาน TReader จะอ่านแบบฟอร์มและส่วนประกอบผ่านออบเจ็กต์การสตรีม Stream เพราะเมื่อ Delphi คอมไพล์โปรแกรม มันจะรวบรวมข้อมูลไฟล์ DFM ลงในไฟล์ปฏิบัติการโดยใช้คำสั่งการคอมไพล์ {$R *.dfm} แล้วไงล่ะ จริงๆ แล้วการอ่าน TReader เป็นข้อมูลเกี่ยวกับแบบฟอร์มและส่วนประกอบที่คอมไพล์เป็นไฟล์ปฏิบัติการ
TReader และ TWriter ไม่เพียงแต่สามารถอ่านและเขียนประเภทข้อมูลมาตรฐานส่วนใหญ่ใน Object Pascal เท่านั้น แต่ยังสามารถอ่านและเขียนประเภทขั้นสูง เช่น List และ Variant และแม้แต่อ่านและเขียน Properties และ Components อย่างไรก็ตาม TReader และ TWriter เองก็มีฟังก์ชันที่จำกัดมากและงานจริงส่วนใหญ่ทำโดยคลาส TStream ที่ทรงพลังมาก กล่าวอีกนัยหนึ่ง TReader และ TWriter เป็นเพียงเครื่องมือเท่านั้น พวกเขามีหน้าที่รับผิดชอบในการอ่านและการเขียนเฉพาะส่วนประกอบเท่านั้น
เนื่องจาก TFiler เป็นคลาสบรรพบุรุษร่วมกันของ TReader และ TWriter เพื่อทำความเข้าใจ TReader และ TWriter คุณควรเริ่มต้นด้วย TFiler ก่อน