ในปัจจุบัน ในบรรดาเครื่องมือพัฒนาซอฟต์แวร์ Delphi ได้กลายเป็นเครื่องมือการพัฒนาที่รวดเร็วที่ได้รับการยอมรับทั่วโลก เนื่องจากมีการควบคุมมากมาย ความสามารถในการเขียนโปรแกรมเชิงวัตถุที่แข็งแกร่ง ความเร็วในการดำเนินการโค้ดที่รวดเร็ว และความเรียบง่ายและใช้งานง่าย ผสมผสานกับสภาพแวดล้อมการพัฒนาด้วยภาพและคอมไพเลอร์ที่เร็วที่สุด เทคโนโลยี เครื่องมือพัฒนาแอปพลิเคชันกำลังถูกใช้โดยโปรแกรมเมอร์มากขึ้นเรื่อยๆ คุณสามารถใช้ Delphi เพื่อเขียนแอพพลิเคชั่น Windows ต่างๆ โดยเฉพาะการพัฒนาระบบจัดการข้อมูลฐานข้อมูลซึ่งมีข้อดีเฉพาะตัว ในกระบวนการพัฒนาระบบการจัดการข้อมูลฐานข้อมูล เรามักจะต้องพิมพ์รายงานจำนวนมาก การใช้ Delphi เพื่อออกแบบรายงานที่ซับซ้อนนั้นเป็นเหตุการณ์ที่ยุ่งยาก มันไม่ง่ายเหมือน Visual FoxPRo อย่างไรก็ตาม เนื่องจากการควบคุมยังใช้ในการออกแบบรายงานใน Delphi เราจึงสามารถสร้างการควบคุมรายงานที่จำเป็นได้โดยตรงระหว่างการทำงานของโปรแกรมเพื่อสร้างรายงานแบบเรียลไทม์ และตัวอย่างรายงานที่สร้างขึ้นสามารถกำหนดได้โดยการควบคุมโปรแกรม ตัวอย่างเช่น เมื่อเราสืบค้นข้อมูลฐานข้อมูล โดยทั่วไปโครงสร้างของข้อมูลผลลัพธ์จะไม่ได้รับการแก้ไข หากเราต้องการพิมพ์ผลลัพธ์การสืบค้น การออกแบบรายงานเพียงรูปแบบเดียวนั้นไม่เพียงพอ เราต้องออกแบบรูปแบบหนึ่งสำหรับข้อมูลผลลัพธ์ที่เป็นไปได้ทั้งหมด การจัดรูปแบบรายงานก็ไม่ใช่วิธีแก้ปัญหาที่ดีเช่นกัน เพื่อแก้ไขปัญหาดังกล่าว เราสามารถใช้เทคโนโลยีการสร้างรายงานแบบเรียลไทม์ได้ วัตถุประสงค์ของบทความนี้คือเพื่อแนะนำรายละเอียดวิธีสร้างรายงานแบบเรียลไทม์ผ่านตัวอย่าง
ตัวอย่างนี้จะออกแบบกล่องโต้ตอบการพิมพ์ ซึ่งรวมถึงตัวควบคุม TQickRep และตัวควบคุมตัวควบคุมสไตล์รายงานบางอย่าง ลักษณะที่ปรากฏของแบบฟอร์มอื่นๆ ดังแสดงด้านล่าง:
1. คำอธิบายฟังก์ชั่นการควบคุม
QuickRep:TQuickRep ประกอบด้วยส่วนหัวคอลัมน์ (HB:TQRBand), รายละเอียด (DB:TQRBand), ส่วนท้าย (FB:TQRBand), แถบสรุป (SB:TQRBand) และรายละเอียด ส่วนท้าย และข้อมูลสรุปไม่รวม TQRLabel , TQREpr หรือการควบคุม TDBText ซึ่งส่วนใหญ่จะสร้างขึ้นเมื่อมีการดำเนินการโปรแกรม โซนส่วนหัวของคอลัมน์ประกอบด้วยชื่อเรื่อง (TQRLabel) สำหรับชื่อรายงาน TQRLabel ใช้สำหรับเงื่อนไขการสืบค้น คุณสมบัติคำอธิบายภาพของตัวควบคุมทั้งสองนี้สามารถเปลี่ยนแปลงได้ตามต้องการระหว่างการทำงานของโปรแกรม เพื่อป้องกันไม่ให้ QuickRep แสดง ให้วางไว้ด้านหลัง Panel1 (Tpanel) และขยาย Panel1 ให้เป็นแบบฟอร์มทั้งหมด
แบบสอบถาม: การควบคุมคำสั่ง TQuery SQL โปรแกรมจะสร้างรายงานตามผลลัพธ์ที่ส่งคืนโดย Query ดังนั้น เมื่อสร้างแบบฟอร์มนี้ คุณต้องระบุคำสั่ง SQL สำหรับคุณสมบัติ Query.SQL
ในรูปแบบข้างต้น ตัวควบคุมที่รวมอยู่ในคอลัมน์ "กระดาษ" และ "การตั้งค่าหน้ากระดาษ" เป็นตัวควบคุมสำหรับคุณสมบัติ QuickRep.Page การเปลี่ยนแปลงเหล่านี้เมื่อดำเนินการโปรแกรมจะเปลี่ยนค่าคุณสมบัติของตัวควบคุม QuickRep โดยตรง ทำผ่านเหตุการณ์ OnChange หรือ OnExit เสร็จสมบูรณ์
ชื่อเรื่องในคอลัมน์ "การตั้งค่าเนื้อหาการพิมพ์" คือชื่อของรายงานที่ระบุ (TT:TEdit) ค่าของมันสอดคล้องกับ QuickRep.ReportTitle และ Title.Caption และสามารถเปลี่ยนแปลงได้ตามต้องการ โดยช่องทำเครื่องหมาย "Print Query Conditions" จะระบุ ไม่ว่าจะเลือกกล่องกาเครื่องหมายนี้โดยตรงหรือไม่ "การจัดตำแหน่งคอลัมน์ตาราง" ส่วนใหญ่จะใช้สำหรับการจัดตำแหน่งเนื้อหาโดยละเอียดเมื่อสร้างรายงาน เปลี่ยนตัวแปรควบคุม RD1 ค่า (ไบต์) (0 การจัดตำแหน่งอัตโนมัติ 1 การจัดตำแหน่งตรงกลาง 2 การจัดตำแหน่งด้านซ้าย) "ความกว้างในการพิมพ์คอลัมน์ตาราง" ประกอบด้วยชุดปุ่มตัวเลือก ซึ่งส่วนใหญ่ใช้สำหรับความกว้างของค่าคอลัมน์เมื่อสร้างรูปแบบรายงานและการเปลี่ยนแปลง ตัวแปรควบคุม ค่าของ RD2 (ไบต์) (ความกว้างอัตโนมัติ 0, 1 ความกว้างเท่ากัน, 2 จำกัดความกว้างสูงสุด) เมื่อคุณเลือก 1 ความกว้างเท่ากัน, 2 จำกัดความกว้างสูงสุด คุณจะต้องป้อนความกว้างเป็นพิกเซล "วิธีการทางสถิติ" ระบุว่ารายงานมีส่วนท้ายหรือไม่ (FB: TQRBAND) และผลรวม ( SB: TQRBAND ) โซน
2. คำอธิบายโปรแกรม
โปรแกรมกำหนดประเภทต่อไปนี้:
TQRLabelName=อาร์เรย์ของ TQRLabel;
TQRDBTextName=อาร์เรย์ของ TQRDBText;
TQRSShapeName=อาร์เรย์ของ TQRSShape;
TQRExName=อาร์เรย์ของ TQRExpr;
ประเภทข้างต้นเป็นประเภทอาร์เรย์แบบไดนามิก และแต่ละองค์ประกอบของข้อมูลเป็นคลาส เมื่อสร้างการควบคุมรายงานแบบเรียลไทม์ จำนวนการควบคุมที่จะสร้างไม่แน่นอน และไม่สามารถระบุชื่อการควบคุมได้ การใช้อาร์เรย์แบบไดนามิกเป็นวิธีแก้ปัญหาที่ดีกว่า กล่าวคือ คุณสามารถระบุขนาดของข้อมูลได้ตามใจชอบโดยไม่ต้องจัดการหน่วยความจำ จัดสรรตัวเอง ปัญหานี้ยังอำนวยความสะดวกในการเปิดตัวและการประมวลผลการควบคุมที่มีอยู่ในรายงาน โปรแกรมยังประกาศตัวแปรประเภทต่างๆ ข้างต้น ดังนี้
CHBName:TQRLLabelName;
DBName:TQRDBTextName;
CHBShape,DBShape,FBShape,SumShape:TQRSShapeName;
FBName,SumName:TQREpName;
ตัวแปรอาร์เรย์เหล่านี้จะจัดสรรหน่วยความจำตามผลลัพธ์ของฟิลด์ที่ส่งคืนโดย Query เมื่อสร้างแบบฟอร์มแต่ละฟิลด์จะสอดคล้องกับองค์ประกอบของอาร์เรย์
กระบวนการดำเนินการของโปรแกรม: เมื่อมีการสร้างและแสดงแบบฟอร์ม การดำเนินการเริ่มต้นจะถูกสร้างขึ้นสำหรับแบบฟอร์มนี้ แสดงค่าที่สอดคล้องกันของคุณสมบัติ QuickRep.Page ในเหตุการณ์ OnCreate ดำเนินการ Query.Open ในเหตุการณ์ OnShow และจัดสรรพื้นที่ตัวแปรอาร์เรย์ควบคุมตามผลลัพธ์ที่ส่งคืน หลังจากสร้างแบบฟอร์มแล้ว ให้คลิกปุ่ม "สร้าง" เพื่อสร้างรายงาน (โดยไม่สนใจฟิลด์บันทึกช่วยจำและฟิลด์ภาพถ่าย) จากนั้นคลิก "พิมพ์" และ "ดูตัวอย่าง" เพื่อพิมพ์หรือดูตัวอย่างรายงาน เมื่อการตั้งค่ามีการเปลี่ยนแปลงหลังจากสร้างรายงานแล้ว จะต้องสร้างรายงานใหม่ หากมีฟิลด์ชุดผลลัพธ์ที่ส่งคืนโดย Query มากเกินไป ขนาดกระดาษอาจไม่เพียงพอที่จะสร้างรายงานทั้งหมดเมื่อสร้างรายงาน คุณสามารถปรับขนาดกระดาษรายงานแล้วสร้างรายงานได้ เมื่อปิดแบบฟอร์ม ตัวควบคุมที่สร้างขึ้นจะถูกนำออกใช้
3. รายชื่อโปรแกรมที่มาและความคิดเห็น
หน่วย PrintDlg;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ,
StdCtrls, ปุ่ม, ExtCtrls, หมุน, QuickRpt, QRPrntr, เครื่องพิมพ์, Qrctrls,
Db,DBTables,ComCtrls,SysIni;
พิมพ์
TQRLabelName=array ของ TQRLabel;//Dynamic array ของส่วนควบคุมชื่อคอลัมน์ในแถบส่วนหัวของคอลัมน์
TQRDBTextName=array ของ TQRDBText; //Dynamic array ของตัวควบคุมชื่อคอลัมน์ในย่านรายละเอียด
TQRShapeName=array ของ TQRShape; //Dynamic array ของส่วนควบคุมบรรทัด
TQREpName=array ของ TQRExpr; //อาเรย์แบบไดนามิกของคลาสควบคุมทางสถิติ
TPrintForm = คลาส (TForm)
GroupBox1: TGroupBox;
Label5: TLabel;
BtnSet: TbitBtn;//ปุ่มควบคุม "การตั้งค่า"
BtnCancel: TBitBtn; // ปุ่มควบคุม "ปิด"
แผง 1: TPanel;
BtnPrint: TBitBtn; // ปุ่มควบคุม "พิมพ์"
BtnPrview: TBitBtn; // ปุ่ม "ดูตัวอย่าง"
QuickRep: TQuickRep; // การควบคุมรายงานด่วน
HB: TQRBand; // การควบคุมแบนด์ "ส่วนหัวคอลัมน์"
หัวข้อ: TQRLabel;//การควบคุมชื่อรายงาน
QRE1: TQREpr;//ตัวควบคุม "หมายเลขหน้า" ในแถบส่วนหัวคอลัมน์
QRE2: TQREpr;//ตัวควบคุม "Date" ในแถบส่วนหัวคอลัมน์
แผง2: TPanel;
Label1: TLabel;
R1: ตัวควบคุม TRadioButton;//"พิมพ์แนวตั้ง"
R2: ตัวควบคุม TRadioButton;//"การพิมพ์แนวนอน"
GroupBox4: TGroupBox;
TT: TEdit; // การควบคุมกล่องใส่ชื่อเรื่อง
Label2: TLabel;
SR: TCheckBox; // การควบคุม "เงื่อนไขการสืบค้นการพิมพ์"
Label3: TLabel;
ภาพที่ 1: TImage;//แสดงภาพที่พิมพ์ในแนวตั้ง
Image2: TImage;//แสดงภาพการพิมพ์แนวนอน
QRSQL: TQRLabel; // ใช้เพื่อแสดงตัวควบคุม "เงื่อนไขแบบสอบถาม" ในแถบส่วนหัวของคอลัมน์
GroupBox2: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
PageSpace: TEdit; // การควบคุมช่องป้อนข้อมูลระยะห่างคอลัมน์
PageTop: TEdit; // การควบคุมช่องป้อนข้อมูลที่ระยะขอบหน้า
PageBottom: TEdit; // การควบคุมช่องป้อนข้อมูลใต้ระยะขอบหน้า
PageLeft: TEdit; // ระยะขอบซ้ายของกล่องควบคุม
PageRight: TEdit; // การควบคุมช่องป้อนข้อมูลด้านขวาของหน้า
PageDlux: TCheckBox; // การควบคุม "การพิมพ์สองด้าน"
PageCol: TEdit; // การควบคุมกล่องอินพุตคอลัมน์
หน้า: TEdit; // พิมพ์ตัวควบคุมช่องป้อนตัวเลข
PaperH: TEdit; // การควบคุมกล่องอินพุตความยาวกระดาษ
PaperW: TEdit;//ตัวควบคุมกล่องอินพุตความกว้างกระดาษ
Label4: TLabel;
Label6: TLabel;
Ps: TComboBox;//การควบคุมกล่องรายการโมเดลกระดาษ
แบบสอบถาม: TQuery;//การควบคุมแบบสอบถาม SQL
DB: TQRBand; // การควบคุมแบนด์ "รายละเอียด"
CrtRep: TBitBtn; // ปุ่มควบคุม "สร้าง"
Label14: TLabel;
Label15: TLabel;
แผง 3: TPanel;
Wdauto: TRadioButton; // การควบคุม "ความกว้างอัตโนมัติ"
Wdall: TRadioButton; // การควบคุม "ความกว้างเท่ากัน"
Wdmax: TRadioButton; // การควบคุม "จำกัดความกว้าง"
Label16: TLabel;
ColWd: TEdit; // การควบคุมกล่องอินพุตความกว้างของคอลัมน์
แผง 4: แผง TPanel;
DJAUTO: TRadioButton; // การควบคุม "จัดตำแหน่งอัตโนมัติ"
DJCENTER: TRadioButton; // การควบคุม "ศูนย์กลาง"
DJLEFT: TRAdioButton; // ตัวควบคุม "จัดชิดซ้าย"
FB: TQRBand; // การควบคุมแบนด์ส่วนท้าย
Label17: TLabel;
แผง 5: TPanel;
TJ1: TCheckBox; // การควบคุม "สถิติต่อหน้า"
TJ2: TCheckBox; // การควบคุม "ผลรวมทางสถิติ"
SB: TQRBand; // การควบคุมวงรวม
ขั้นตอน FormCreate (ผู้ส่ง: TObject);
ขั้นตอน RadioButtonClick (ผู้ส่ง: TObject);
ขั้นตอน PageDluxClick (ผู้ส่ง: TObject);
ขั้นตอน PageColChange (ผู้ส่ง: TObject);
ขั้นตอน PageSpaceExit (ผู้ส่ง: TObject);
ขั้นตอน PagesChange (ผู้ส่ง: TObject);
ขั้นตอน PageTopExit (ผู้ส่ง: TObject);
ขั้นตอน PageBottomExit (ผู้ส่ง: TObject);
ขั้นตอน PageLeftExit (ผู้ส่ง: TObject);
ขั้นตอน PageRightExit (ผู้ส่ง: TObject);
ขั้นตอน TTExit (ผู้ส่ง: TObject);
ขั้นตอน DTClick (ผู้ส่ง: TObject);
ขั้นตอน BtnPrviewClick (ผู้ส่ง: TObject);
ขั้นตอน BtnSetClick (ผู้ส่ง: TObject);
ขั้นตอน PsChange (ผู้ส่ง: TObject);
ขั้นตอน PaperChange (ผู้ส่ง: TObject);
ขั้นตอน FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
ขั้นตอน FormDestroy (ผู้ส่ง: TObject);
ขั้นตอน CreateReport (ผู้ส่ง: TObject);
ขั้นตอน SRClick (ผู้ส่ง: TObject);
ขั้นตอน ClearRep();
ขั้นตอน FormShow (ผู้ส่ง: TObject);
ขั้นตอน PaperSizeChg (ผู้ส่ง: TObject);
ขั้นตอน DJChage (ผู้ส่ง: TObject);
ขั้นตอน WdChage (ผู้ส่ง: TObject);
ขั้นตอน QuickRepStartPage (ผู้ส่ง: TCustomQuickRep);
ขั้นตอน BtnPrintClick (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
CHBName:TQRLabelName;//กำหนดชื่อตัวควบคุมแถบส่วนหัวของคอลัมน์ ชื่ออาร์เรย์แบบไดนามิก
DBName:TQRDBTextName; //กำหนดชื่ออาร์เรย์แบบไดนามิกของชื่อตัวควบคุมแถบรายละเอียด
CHBShape,DBShape,FBShape,SumShape:TQRShapeName; //กำหนดชื่ออาร์เรย์แบบไดนามิกของตัวควบคุมบรรทัด
FBName,SumName:TQREpName; //กำหนดชื่ออาร์เรย์แบบไดนามิกของส่วนท้าย (FBNAME) และชื่อตัวควบคุมวงผลรวม (SUMNAME)
DJ:TAlignment;//การจัดตำแหน่งคอลัมน์ (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte; //ใช้เพื่อบันทึกชื่อตัวแปรสถานะการจัดตำแหน่งคอลัมน์ของตาราง (RD1) และความกว้างในการพิมพ์ (RD2)
สาธารณะ
{ประกาศสาธารณะ}
CXTJ,BT:String;//CXTJ เก็บเงื่อนไขการสืบค้น BT เก็บชื่อรายงาน
//ระบุตามแบบฟอร์มระดับบน
จบ;
ค่าคงที่
PaperSize:array[0..26] ของ TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
LetterSmall, แท็บลอยด์, บัญชีแยกประเภท, กฎหมาย, คำชี้แจง, ผู้บริหาร, โฟลิโอ,
Quarto, qr10X14, qr11X17, หมายเหตุ, Env9, Env10, Env11, Env12,
Env14, CSheet, DSheet, ESheet, กำหนดเอง);
//ประเภทกระดาษที่แสดงโดย QuickRep
var
แบบฟอร์มการพิมพ์: TPrintForm;
การดำเนินการ
{$R *.DFM}
ขั้นตอน TPrintForm.FormCreate (ผู้ส่ง: TObject);
//แสดงคุณสมบัติ QuickRep.Page และค่าคุณสมบัติอื่นๆ
var
ฉัน:ไบต์;
เริ่ม
PageCol.Text:=IntToStr(QuickRep.Page.Columns);
PageSpace.Text:=FormatFloat('0.00',QuickRep.Page.ColumnSpace);
PageTop.Text:=FormatFloat('0.00',QuickRep.Page.TopMargin);
PageBottom.Text:=FormatFloat('0.00',QuickRep.Page.BottomMargin);
PageLeft.Text:=FormatFloat('0.00',QuickRep.Page.LeftMargin);
PageRight.Text:=FormatFloat('0.00',QuickRep.Page.RightMargin);
PageSpace.Text:=FormatFloat('0.00',QuickRep.page.ColumnSpace);
R1.Checked:=QuickRep.Page.Orientation=poPortrait;
Image1.Visible:=R1.ตรวจสอบแล้ว;
R2.Checked:=QuickRep.Page.Orientation=poLandscape;
Image2.Visible:=R2.ตรวจสอบแล้ว;
PageDlux.Checked:=QuickRep.PrinterSettings.Duplex;
Pages.Text:=IntToStr(QuickRep.PrinterSettings.Copies);
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
สำหรับ I:=0 ถึง 26 do //PS กล่องรายการจะแสดงประเภทกระดาษ
ถ้า QuickRep.Page.PaperSize=PaperSize[I] ให้เริ่มต้น
PS.ItemIndex:=I;
หยุดพัก;
จบ;
//ตรวจสอบว่าสามารถเปลี่ยนความกว้างของกระดาษได้หรือไม่ โดยสามารถเปลี่ยนได้เฉพาะในกรณีที่ประเภทกระดาษได้รับการปรับแต่งเท่านั้น (Ps.ItemIndex=26)
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
จบ;
ขั้นตอน TPrintForm.RadioButtonClick (ผู้ส่ง: TObject);
// การจัดการเหตุการณ์การเปลี่ยนแปลงการวางแนวกระดาษ
var
ส:สตริง;
เริ่ม
Image1.Visible:=R1.ตรวจสอบแล้ว;
Image2.Visible:=R2.ตรวจสอบแล้ว;
ถ้า R1.ตรวจสอบแล้ว
QuickRep.Page.Orientation:=poPortrait
อื่น
QuickRep.Page.Orientation:=poLandscape;
//สลับค่าความกว้างและความยาวของกระดาษ
S:=PaperH.ข้อความ;
PaperH.Text:=PaperW.ข้อความ;
PaperW.Text:=S;
ถ้า (Ps.ItemIndex=26) หรือ (Ps.ItemIndex=0) ให้เริ่มต้น
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
จบ;
จบ;
ขั้นตอน TPrintForm.PageDluxClick (ผู้ส่ง: TObject);
เริ่ม
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
จบ;
ขั้นตอน TPrintForm.PageColChange (ผู้ส่ง: TObject);
เริ่ม
ถ้า StrToInt(PageCol.Text)<1 แล้ว PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
จบ;
ขั้นตอน TPrintForm.PageSpaceExit (ผู้ส่ง: TObject);
เริ่ม
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
จบ;
ขั้นตอน TPrintForm.PagesChange (ผู้ส่ง: TObject);
เริ่ม
ถ้า StrToInt(Pages.Text)<1 แล้ว Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
จบ;
ขั้นตอน TPrintForm.PageTopExit (ผู้ส่ง: TObject);
เริ่ม
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
จบ;
ขั้นตอน TPrintForm.PageBottomExit (ผู้ส่ง: TObject);
เริ่ม
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
จบ;
ขั้นตอน TPrintForm.PageLeftExit (ผู้ส่ง: TObject);
เริ่ม
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
จบ;
ขั้นตอน TPrintForm.PageRightExit (ผู้ส่ง: TObject);
เริ่ม
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
จบ;
ขั้นตอน TPrintForm.TTExit (ผู้ส่ง: TObject); // การจัดการเหตุการณ์การเปลี่ยนชื่อ
เริ่ม
QuickRep.ReportTitle:=TT.Text;
Title.Caption:=TT.Text;
Bt:=TT.ข้อความ;
จบ;
ขั้นตอน TPrintForm.DTClick (Sender: TObject); // เหตุการณ์กล่องกาเครื่องหมายเงื่อนไขแบบสอบถามการพิมพ์
เริ่ม
QRSQL.Enabled:=SR.ตรวจสอบแล้ว;
จบ;
ขั้นตอน TPrintForm.BtnPrviewClick (ผู้ส่ง: TObject); // เหตุการณ์การคลิกปุ่มดูตัวอย่าง
เริ่ม
QuickRep. ดูตัวอย่าง;
จบ;
ขั้นตอน TPrintForm.BtnSetClick (ผู้ส่ง: TObject); // เหตุการณ์การคลิกปุ่มตั้งค่า
เริ่ม
QuickRep.PrinterSetup;
จบ;
ขั้นตอน TPrintForm.PsChange (Sender: TObject); // เหตุการณ์การเปลี่ยนประเภทกระดาษ
เริ่ม
QuickREp.Page.PaperSize:=PaperSize[Ps.ItemIndex];
PaperH.Text:=FormatFloat('0.00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
CrtRep.Enabled:=จริง;
BtnPrint.Enabled:=ไม่ใช่ CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
จบ;
ขั้นตอน TPrintForm.PaperChange(Sender: TObject);//เหตุการณ์การเปลี่ยนแปลงความกว้างและความยาวกระดาษ
เริ่ม
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
จบ;
ขั้นตอน TPrintForm.FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
เริ่ม
การดำเนินการ:=caFree;
จบ;
ขั้นตอน TPrintForm.FormDestroy (ผู้ส่ง: TObject);
เริ่ม
เคลียร์ตัวแทน;
แบบฟอร์มการพิมพ์:=ไม่มี;
จบ;
ขั้นตอน TPrintForm.CreateReport (Sender: TObject); // สร้างเหตุการณ์คลิกปุ่มสร้าง
วาร์
ฉัน,L:ไบต์;
CHBtp, CHBlf, Cd, ObWidth: Word;
เริ่ม
หน้าจอ เคอร์เซอร์:=crHourGlass;
Title.Caption:=Bt;//ตั้งชื่อเรื่อง
ClearRep(); //ล้างวัตถุที่สร้างขึ้น;
ถ้า Sr.Checked แล้ว QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//จะพิมพ์เงื่อนไขการสืบค้นหรือไม่
CHBtp:=HB.Height-17;//ตำแหน่งบนสุดของการควบคุมที่สร้างขึ้นในแถบความถี่
CHBlf:=0; //ตัวควบคุมที่สร้างขึ้นอยู่ที่ตำแหน่งด้านซ้ายในแบนด์
ObWidth:=0; //ความกว้างของตัวควบคุมที่สร้างขึ้น
สำหรับ I := 0 ถึง Query.FieldCount-1 do //สร้างการควบคุมตามจำนวนฟิลด์ที่ส่งคืนโดย Query
เริ่ม
ถ้า (Query.Fields[I].DataType<>ftBlob) และ (Query.Fields[I].DataType<>ftMemo) แล้ว
start //ละเว้นฟิลด์บันทึกย่อและฟิลด์รูปภาพ
L:=Query.Fields[I].DataSize-1;//L=ความกว้างของฟิลด์ (ไบต์)-1
กรณี Rd1 ของ //ตั้งค่าการจัดตำแหน่งของตัวควบคุมตามการจัดตำแหน่งที่เลือก
0: ถ้า L<=10 แล้ว Dj:=taCenter อย่างอื่น DJ:=taLeftJustify;
//การจัดตำแหน่งอัตโนมัติ: ฟิลด์ที่น้อยกว่าหรือเท่ากับ 10 จะถูกจัดชิดตรงกลาง หรือจัดชิดซ้าย
1: Dj:=taCenter;//การจัดตำแหน่งกึ่งกลาง
2: DJ:=taLeftJustify;//การจัดตำแหน่งด้านซ้าย
จบ;
กรณี Rd2 ของ //ตั้งค่าความกว้างของคอลัมน์รายงานตามความกว้างของรายการที่เลือก
0: เริ่มต้น
//ความกว้างอัตโนมัติ: ถ้า L>14 แล้วความกว้าง ObWidth=14+(L-14)/2;
//ความกว้างไม่สามารถแสดงชื่อคอลัมน์ได้ ดังนั้น ObWidth=ความกว้างของชื่อคอลัมน์ ถ้าเป็นประเภทฟิลด์
//สำหรับประเภทวันที่ ประเภทสกุลเงิน และประเภทตัวเลขทศนิยม ObWidth=65
ถ้า L>14 แล้ว L:=14+(L-14) div 2;
ObWidth:=L*6;
L:=ความยาว(Query.Fields[I].DisplayName);
ถ้า ObWidth<L*6 แล้ว ObWidth:=L*6;
ObWidth:=ObWidth+2;
ถ้า (Query.Fields[I].DataType=ftDateTime) หรือ
(Query.Fields[I].DataType=ftFloat) หรือ
(Query.Fields[I].DataType=ftCurrency) จากนั้น ObWidth:=65;
จบ;
1: ถ้า ColWd.Text<>' ดังนั้น ObWidth:=StrToInt(ColWd.Text)
อื่น ObWidth:=100;//ความกว้างเดียวกัน:ObWidth=ค่าความกว้างอินพุต
2: เริ่มต้น //จำกัดความกว้างสูงสุด: ขั้นแรกให้คำนวณความกว้างอัตโนมัติ จากนั้นพิจารณาว่าความกว้างเกินค่าสูงสุดหรือไม่
//หากเกิน ObWidth=ค่าอินพุตความกว้างสูงสุด
ถ้า ColWd.Text<>' แล้ว Cd:=StrToInt(ColWd.Text)
อย่างอื่นซีดี:=200;
ObWidth:=L*6;
ถ้า ObWidth>Cd แล้วก็ ObWidth:=Cd;
ObWidth:=ObWidth+2;
ถ้า (Query.Fields[I].DataType=ftDateTime) หรือ
(Query.Fields[I].DataType=ftFloat) หรือ
(Query.Fields[I].DataType=ftCurrency) จากนั้น ObWidth:=65;
จบ;
จบ;
ถ้า CHBlf+ObWidth>=HB.Width ให้เริ่ม //Create control>paper width?
DlgMes:='ความกว้างของกระดาษไม่เพียงพอ โปรดเปลี่ยนขนาดกระดาษ -
กล่องข้อความ (จัดการ, DlgMes, Cap_Inf, Ico_Inf);
หยุดพัก;
จบ
เริ่มอย่างอื่น
CHBShape[I]:=TQRShape.Create(HB);//สร้างตัวควบคุมบรรทัดแถบส่วนหัวคอลัมน์
CHBShape[I].ผู้ปกครอง:=HB;
CHBShape[I].ด้านบน:=CHBtp;
CHBShape[I].ซ้าย:=CHBlf;
CHBShape[I].ความกว้าง:=ObWidth+1;
CHBShape[I].ความสูง:=17;
CHBNAME[I]:=TQRLabel.Create(HB); // สร้างการควบคุมชื่อคอลัมน์
CHBNAME[I].ผู้ปกครอง:=HB;
CHBNAME[I].ด้านบน:=CHBtp+2;
CHBNAME[I].ซ้าย:=CHBlf+1;
CHBNAME[I].ขนาดอัตโนมัติ:=เท็จ;
CHBNAME[I].ความกว้าง:=ObWidth-1;
CHBNAME[I].การจัดตำแหน่ง:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//รับฟิลด์เป็นชื่อคอลัมน์
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); // สร้างตัวควบคุมเส้นแถบรายละเอียด
DBShape[I].ผู้ปกครอง:=DB;
DBShape[I].ด้านบน:=-1;
DBShape[I].ซ้าย:=CHBlf;
DBShape[I].ความกว้าง:=ObWidth+1;
DBShape[I].ความสูง:=17;
DBNAME[I]:=TQRDBText.Create(DB); // สร้างการควบคุมแบนด์รายละเอียด
DBNAME[I].ผู้ปกครอง:=DB;
DBNAME[I].ParentReport:=QuickRep;
DBNAME[I].ด้านบน:=2;
DBNAME[I].ซ้าย:=CHBlf+2;
DBNAME[I].ขนาดอัตโนมัติ:=เท็จ;
DBNAME[I].ความกว้าง:=ObWidth-3;
DBNAME[I].ความสูง:=13;
DBNAME[I].การจัดตำแหน่ง:=Dj;
DBNAME[I].ชุดข้อมูล:=แบบสอบถาม;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
ถ้า Tj1.Checked ให้เริ่มต้น // คุณต้องการสร้างแถบส่วนท้ายหรือไม่?
FBShape[I]:=TQRShape.Create(FB); // สร้างตัวควบคุมบรรทัดส่วนท้าย
FBShape[I].ผู้ปกครอง:=FB;
FBShape[I].ด้านบน:=0;
FBShape[I].ซ้าย:=CHBlf;
FBShape[I].ความกว้าง:=ObWidth+1;
FBShape[I].ความสูง:=17;
ถ้า (Query.Fields[I].DataType=ftFloat) หรือ
(Query.Fields[I].DataType=ftCurrency) หรือ (I<2) จากนั้น
start //หากประเภทฟิลด์เป็นประเภทตัวเลข ให้สร้างมันขึ้นมา
FBNAME[I]:=TQRExr.Create(FB); // สร้างการควบคุมแบนด์ส่วนท้าย
FBNAME[I].ผู้ปกครอง:=FB;
FBNAME[I].รายงานผู้ปกครอง:=QuickRep;
FBNAME[I].ด้านบน:=3;
FBNAME[I].ซ้าย:=CHBlf+2;
FBNAME[I].ขนาดอัตโนมัติ:=False;
FBNAME[I].ความกว้าง:=ObWidth-3;
FBNAME[I].ความสูง:=13;
FBNAME[I].การจัดตำแหน่ง:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
จบ;
จบ;
ถ้า Tj2.Checked แล้ว start //เราควรสร้าง sum band หรือไม่?
SumShape[I]:=TQRShape.Create(SB); //สร้างตัวควบคุมเส้นผลรวม
SumShape[I].ผู้ปกครอง:=SB;
SumShape[I].ด้านบน:=0;
SumShape[I].ซ้าย:=CHBlf;
SumShape[I].ความกว้าง:=ObWidth+1;
SumShape[I].ความสูง:=17;
ถ้า (Query.Fields[I].DataType=ftFloat) หรือ
(Query.Fields[I].DataType=ftCurrency) หรือ (I<2) จากนั้น
start //หากประเภทฟิลด์เป็นประเภทตัวเลข ให้สร้างมันขึ้นมา
SumNAME[I]:=TQRExr.Create(SB); //สร้างตัวควบคุมวงผลรวม
SumNAME[I].ผู้ปกครอง:=SB;
SumNAME[I].ParentReport:=QuickRep;
ผลรวมNAME[I].ด้านบน:=3;
SumNAME[I].ซ้าย:=CHBlf+2;
SumNAME[I].ขนาดอัตโนมัติ:=False;
SumNAME[I].ความกว้าง:=ObWidth-3;
SumNAME[I].ความสูง:=13;
SumNAME[I].การจัดตำแหน่ง:=taCenter;
SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].BringToFront;
จบ;
จบ;
CHBlf:=CHBlf+ObWidth;//การประมวลผลฟิลด์ปัจจุบันเสร็จสมบูรณ์ ความกว้างหนึ่งฟิลด์ทางด้านขวา
จบ;
จบ;
จบ;
CrtRep.Enabled:=False;//ปิดการใช้งานปุ่มสร้าง
BtnPrint.Enabled:=ไม่ใช่ CrtRep.Enabled;อนุญาตให้พิมพ์ปุ่มแอมโมเนียม
BtnPrview.Enabled:=BtnPrint.Enabled;อนุญาตให้ใช้ปุ่มแสดงตัวอย่าง
ถ้า Tj1.Checked ให้เริ่มต้น //หากสร้างแถบส่วนท้าย ให้เปลี่ยนสองคอลัมน์แรกในแถบส่วนท้าย
FBNAME[0].Expression:=''จำนวนหน้าทั้งหมด'';
FBNAME[1].นิพจน์:='COUNT+'row'';
จบ;
ถ้า Tj1.Checked ให้เริ่มต้น //หากกำหนดแถบผลรวมแล้ว ให้เปลี่ยนสองคอลัมน์แรกในแถบผลรวม
SumNAME[0].นิพจน์:=''ทั้งหมด'';
SumNAME[1].นิพจน์:='COUNT+'row'';
จบ;
//ปรับตำแหน่งการพิมพ์วันที่และหมายเลขหน้าในโซนส่วนหัวของคอลัมน์
QRE2.ซ้าย:=HB.Width-Qre2.Width;
QRSQL.ซ้าย:=QRE1.กว้าง+10;
QRSQL.ความกว้าง:= QRE2.Left-10-QRSQL.Left;
QuickRep.DataSet:=Query; //ระบุชุดข้อมูลสำหรับ QuickRep ประโยคนี้ต้องไม่ขาดหายไป
หน้าจอ เคอร์เซอร์:=crDefault;
จบ;
ขั้นตอน TPrintForm.ClearRep();//ล้างการควบคุมที่สร้างขึ้นเมื่อสร้างรูปแบบรายงาน
วาร์
ฉัน:ไบต์;
เริ่ม
สำหรับ I:=0 ถึง Query.FieldCount-1 จะเริ่มต้น
ถ้าได้รับมอบหมาย (CHBShape[I]) ให้เริ่มต้น CHBShape[I].Free;CHBShape[I]:=nil;end;
ถ้าได้รับมอบหมาย (CHBNAME[I]) ให้เริ่มต้น CHBNAME[I].Free;CHBNAME[I]:=nil;end;
ถ้าได้รับมอบหมาย(DBShape[I]) ให้เริ่ม DBShape[I].Free;DBShape[I]:=nil;end;
ถ้าได้รับมอบหมาย (DBNAME[I]) ให้เริ่มต้น DBNAME[I].Free;DBNAME[I]:=nil;end;
ถ้าได้รับมอบหมาย(FBShape[I]) ให้เริ่ม FBShape[I].Free;FBShape[I]:=nil;end;
ถ้าได้รับมอบหมาย(FBNAME[I]) ให้เริ่ม FBNAME[I].Free;FBNAME[I]:=nil;end;
ถ้าได้รับมอบหมาย(SumShape[I]) ให้เริ่ม SumShape[I].Free;SumShape[I]:=nil;end;
ถ้าได้รับมอบหมาย(SumNAME[I]) ให้เริ่มต้น SumNAME[I].Free;SumNAME[I]:=nil;end;
จบ;
จบ;
ขั้นตอน TPrintForm.SRClick (ผู้ส่ง: TObject);
เริ่ม
ถ้า Sr.Checked แล้ว QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
จบ;
ขั้นตอน TPrintForm.FormShow (ผู้ส่ง: TObject); // เหตุการณ์การแสดงแบบฟอร์ม
เริ่ม
Query.Active:=True;//พิมพ์ SQL
TT.ข้อความ:=Bt;
QuickRep.ReportTitle:=Bt;//ตั้งชื่อเรื่อง
//อาร์เรย์ชื่อควบคุมจัดสรรพื้นที่
SetLength(CHBNAME,Query.FieldCount);
SetLength(CHBShape,Query.FieldCount);
SetLength(DBNAME,Query.FieldCount);
SetLength(DBShape,Query.FieldCount);
SetLength(FBNAME,Query.FieldCount);
SetLength(FBShape,Query.FieldCount);
SetLength(SumNAME,Query.FieldCount);
SetLength(SumShape,Query.FieldCount);
จบ;
ขั้นตอน TPrintForm.PaperSizeChg (ผู้ส่ง: TObject);
เริ่ม
CrtRep.Enabled:=จริง;
BtnPrint.Enabled:=ไม่ใช่ CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
จบ;
ขั้นตอน TPrintForm.DJChage (ผู้ส่ง: TObject); // การจัดการเหตุการณ์การเปลี่ยนแปลงการจัดตำแหน่ง
var
เปลี่ยน: ไบต์;
เริ่ม
ถ้า Djauto.Checked แล้ว Chg:=0
อย่างอื่นถ้า DjCenter.Checked แล้ว Chg:=1
อย่างอื่น Chg:=2;
ถ้า Chg<>Rd1 ให้เริ่ม PaperSizeChg(nil);Rd1:=Chg;end;
จบ;
ขั้นตอน TPrintForm.WdChage (ผู้ส่ง: TObject); // การจัดการเหตุการณ์การเปลี่ยนแปลงความกว้าง
var
เปลี่ยน: ไบต์;
เริ่ม
ถ้า Wdauto.Checked แล้ว Chg:=0
อย่างอื่นถ้า Wdall.Checked แล้วเริ่มต้น
เปลี่ยน:=1;
ถ้า ColWd.Text=' ดังนั้น ColWd.Text:='100';
จบ
เริ่มอย่างอื่น
เปลี่ยน:=2;
ถ้า ColWd.Text=' ดังนั้น ColWd.Text:='200';
จบ;
ถ้า Chg<>Rd2 ให้เริ่ม PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Enabled:=Chg<>0;
จบ;
ขั้นตอน TPrintForm.QuickRepStartPage (ผู้ส่ง: TCustomQuickRep);
//การพิมพ์รายงานเริ่มการประมวลผลเหตุการณ์หน้าใหม่ และค่าทางสถิติในส่วนท้ายจะถูกล้าง
วาร์
ฉัน:ไบต์;
เริ่ม
ถ้า Tj1.ตรวจสอบแล้ว
สำหรับ I:=0 ถึง Query.FieldCount-1 ทำ
ถ้าได้รับมอบหมาย (FBNAME[I]) แล้ว FBNAME[I].รีเซ็ต;
จบ;
ขั้นตอน TPrintForm.BtnPrintClick (ผู้ส่ง: TObject);
เริ่ม
QuickRep.พิมพ์;
จบ;
จบ.
4. ตัวอย่างกล่องโต้ตอบการโทร:
ขั้นแรก รวมหน่วย PrintDlg ในคำสั่ง USES ในแบบฟอร์มที่จะเรียก และจากนั้น ให้เรียกด้วยรหัสต่อไปนี้:
หากไม่ได้กำหนดไว้ (PrintForm) ให้ PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.กำหนด (Query.SQL);
//หากแบบฟอร์มการโทรไม่มีตัวควบคุม Query คุณสามารถตั้งค่าของคำสั่ง SQL ได้โดยตรง
PrintForm.Bt:=ชื่อรายงาน;
PrintForm.Caption:=ชื่อแบบฟอร์ม;
PrintForm.CXTJ:=เงื่อนไขแบบสอบถาม;
PrintForm.ShowModal;
5. บทสรุป
กุญแจสำคัญของโปรแกรมนี้คือกระบวนการเหตุการณ์ CreateReport และการประมวลผลชื่อตัวควบคุมแบบไดนามิก เนื่องจากมีพื้นที่จำกัด จึงไม่มีการอธิบายเนื้อหาบางส่วน และหวังว่าผู้อ่านจะเข้าใจได้ด้วยตัวเอง สำหรับการสร้างรายงานทั่วไป โปรแกรมนี้สามารถตอบสนองความต้องการได้
ฉันมีเวอร์ชันล่าสุดซึ่งมีฟังก์ชันที่แข็งแกร่งกว่า เพื่อนๆ ที่ต้องการสามารถส่งอีเมลถึงฉันและฉันจะส่งอีเมลให้แน่นอน