This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
tutorial:printdatausinglazreport [2019/12/27 06:04] admin |
tutorial:printdatausinglazreport [2019/12/29 23:24] (current) admin |
||
|---|---|---|---|
| Line 32: | Line 32: | ||
| procedure Button1Click(Sender: TObject); | procedure Button1Click(Sender: TObject); | ||
| procedure Button2Click(Sender: TObject); | procedure Button2Click(Sender: TObject); | ||
| - | procedure frDesigner1LoadReport(Report: TfrReport; var ReportName: String); | ||
| procedure frReport1GetValue(const ParName: String; var ParValue: Variant); | procedure frReport1GetValue(const ParName: String; var ParValue: Variant); | ||
| procedure frUserDataset1CheckEOF(Sender: TObject; var Eof: Boolean); | procedure frUserDataset1CheckEOF(Sender: TObject; var Eof: Boolean); | ||
| Line 39: | Line 38: | ||
| </sxh> | </sxh> | ||
| \\ | \\ | ||
| + | **__หมายเหตุ__** - จะสังเกตว่าไม่มี Procedure เกี่ยวกับ frDesigner1 แต่ถึงกระนั้น frDesigner1 ก็ยังสำคัญเพราะหากเราไม่ใส่ Control ตัวนี้มาที่ Form1 เราจะไม่สามารถเรียกใช้งาน Procedure ที่ชื่อ frReport1.DesignReport() ซึ่มีไว้เปิด Report ในโหมด Design | ||
| + | |||
| + | |||
| 4. สร้างตัวแปรดังนี้ | 4. สร้างตัวแปรดังนี้ | ||
| - ตัวนับ index ของ Array ชื่อ "nc" ซึ่งเป็นตัวแปร integer | - ตัวนับ index ของ Array ชื่อ "nc" ซึ่งเป็นตัวแปร integer | ||
| Line 46: | Line 48: | ||
| <sxh delphi;> | <sxh delphi;> | ||
| - | var | + | var |
| Form1: TForm1; | Form1: TForm1; | ||
| - | ArrData:array[1..2,1..20] of real; //ArrayData to be printed | + | MyHeader:string = 'INFORMATION'; |
| - | nc:integer = 1; //Index of ArrayData | + | MyName:string = 'Lazarus-IDE'; |
| + | MyLanguage:string = 'Object Pascal'; | ||
| + | MyNumber:integer = 120; | ||
| + | ArrData:array[1..2,1..7] of string; | ||
| + | nc:integer = 1; | ||
| </sxh> | </sxh> | ||
| \\ | \\ | ||
| - | 5. ให้ Double Click ที่ Control ชื่อ frDesigner1 จะเกิดหน้าต่างแสดงหน้ากระดาษเปล่าขึ้นมา ซึ่งหน้ากระดาษดังกล่าว คือ Report ในโหใด Design นั่นเอง เราสามารถปรับแก้ สร้าง Template ได้โดยง่ายบนหน้าต่างนี้\\ | + | 5. ให้ click เลือก Control ชื่อ frReport1 จากนั้นกด Right-Click จะมีเมนูให้เลือก ให้กดเลือกคำว่า Design Report จากนั้นจะเกิดหน้าต่างแสดงหน้ากระดาษเปล่าขึ้นมา ซึ่งหน้ากระดาษดังกล่าว คือ Report ในโหมด Design นั่นเอง เราสามารถปรับแก้ สร้าง Template ได้โดยง่ายบนหน้าต่างนี้\\ |
| - | จากนั้นให้ทำการ Save As .. ไฟล์ ชื่อ report1.lpr\\ | + | จากนั้นให้ทำการ Save As .. ไฟล์ ชื่อ report1.lpr โดยไฟล์ดังกล่าวจะต้องอยู่ที่เดียวกันกับไฟล์ Project\\ |
| + | |||
| + | <hidden ภาพประกอบข้อ 5> | ||
| + | {{tutorial:lazreport_createreport.png}} | ||
| {{tutorial:lazreport_designerview.png}} | {{tutorial:lazreport_designerview.png}} | ||
| + | </hidden> | ||
| + | \\ | ||
| + | |||
| + | 6. พิมพ์คำสั่งเข้าไปใน Event ชื่อ FormCreate ดังนี้ | ||
| + | |||
| + | <sxh delphi;> | ||
| + | procedure TForm1.FormCreate(Sender: TObject); | ||
| + | begin | ||
| + | Button1.Caption:='Print Preview'; | ||
| + | Button2.Caption:='Edit Design Report'; | ||
| + | |||
| + | ArrData[1,1]:='TButton'; | ||
| + | ArrData[1,2]:='TStringgrid'; | ||
| + | ArrData[1,3]:='TToolBar'; | ||
| + | ArrData[1,4]:='TSaveDialog'; | ||
| + | ArrData[1,5]:='TSQLQuery'; | ||
| + | ArrData[1,6]:='TSpinEdit'; | ||
| + | ArrData[1,7]:='TfrReport'; | ||
| + | |||
| + | ArrData[2,1]:='Standard'; | ||
| + | ArrData[2,2]:='Additional'; | ||
| + | ArrData[2,3]:='Common Controls'; | ||
| + | ArrData[2,4]:='Dialogs'; | ||
| + | ArrData[2,5]:='SQLdb'; | ||
| + | ArrData[2,6]:='Misc'; | ||
| + | ArrData[2,7]:='LazReport'; | ||
| + | end; | ||
| + | </sxh> | ||
| + | \\ | ||
| + | 6.1 สองบรรทัดแรก เป็นการเปลี่ยน Caption ของ Button1, Button2 ส่วนบรรทัดที่เหลือ เป็นการใส่ข้อมูลให้กับ Array\\ | ||
| + | 6.2 สำหรับ Button1 เราจะกำหนดให้ Button1Click แล้วเรียกหน้าต่าง PrintPreview ของไฟล์ report1.lrf ขึ้นมาโดยใช้คำสั่งดังนี้ | ||
| + | |||
| + | <sxh delphi;> | ||
| + | procedure TForm1.Button1Click(Sender: TObject); | ||
| + | begin | ||
| + | frReport1.LoadFromFile('report1.lrf'); | ||
| + | frReport1.ShowReport; | ||
| + | end; | ||
| + | </sxh> | ||
| + | \\ | ||
| + | 6.3 สำหรับ Button2 เราจะกำหนดให้ Button2Click แล้วเรียกหน้าต่าง DesignReport ขึ้นมาเพื่อทำการแก้ใขไฟล์ report1.lrf โดยใช้คำสั่งดังนี้ | ||
| + | |||
| + | <sxh delphi;> | ||
| + | procedure TForm1.Button2Click(Sender: TObject); | ||
| + | begin | ||
| + | frReport1.LoadFromFile('report1.lrf'); | ||
| + | frReport1.DesignReport; | ||
| + | end; | ||
| + | </sxh> | ||
| + | \\ | ||
| + | |||
| + | 7. สำหรับการดึงข้อมูลจากโปรแกรม ไปพิมพ์ลงบน report ให้พิมพ์โค๊ดใน Event ที่ชื่อ frReport1GetValue ดังนี้ | ||
| + | |||
| + | <sxh delphi;> | ||
| + | procedure TForm1.frReport1GetValue(const ParName: String; | ||
| + | var ParValue: Variant); | ||
| + | begin | ||
| + | if ParName='Header' then | ||
| + | ParValue:=MyHeader; | ||
| + | if ParName='Name' then | ||
| + | ParValue:=MyName; | ||
| + | if ParName='Language' then | ||
| + | ParValue:=MyLanguage; | ||
| + | if ParName='Number' then | ||
| + | ParValue:=MyNumber; //No need to convert to string | ||
| + | if ParName='no' then | ||
| + | ParValue:=nc; | ||
| + | if ParName='Arr1' then | ||
| + | ParValue:=ArrData[1,nc]; | ||
| + | if ParName='Arr2' then | ||
| + | ParValue:=ArrData[2,nc]; | ||
| + | end; | ||
| + | </sxh> | ||
| + | \\ | ||
| + | 7.1 เนื่องจากเรามีข้อมูลแบบ Array ที่จำเป็นต้องมีตัวช่วยในการดึงข้อมูลแบบซ้ำๆ ให้เขียนโค๊ดลงบน Event ที่เหลือดังต่อไปนี้ | ||
| + | |||
| + | <sxh delphi;> | ||
| + | procedure TForm1.frUserDataset1CheckEOF(Sender: TObject; var Eof: Boolean); | ||
| + | begin | ||
| + | Eof:=nc>length(ArrData[2]); | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frUserDataset1First(Sender: TObject); | ||
| + | begin | ||
| + | nc:=1; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frUserDataset1Next(Sender: TObject); | ||
| + | begin | ||
| + | inc(nc); | ||
| + | end; | ||
| + | </sxh> | ||
| + | \\ | ||
| + | มาถึงตอนนี้ เราจะได้โค๊ดทั้งหมดเป็นดังนี้ | ||
| + | |||
| + | <hidden Source Code - Unit1> | ||
| + | <sxh delphi;> | ||
| + | unit Unit1; | ||
| + | |||
| + | {$mode objfpc}{$H+} | ||
| + | |||
| + | interface | ||
| + | |||
| + | uses | ||
| + | Classes, SysUtils, FileUtil, LR_Class, LR_DSet, LR_Desgn, Forms, Controls, | ||
| + | Graphics, Dialogs, StdCtrls; | ||
| + | |||
| + | type | ||
| + | |||
| + | { TForm1 } | ||
| + | |||
| + | TForm1 = class(TForm) | ||
| + | Button1: TButton; | ||
| + | Button2: TButton; | ||
| + | frDesigner1: TfrDesigner; | ||
| + | frReport1: TfrReport; | ||
| + | frUserDataset1: TfrUserDataset; | ||
| + | procedure Button1Click(Sender: TObject); | ||
| + | procedure Button2Click(Sender: TObject); | ||
| + | procedure FormCreate(Sender: TObject); | ||
| + | procedure frReport1GetValue(const ParName: String; var ParValue: Variant); | ||
| + | procedure frUserDataset1CheckEOF(Sender: TObject; var Eof: Boolean); | ||
| + | procedure frUserDataset1First(Sender: TObject); | ||
| + | procedure frUserDataset1Next(Sender: TObject); | ||
| + | private | ||
| + | |||
| + | public | ||
| + | |||
| + | end; | ||
| + | |||
| + | var | ||
| + | Form1: TForm1; | ||
| + | MyHeader:string = 'INFORMATION'; | ||
| + | MyName:string = 'Lazarus-IDE'; | ||
| + | MyLanguage:string = 'Object Pascal'; | ||
| + | MyNumber:integer = 120; | ||
| + | ArrData:array[1..2,1..7] of string; | ||
| + | nc:integer = 1; | ||
| + | |||
| + | implementation | ||
| + | |||
| + | {$R *.lfm} | ||
| + | |||
| + | { TForm1 } | ||
| + | |||
| + | procedure TForm1.FormCreate(Sender: TObject); | ||
| + | begin | ||
| + | Button1.Caption:='Print Preview'; | ||
| + | Button2.Caption:='Edit Design Report'; | ||
| + | |||
| + | ArrData[1,1]:='TButton'; | ||
| + | ArrData[1,2]:='TStringgrid'; | ||
| + | ArrData[1,3]:='TToolBar'; | ||
| + | ArrData[1,4]:='TSaveDialog'; | ||
| + | ArrData[1,5]:='TSQLQuery'; | ||
| + | ArrData[1,6]:='TSpinEdit'; | ||
| + | ArrData[1,7]:='TfrReport'; | ||
| + | |||
| + | ArrData[2,1]:='Standard'; | ||
| + | ArrData[2,2]:='Additional'; | ||
| + | ArrData[2,3]:='Common Controls'; | ||
| + | ArrData[2,4]:='Dialogs'; | ||
| + | ArrData[2,5]:='SQLdb'; | ||
| + | ArrData[2,6]:='Misc'; | ||
| + | ArrData[2,7]:='LazReport'; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.Button1Click(Sender: TObject); | ||
| + | begin | ||
| + | frReport1.LoadFromFile('report1.lrf'); | ||
| + | frReport1.ShowReport; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.Button2Click(Sender: TObject); | ||
| + | begin | ||
| + | frReport1.LoadFromFile('report1.lrf'); | ||
| + | frReport1.DesignReport; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frReport1GetValue(const ParName: String; var ParValue: Variant | ||
| + | ); | ||
| + | begin | ||
| + | if ParName='Header' then | ||
| + | ParValue:=MyHeader; | ||
| + | if ParName='Name' then | ||
| + | ParValue:=MyName; | ||
| + | if ParName='Language' then | ||
| + | ParValue:=MyLanguage; | ||
| + | if ParName='Number' then | ||
| + | ParValue:=MyNumber; //No need to convert to string | ||
| + | if ParName='no' then | ||
| + | ParValue:=nc; | ||
| + | if ParName='Arr1' then | ||
| + | ParValue:=ArrData[1,nc]; | ||
| + | if ParName='Arr2' then | ||
| + | ParValue:=ArrData[2,nc]; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frUserDataset1CheckEOF(Sender: TObject; var Eof: Boolean); | ||
| + | begin | ||
| + | Eof:=nc>length(ArrData[2]); | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frUserDataset1First(Sender: TObject); | ||
| + | begin | ||
| + | nc:=1; | ||
| + | end; | ||
| + | |||
| + | procedure TForm1.frUserDataset1Next(Sender: TObject); | ||
| + | begin | ||
| + | inc(nc); | ||
| + | end; | ||
| + | |||
| + | end. | ||
| + | </sxh> | ||
| + | </hidden> | ||
| + | \\ | ||
| + | |||
| + | 8. หลังจากตรวจทานโค๊ดทุกบรรทัดให้ถูกต้องแล้ว ให้กด Compile โปรแกรมได้ จะได้หน้าตาโปรแกรมเป็นดังนี้ | ||
| + | |||
| + | {{tutorial:lazreport_runform.png}} | ||
| + | \\ | ||
| + | |||
| + | 8.1 เนื่องจากเรายังไม่ได้ตกแต่งหน้าตา report ใน Design View ดังนั้น ให้กดปุ่ม Button2 ที่ขึ้นข้อความว่า "Edit Design Report" จากนั้นจะมีหน้าต่างแสดง Design View ของ report1.lfr ขึ้นมา ให้จัดรูปแบบ report ตามในรูปข้างล่าง | ||
| + | |||
| + | {{tutorial:lazreport_designpreview.png}} | ||
| + | \\ | ||
| + | |||
| + | <hidden ภาพรายละเอียดของ Design Report> | ||
| + | {{tutorial:lazreport_designpreviewcompleted.png}} | ||
| + | </hidden> | ||
| + | \\ | ||
| + | |||
| + | **__หมายเหตุ__** - หากเราลืมใส่ Control ที่ชื่อว่า frDesigner1 ลงบน Form ในตอนแรก จะทำให้ไม่สามารถแสดง Design View ด้วยการกดปุ่ม ฺButton2 ดังกล่าวได้ ดังนั้นจึงไม่ควรลืมใส่ frDesigner1 เด็ดขาด \\ | ||
| + | |||
| + | เมื่อแก้ใข report เสร็จแล้ว ควรกดปุ่ม save ทุกครั้ง | ||
| + | |||
| + | 8.2 หลังจากจัดการ report เสร็จเรียบร้อย สามารถเรียกดู Print Preview ได้จากการ click ปุ่ม Button1 จะมีหน้าต่าง Print Preview ขึ้นมาดังรูปข้างล่าง | ||
| + | |||
| + | {{tutorial:lazreport_previewcompleted.png}} | ||
| + | \\ | ||
| + | |||
| + | **__หมายเหตุ__** - เราสามารถสั่งพิมพ์ report ดังกล่าวได้โดย click ที่รูป Printer | ||