ส่วนที่ 2: การใช้ DBImage เพื่อแยก JPEG—วิธีที่ผิด
DBImage - รับหนึ่งรายการ (The DBImage - รับหนึ่งรายการ)
เมื่อพยายามทำอะไรใหม่ๆ กับ Delphi สิ่งแรกที่ฉันทำคือขอความช่วยเหลือในตัวของ Delphi เพื่อขอวิธีการ นี่คือสิ่งที่เอกสารวิธีใช้จะตอบ: TDBImage (ในหน้า Data Controls ของ Component Palette) แสดงถึงภาพกราฟิกของฟิลด์ BLOB ในบันทึกปัจจุบันของฐานข้อมูล ใช้ TDBImage เพื่อแสดงค่าฟิลด์กราฟิก TDBImage อนุญาตให้แบบฟอร์มแสดงข้อมูลกราฟิกจากฐานข้อมูล TDBImage มีคุณสมบัติการมองเห็นข้อมูลมากกว่าส่วนประกอบ TImage เท่านั้น คุณสมบัติที่สำคัญที่สุดสองประการคือ: แหล่งข้อมูล (แหล่งข้อมูล) และฟิลด์ (ฟิลด์) คุณสมบัติ DataSource เชื่อมต่อองค์ประกอบกราฟิกกับฐานข้อมูล ในแบบฟอร์มของเราจะมีส่วนประกอบ DataSource ชื่อ DataSource1 ซึ่งแสดงถึงชุดข้อมูล คุณสมบัติ Field ระบุฟิลด์ (ในตาราง) ที่เก็บรูปภาพ
ทุกอย่างชัดเจน ตอนนี้วางองค์ประกอบ DBImage บนแบบฟอร์มและตั้งชื่อเป็น DBImage1 ตามค่าเริ่มต้น เพื่อเชื่อมต่อ DBImage กับฟิลด์ BLOB ของตารางอย่างแท้จริง เราจำเป็นต้องทำการกำหนดค่าต่อไปนี้เท่านั้น (โดยใช้ Object Inspector):
DBImage1.DataSource = แหล่งข้อมูล1
DBImage1.Field = รูปภาพ
นี่เป็นเคล็ดลับที่จำเป็นในการแสดงรูปภาพ JPEG ที่มีอยู่ในฟิลด์รูปภาพของตารางแอปพลิเคชัน
เพื่อตรวจสอบว่าการกำหนดค่านี้ใช้งานได้ สิ่งเดียวที่เราต้องทำคือตั้งค่าคุณสมบัติ Active ของส่วนประกอบ ADOTable1 เป็น True เราสามารถทำได้ใน Object Inspector ระหว่างการออกแบบ เมื่อคุณทำเช่นนี้ กล่องโต้ตอบต่อไปนี้จะปรากฏขึ้น:
อะไร เหตุใดจึงแสดง "ภาพบิตแมปไม่ถูกต้อง" เรามีภาพ JPEG แทนที่จะเป็นภาพ BMP นั่นเป็นปัญหาหรือไม่ ให้กลับไปช่วย
หลังจากคลิกวิธีใช้ไปสักพัก ฉันก็สรุปได้ว่า เพื่อให้ได้ภาพ JPG ในฐานข้อมูล เราต้องใช้วัตถุ TJpegImage ในการแสดงรูปภาพ เราจำเป็นต้องมีคอมโพเนนต์รูปภาพเวอร์ชันที่เรียบง่ายและมองไม่เห็น ในเวลาเดียวกัน เราจำเป็นต้องใช้สตรีมเพื่อโหลดรูปภาพจากวัตถุ BLOB คำอธิบายเอกสารช่วยเหลือ: เราควรใช้ TADOBlobStream เพื่อเข้าถึงหรือเปลี่ยนค่าของฟิลด์ BLOB หรือบันทึกช่วยจำ (บันทึกย่อ) ในชุดข้อมูล ADO
ส่วนที่ 3: การใช้สตรีมเพื่อแยก JPEG—วิธีที่ผิด
การดึง JPEG - เอาไปสอง!
เนื่องจากเราไม่สามารถทำอะไรกับ DBImage ได้ ให้ลบมันออกจากแบบฟอร์มและใส่คอมโพเนนต์ TImage ปกติ (หน้าเพิ่มเติม) ชื่อ ADOImage ขออภัย คอมโพเนนต์รูปภาพไม่มีคุณสมบัติ data-aware ดังนั้นจึงจำเป็นต้องใช้โปรแกรมแยกต่างหากเพื่อแสดงรูปภาพจากตารางฐานข้อมูลที่เป็นตัวแทน วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือการวางปุ่มบนแบบฟอร์ม ใส่โค้ดโปรแกรมทั้งหมดลงในเหตุการณ์ OnClick และตั้งชื่อปุ่ม: "btnShowImage"
ในการใช้ ADOBLOBStream เอกสารวิธีใช้แนะนำให้สร้างอินสแตนซ์ TADOBlobStream โดยใช้วิธี "สตรีม" เพื่ออ่านฟิลด์กราฟิกจากชุดข้อมูล จากนั้นจึงปล่อยสตรีม BLOB ตรงกลาง เราจะต้องโหลดรูปภาพ JPEG จากวัตถุ TADOBlobStream โดยใช้วิธี LoadFromStream คุณสมบัติรูปภาพและกราฟิกของส่วนประกอบรูปภาพจะถูกใช้เพื่อจัดเก็บและแสดงรูปภาพจริง
วัตถุสนาม มันคืออะไร?
ณ จุดนี้ ฉันคิดว่าความรู้เพียงเล็กน้อยเกี่ยวกับวัตถุภาคสนามก็เพียงพอแล้วสำหรับคุณที่จะเชี่ยวชาญบทนี้ ในการพัฒนาฐานข้อมูล Delphi หนึ่งในวัตถุหลักคือวัตถุ TField ส่วนประกอบของฟิลด์เป็นวัตถุที่ไม่ใช่ภาพซึ่งแสดงถึงฟิลด์ของชุดข้อมูลในขณะดำเนินการ (หรือเวลาออกแบบ) TADOTable (และคลาสย่อย TDataSet อื่นๆ) ให้การเข้าถึง Fields Editor ในเวลาออกแบบ ตัวแก้ไขฟิลด์ช่วยให้คุณสามารถเลือกฟิลด์ที่คุณต้องการรวมไว้ในชุดข้อมูลได้ ที่สำคัญกว่านั้นคือสร้างรายการส่วนประกอบฟิลด์ที่มีประสิทธิภาพซึ่งใช้ในชุดข้อมูลของแอปพลิเคชัน หากต้องการเรียกใช้ Fields Editor ให้คลิกสองครั้งที่ส่วนประกอบ TADOTable ตามค่าเริ่มต้น รายการฟิลด์จะว่างเปล่า คลิกปุ่มเพิ่มเพื่อเปิดกล่องโต้ตอบที่แสดงรายการเขตข้อมูลของตารางแอปพลิเคชัน ตามค่าเริ่มต้น ฟิลด์ทั้งหมดจะถูกเลือก จากนั้นเลือก ตกลง
Delphi จะให้ชื่อเริ่มต้นของฟิลด์ดังนี้: ชื่อตาราง (ตาราง) + ชื่อฟิลด์ (ฟิลด์) ซึ่งหมายความว่าฟิลด์รูปภาพของเรามีชื่อว่า: ADOTable1Picture
วิธีการสร้างของ TADOBlobStream จะสร้างอินสแตนซ์สำหรับการอ่านหรือเขียนออบเจ็กต์ฟิลด์ BLOB ที่ระบุ ในกรณีนี้คือฟิลด์ ADOTable1Picture
เราเขียนโค้ดโปรแกรมในเหตุการณ์ OnClick ของปุ่ม btnShowImage รหัสนี้จะอ่านรูปภาพจากฟิลด์รูปภาพของแถวที่เลือกในปัจจุบัน ซอร์สโค้ดมีดังนี้:
ใช้ jpeg;
-
PROcedure TForm1.btnShowImageClick (ผู้ส่ง: TObject);
var bS: TADOBlobStream;
ภาพ: TJpegImage;
เริ่ม
BS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
พยายาม
Pic:=TJpegImage.Create;
พยายาม
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
ในที่สุด
Pic.ฟรี;
จบ ;
ในที่สุด
BS.ฟรี
จบ ;
จบ ;
โอเค มาเริ่มโปรเจ็กต์นี้กันดีกว่า แน่นอน ให้ตั้งค่าคุณสมบัติ ADOTable1.Active เป็น True หลังจากแสดงแบบฟอร์มแล้ว ให้คลิกปุ่ม จากนั้นหน้าจอต่อไปนี้จะปรากฏขึ้น:
เอ่อเกิดอะไรขึ้น? รหัสถูกต้อง 100% แต่ทำไมรูปภาพจึงไม่แสดง จำไว้ว่า "อย่ายอมแพ้ อย่ายอมแพ้"! มาเจาะลึกถึงระดับไบต์แล้วดูว่าเกิดอะไรขึ้น!