เมื่อผู้คนใช้ Delphi เพื่อพัฒนาแอปพลิเคชันฐานข้อมูลพวกเขามักจะใช้การควบคุมตารางเพื่อจัดทำรายงาน การใช้งานที่ยืดหยุ่นของเหตุการณ์ onDrawcell ของการควบคุมตารางสามารถทำให้การแสดงผลพิเศษบางอย่างซึ่งสามารถตอบสนองความต้องการของผู้ใช้ได้ดีขึ้น บทความนี้แนะนำเคล็ดลับสามข้อสำหรับการใช้งาน OnDrawCell อย่างยืดหยุ่น
อัปเดตสีของแถวตารางแบบไดนามิก
บางครั้งจำเป็นต้องอัปเดตสีของแถวตารางแบบไดนามิกในรายงาน ตัวอย่างเช่นในรายการซัพพลายเออร์ซัพพลายเออร์ที่เป็นที่ต้องการจะแสดงเป็นสีเขียวในขณะที่ซัพพลายเออร์รายอื่นจะแสดงเป็นสีแดง ในเวลานี้คุณสามารถใช้รหัสต่อไปนี้เพื่อนำไปใช้ในเหตุการณ์ OnDrawCell:
ถ้า table1.fieldbyname ('custno'). asinteger> 1500 แล้ว
dbgrid1.canvas.font.color: = clred;
dbgrid1.defaultdrawcolumncell (rect, datacol,
คอลัมน์รัฐ)
รหัสข้างต้นสามารถขยายได้ตามความต้องการของแอปพลิเคชัน ตัวอย่างเช่นเมื่อคุณต้องการแสดงเป็นตัวหนาเพียงเปลี่ยนบรรทัดที่เกี่ยวข้องเป็น:
dbgrid1.canvas.font.style: = [fsbold];
แทรกการควบคุมภาพอื่น ๆ ในตาราง
ในการเขียนโปรแกรมฐานข้อมูลข้อ จำกัด ของคีย์ต่างประเทศเป็นวิธีที่มีประสิทธิภาพเพื่อให้แน่ใจว่าข้อมูลในฐานข้อมูลจะถูกเก็บไว้ตามข้อกำหนดของผู้ใช้ ตัวอย่างเช่นในสภาพแวดล้อมการประมวลผลคำสั่งซื้อมีข้อ จำกัด ของคีย์ต่างประเทศระหว่างตารางการสั่งซื้อและตารางลูกค้านั่นคือแต่ละบันทึกในตารางการสั่งซื้อควรมีรายการที่สอดคล้องกันในตารางลูกค้า ด้วยวิธีนี้เมื่อกรอกแบบฟอร์มการสั่งซื้อหากรายการลูกค้ามีให้สำหรับผู้ใช้ในการเลือกในโฟกัสอินพุตความถูกต้องของข้อมูลจะได้รับการรับประกันอย่างมีประสิทธิภาพ
ทั้งการควบคุม DBGRID และการควบคุม StringGrid นั้นได้มาจาก TCUSTOMGRID ซึ่งการควบคุม DBGRID สามารถป้อนข้อมูลได้ กลไกภายในของ Delphi สำหรับการประมวลผล DBGrid คือการลอยควบคุม dbedit บนกริด กริดที่สามารถรับโฟกัสและข้อมูลอินพุตเป็นตัวควบคุม dbedit ลอยได้ เพื่อให้ข้อมูลถูกป้อนบนตาราง ดังนั้นวิธีการแทรกการควบคุมภาพอื่น ๆ ลงในตารางคือการลอยการควบคุมภาพบนกริด ดังนั้นโดยหลักการแล้วการควบคุมใด ๆ สามารถแทรกในตาราง บทความนี้ใช้ตัวอย่างของการแทรกกล่องแบบเลื่อนลงในตารางเพื่อแนะนำขั้นตอนเฉพาะสำหรับการแทรกการควบคุมอื่น ๆ บนกริด
1. ตั้งค่าคุณสมบัติ
อ่านคุณสมบัติรายการของรายการไคลเอนต์ไปยังกล่องดรอปดาวน์
2. การตั้งค่ากิจกรรม OnDrawCell
เหตุการณ์ OnDrawcell ถูกไล่ออกเมื่อวาดเซลล์ของตาราง เมื่อฟิลด์ที่สอดคล้องกับเซลล์ที่ได้รับโฟกัสสอดคล้องกับฟิลด์ที่สอดคล้องกับกล่องแบบเลื่อนลงให้เลื่อนกล่องแบบหล่นลงไปยังกริดที่ได้รับโฟกัสและทำให้กล่องดรอปดาวน์มองเห็นได้ กล่องดรอปดาวน์ในคอลัมน์ที่ระบุของตาราง เหตุการณ์ OnDrawCell สำหรับการตั้งค่าตารางมีดังนี้:
ถ้า (gdfocused ในสถานะ) จากนั้น
เริ่ม
// หากฟิลด์ที่เกี่ยวข้องสอดคล้องกันให้ดำเนินการ
ถ้า (grid.cells [acol, 0] = 'บริษัท ') จากนั้น
เริ่ม
// เลื่อนกล่องดรอปดาวน์ไปยังตำแหน่งที่ระบุ
combobox1.left: = rect.left + grid.left;
combobox1.top: = rect.top + grid.top;
combobox1.width: = rect.right-rect.left;
combobox1.height: = rect.bottom-rect.top;
// ทำให้กล่องดรอปดาวน์มองเห็นได้และได้รับโฟกัส
combobox1.visible: = true;
combobox1.setfocus;
จบ;
จบ;
3. การตั้งค่ากิจกรรม onclick
หากฟิลด์ที่สอดคล้องกับเซลล์ที่ได้รับโฟกัสไม่ตรงกับฟิลด์ที่สอดคล้องกับกล่องดรอปดาวน์กล่องแบบเลื่อนลงจะมองไม่เห็น ในการทำเช่นนี้ให้ตั้งค่าเหตุการณ์ onclick ของตารางดังนี้:
if (grid.cells [grid.col, 0] <> 'บริษัท ') จากนั้น
เริ่ม
combobox1.visible: = false;
จบ;
4. การตั้งค่ากิจกรรม OnChange
ในเหตุการณ์ OnDrawcell เฉพาะงานวาดของเซลล์และการแสดงกล่องดรอปดาวน์จะเสร็จสมบูรณ์และไม่สามารถป้อนข้อมูลลงในตารางได้ ในการทำเช่นนี้ให้ตั้งค่าเหตุการณ์ onchange ของกล่องดรอปดาวน์ดังนี้:
grid.cells [grid.col, grid.row]: = combobox1
รายการ [combobox1.itemindex];
สิ่งนี้ทำให้งานแทรกกล่องแบบเลื่อนลงในตารางเสร็จสิ้น
แสดงฟิลด์กราฟิกในตาราง
ในการพัฒนาโปรแกรมบางครั้งจำเป็นต้องแสดงอักขระที่แปลกใหม่บางอย่างในรายงาน ตัวอย่างเช่นฟิลด์รายการตรวจสอบในรายงานการตรวจสอบส่วนมีอักขระที่ไม่เป็นทางการเช่นความหยาบของการตัดเฉือนชิ้นส่วนและความทนทานต่อการตัดเฉือน แนวคิดทั่วไปในการแก้ปัญหานี้คือการจัดเก็บอักขระที่แปลกใหม่เหล่านี้เป็นฟิลด์กราฟิกเช่นฟิลด์รูปภาพในฐานข้อมูล SQL Server อย่างไรก็ตามไม่ว่าจะเป็นตัวควบคุม StringGrid หรือ DBGrid Control มันสามารถแสดงสตริงได้โดยตรงซึ่งสร้างปัญหาของวิธีการแสดงฟิลด์กราฟิกบนตัวควบคุมตาราง
เมื่อมองแวบแรกปัญหานี้สามารถแก้ไขได้โดยการแทรกการควบคุม DBIMAGE ลงในตารางโดยใช้วิธีการข้างต้น อย่างไรก็ตามสิ่งนี้ต้องมีการแทรกการควบคุมด้วยหมายเลขเดียวกันกับบันทึก แต่ยังมีการกะพริบในฟิลด์กราฟิกอย่างเห็นได้ชัด ทางออกที่ดีกว่าคือการสร้างตัวควบคุม dbimage แบบไดนามิกเมื่อเชื่อมต่อกับฐานข้อมูลใช้เพื่ออ่านฟิลด์รูปภาพของฐานข้อมูลและบันทึกลงในฮาร์ดดิสก์ไคลเอ็นต์เป็นไฟล์ชั่วคราว อ่านไฟล์ชั่วคราวในเหตุการณ์ OnDrawCell ของตารางและทำงานให้เสร็จสมบูรณ์ นี่คือขั้นตอนเฉพาะในการแสดงฟิลด์กราฟในตาราง
1. บันทึกฟิลด์รูปภาพ
อ่านฟิลด์รูปภาพทั้งหมดเมื่อดำเนินการค้นหาและบันทึกลงในฮาร์ดดิสก์ไคลเอ็นต์
เริ่ม
... // ละเว้นคำสั่งค้นหา
ชื่อไฟล์: = 'D: EMP';
mydbimage: = tdbimage.create (self); // สร้าง dbimage
mydbimage.parent: = self;
mydbimage.datasource: = dataSource1;
MyDbimage .datafield: = 'คำอธิบาย'; // ระบุเป็นฟิลด์ "คำอธิบาย"
ดัชนี: = 1;
ในขณะที่ไม่ใช่ clientData.eof เริ่มต้น // อ่านฐานข้อมูล
s: = inttoStr (ดัชนี);
filename1: = filename+s;
filename1: = filename1+'. bmp';
// บันทึกไฟล์ชั่วคราว
MyDBIMAGE. PICTURE .BitMap .SavetOfile (FILENAME1); GRID .CELLS [0, INDEX]: = clientData.fieldByName ('หมายเลขชิ้นส่วน')
grid.cells [1, ดัชนี]: = '';
// กรอกแบบฟอร์ม
grid.cells [2, ดัชนี]: = clientData.fieldByName ('ข้อมูลที่วัดได้'). assTring;
clientdata.next;
ดัชนี: = ดัชนี+1;
จบ;
mydbimage.destroy ();
จบ;
2. คัดลอกกราฟิก
ตั้งค่าเหตุการณ์ OnDrawCell อ่านไฟล์ชั่วคราวและคัดลอกกราฟิกไปยังคอลัมน์ที่ระบุของตาราง:
if ((acol = 1) และ (arow> 0) และ (grid.colcount> 2)) จากนั้นเริ่มต้น
// ตารางต้องใช้คอลัมน์อย่างน้อยสองคอลัมน์
ชื่อไฟล์: = 'D: EMP';
s: = inttostr (arow);
ชื่อไฟล์: = ชื่อไฟล์+s;
ชื่อไฟล์: = ชื่อไฟล์+'. bmp';
myimage: = timage.create (self); // สร้างการควบคุมภาพ
myimage.parent: = ตัวเอง;
// อ่านไฟล์ชั่วคราว
myimage.picture.bitmap.loadfromfile (ชื่อไฟล์);
// คัดลอกกราฟิก
grid.canvas.draw (rect.left, rect.top, myimage
picture.graphic);
myimage.destroy ();
จบ;