Saat ini, di antara alat pengembangan perangkat lunak, Delphi telah menjadi alat pengembangan cepat yang diakui secara global karena banyaknya kontrol, kemampuan pemrograman berorientasi objek yang kuat, kecepatan eksekusi kode yang cepat dan kesederhanaan serta kemudahan penggunaan, dikombinasikan dengan lingkungan pengembangan visual dan kompiler tercepat teknologi. Alat pengembangan aplikasi digunakan oleh semakin banyak pemrogram. Delphi dapat digunakan untuk menulis berbagai aplikasi Windows, khususnya pengembangan sistem manajemen informasi database, yang memiliki keunggulan unik tersendiri. Dalam proses pengembangan sistem manajemen informasi database, kita sering kali perlu mencetak banyak laporan. Menggunakan Delphi untuk merancang laporan yang rumit bukanlah hal yang sederhana seperti Visual FoxPRo. Namun, karena kontrol juga digunakan untuk mendesain laporan di Delphi, kita dapat langsung menetapkan kontrol laporan yang diperlukan selama eksekusi program untuk menghasilkan laporan secara real time, dan sampel laporan yang dihasilkan dapat ditentukan oleh kontrol program. Misalnya, ketika kita menanyakan informasi database, struktur informasi hasil umumnya tidak tetap. Jika kita ingin mencetak hasil kueri, tidak cukup hanya mendesain satu format laporan. Pemformatan laporan juga bukan solusi yang baik. Untuk mengatasi masalah tersebut, kita dapat menggunakan teknologi pembuatan laporan real-time. Tujuan artikel ini adalah untuk memperkenalkan secara detail cara menghasilkan laporan secara real time melalui sebuah contoh.
Contoh ini akan mendesain kotak dialog cetak, yang mencakup kontrol TQickRep dan beberapa kontrol gaya laporan. Tampilan formulir lainnya adalah seperti yang ditunjukkan di bawah ini:
1. Deskripsi fungsi kontrol
QuickRep:TQuickRep Ini mencakup header kolom (HB:TQRBand), detail (DB:TQRBand), footer (FB:TQRBand), pita ringkasan (SB:TQRBand), dan detail, footer, dan ringkasan tidak menyertakan TQRLabel , TQRExpr atau kontrol TDBText, yang sebagian besar dibuat saat program dijalankan. Zona header kolom menyertakan Judul (TQRLabel) untuk judul laporan; TQRLabel digunakan untuk kondisi query. Properti Caption dari kedua kontrol ini dapat diubah secara sewenang-wenang selama eksekusi program. Untuk mencegah QuickRep ditampilkan, letakkan di belakang Panel1 (Tpanel) dan perluas Panel1 ke seluruh formulir;
Query: Kontrol pernyataan TQuery SQL, program akan menghasilkan laporan berdasarkan hasil yang dikembalikan oleh Query. Oleh karena itu, saat membuat formulir ini, Anda harus menentukan pernyataan SQL untuk properti Query.SQL;
Dalam formulir di atas, kontrol yang disertakan dalam kolom "Kertas" dan "Pengaturan Halaman" adalah kontrol untuk properti QuickRep.Page. Mengubahnya saat program dijalankan akan secara langsung mengubah nilai properti yang sesuai dari kontrol QuickRep dilakukan melalui acara OnChange atau OnExit.
Judul di kolom "Pengaturan Konten Cetak" adalah judul laporan yang ditentukan (TT:TEdit). Nilainya konsisten dengan QuickRep.ReportTitle dan Title.Caption dan dapat diubah secara sewenang-wenang; apakah akan mencetak kondisi kueri. Apakah kotak centang ini dipilih secara langsung mengontrol apakah QRSQL.Caption kosong; "Penyelarasan kolom tabel" terdiri dari serangkaian tombol opsi mengubah variabel kontrol RD1 Nilai (Byte) (0 perataan otomatis, 1 perataan tengah, 2 perataan kiri); "Lebar pencetakan kolom tabel" terdiri dari sekumpulan tombol opsi, terutama digunakan untuk lebar nilai kolom saat membuat format laporan, dan perubahannya variabel kontrol Nilai RD2 (Byte) (0 lebar otomatis, 1 Lebar Sama, 2 Batas Lebar Maksimum), bila Anda memilih 1 Lebar Sama, 2 Batas Lebar Maksimum, Anda harus memasukkan lebar dalam piksel; "Metode Statistik" menunjukkan apakah laporan menyertakan footer (FB: TQRBAND) dan jumlah ( SB: TQRBAND ) zona.
2. Deskripsi program
Program ini mendefinisikan tipe berikut:
TQRLabelName=array dari TQRLabel;
TQRDBTextName=array dari TQRDBText;
TQRShapeName=array dari TQRShape;
TQRExpName=array TQRExpr;
Tipe di atas adalah tipe array dinamis, dan setiap elemen datanya adalah kelas. Saat membuat kontrol laporan secara real time, jumlah kontrol yang akan dibuat tidak pasti dan nama kontrol tidak dapat ditentukan. Menggunakan array dinamis adalah solusi yang lebih baik, yaitu Anda dapat menentukan dimensi data secara sewenang-wenang tanpa harus mengelola memori alokasi sendiri. Masalah ini juga memfasilitasi pelepasan dan pemrosesan kontrol yang terkandung dalam laporan. Program ini juga mendeklarasikan variabel tipe di atas sebagai berikut:
Nama CHB: Nama Label TQRL;
Nama DB:TQRDBNamaTeks;
Bentuk CHBS, Bentuk DB, Bentuk FBS, Bentuk Jumlah: Nama Bentuk TQRS;
NamaFB,NamaJumlah:TQRExpName;
Variabel array ini akan mengalokasikan memori berdasarkan hasil bidang yang dikembalikan oleh Query ketika formulir dibuat.
Proses eksekusi program: Ketika formulir dibuat dan ditampilkan, operasi inisialisasi dilakukan untuk formulir ini. Tampilkan nilai yang sesuai dari properti QuickRep.Page di acara OnCreate, lakukan operasi Query.Open di acara OnShow, dan alokasikan ruang variabel array kontrol sesuai dengan hasil yang dikembalikan. Setelah formulir dibuat, klik tombol "Hasilkan" untuk menghasilkan laporan (abaikan bidang memo dan bidang foto), lalu klik "Cetak" dan "Pratinjau" untuk mencetak atau melihat pratinjau laporan. Jika pengaturan diubah setelah laporan dibuat, laporan harus dibuat ulang. Jika terdapat terlalu banyak bidang kumpulan hasil yang dikembalikan oleh Kueri, ukuran kertas mungkin tidak cukup untuk menghasilkan semua laporan saat membuat laporan. Anda dapat menyesuaikan ukuran kertas laporan dan kemudian membuat laporan. Saat formulir ditutup, kontrol yang dibuat dilepaskan.
3. Daftar sumber program dan komentar
satuan CetakDlg;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog,
StdCtrls, Tombol, ExtCtrls, Putar, QuickRpt, QRPrntr, printer, Qrctrls,
Db,DBTables,ComCtrls,SysIni;
jenis
TQRLabelName=array dari TQRLabel;//Array dinamis dari bagian kontrol judul kolom di strip header kolom
TQRDBTextName=array dari TQRDBText; //Array dinamis dari kontrol judul kolom di pita detail
TQRShapeName=array dari TQRShape; //Array dinamis dari bagian kontrol garis
TQRExpName=array dari TQRExpr; //Array dinamis kelas kontrol statistik
TPrintForm = kelas(TForm)
Kotak Grup1: Kotak Grup T;
Label5: Label;
BtnSet: TbitBtn;//kontrol tombol "Pengaturan".
BtnCancel: TBitBtn; // Kontrol tombol "Tutup".
Panel1: TPanel;
BtnPrint: TBitBtn; // kontrol tombol "Cetak".
BtnPrview: TBitBtn; // tombol "Pratinjau".
QuickRep: TQuickRep; // Kontrol laporan cepat
HB: TQRBand; // Kontrol pita "header kolom".
Judul: TQRLabel;//Kontrol judul laporan
QRE1: TQRExpr;//Kontrol "Nomor halaman" di pita header kolom
QRE2: TQRExpr;//Kontrol "Tanggal" di pita header kolom
Panel2: TPanel;
Label1: Label;
R1: TRadioButton;//kontrol "Cetak Potret".
R2: TRadioButton;//kontrol "pencetakan horizontal".
GroupBox4: TGroupBox;
TT: TEdit; // Kontrol kotak masukan judul
Label2: TLabel;
SR: TCheckBox; // Kontrol "Kondisi permintaan cetak".
Label3: Label;
Gambar1: TImage;//Menampilkan gambar pencetakan vertikal
Gambar2: TImage;//Menampilkan gambar pencetakan horizontal
QRSQL: TQRLabel; // Digunakan untuk menampilkan kontrol "Kondisi Kueri" di pita header kolom
GroupBox2: TGroupBox;
Label7: Label;
Label8: Label;
Label9: Label;
Label10: Label;
Label11: Label;
Label12: Label;
Label13: Label;
PageSpace: TEdit; // Kontrol kotak masukan spasi kolom
PageTop: TEdit; // Kontrol kotak masukan pada margin halaman
PageBottom: TEdit; //Kontrol kotak masukan di bawah margin halaman
PageLeft: TEdit; // Kontrol kotak input margin kiri
PageRight: TEdit; // Kontrol kotak input margin kanan
PageDlux: TCheckBox; // Kontrol "Pencetakan dua sisi".
PageCol: TEdit; // Kontrol kotak masukan kolom
Halaman: TEdit; // Cetak kontrol kotak masukan nomor
PaperH: TEdit; // Kontrol kotak masukan panjang kertas
PaperW: TEdit;//Kontrol kotak masukan lebar kertas
Label4: Label;
Label6: Label;
Ps: TComboBox;//Kontrol kotak daftar model kertas
Kueri: TQuery;//Kontrol kueri SQL
DB: TQRBand; // Kontrol pita "Detail".
CrtRep: TBitBtn; // kontrol tombol "Hasilkan".
Label14: Label;
Label15: Label;
Panel3: TPanel;
Wdauto: TRadioButton; // Kontrol "Lebar Otomatis".
Wdall: TRadioButton; // Kontrol "Lebar yang sama".
Wdmax: TRadioButton; // Kontrol "Batasi lebar".
Label16: Label;
ColWd: TEdit; // Kontrol kotak masukan lebar kolom
Panel4: TPanel;
DJAUTO: TRadioButton; // Kontrol "Penyelarasan otomatis".
DJCENTER: TRadioButton; // Kontrol "Pusat".
DJLEFT: TRadioButton; // Kontrol "Sejajarkan kiri".
FB: TQRBand; // Kontrol pita footer
Label17: Label;
Panel5: TPanel;
TJ1: TCheckBox; // Kontrol "Statistik per halaman".
TJ2: TCheckBox; // Kontrol "Jumlah statistik".
SB: TQRBand; // Kontrol jumlah pita
prosedur FormCreate(Pengirim: TObject);
prosedur RadioButtonClick(Pengirim: TObject);
prosedur PageDluxClick(Pengirim: TObject);
prosedur PageColChange(Pengirim: TObject);
prosedur PageSpaceExit(Pengirim: TObject);
prosedur PagesChange(Pengirim: TObject);
prosedur PageTopExit(Pengirim: TObject);
prosedur PageBottomExit(Pengirim: TObject);
prosedur PageLeftExit(Pengirim: TObject);
prosedur PageRightExit(Pengirim: TObject);
prosedur TTExit(Pengirim: TObject);
prosedur DTClick(Pengirim: TObject);
procedure BtnPrviewClick(Pengirim: TObject);
prosedur BtnSetClick(Pengirim: TObject);
prosedur PsChange(Pengirim: TObject);
prosedur PaperChange(Pengirim: TObject);
procedure FormClose(Pengirim: TObject; var Action: TCloseAction);
prosedur FormDestroy(Pengirim: TObject);
prosedur CreateReport(Pengirim: TObject);
prosedur SRCklik(Pengirim: TObject);
prosedur ClearRep();
prosedur FormShow(Pengirim: TObject);
prosedur PaperSizeChg(Pengirim: TObject);
prosedur DJChage(Pengirim: TObject);
prosedur WdChage(Pengirim: TObject);
prosedur QuickRepStartPage(Pengirim: TCustomQuickRep);
prosedur BtnPrintClick(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
CHBName:TQRLabelName;//Tentukan nama kontrol strip header kolom nama array dinamis
DBName:TQRDBTextName; //Tentukan nama array dinamis dari nama kontrol pita detail
CHBShape,DBShape,FBShape,SumShape:TQRShapeName; //Tentukan nama array dinamis dari kontrol garis
FBName,SumName:TQRExpName; //Tentukan nama array dinamis dari nama kontrol footer (FBNAME) dan band penjumlahan (SUMNAME).
DJ:TAlignment;//Penjajaran kolom (taLeftJustify, taRightJustify, taCenter)
Rd1, Rd2:Byte; //Digunakan untuk menyimpan nama variabel status perataan kolom tabel (RD1) dan lebar pencetakan (RD2).
publik
{Pernyataan publik}
CXTJ,BT:String;//CXTJ menyimpan kondisi kueri, BT menyimpan judul laporan
//Ditentukan oleh formulir tingkat atas
akhir;
konstanta
Ukuran Kertas:array[0..26] dari TQRPaperSize=(A3, A4, A4Small, A5, B4, B5, Letter,
SuratKecil, Tabloid, Buku Besar, Hukum, Pernyataan, Eksekutif, Folio,
Kuarto, qr10X14, qr11X17, Catatan, Env9, Env10, Env11, Env12,
Env14, CSheet, DSheet, ESheet, Kustom);
//Jenis kertas dicantumkan oleh QuickRep
var
Formulir Cetak: TPrintForm;
pelaksanaan
{$R *.DFM}
procedure TPrintForm.FormCreate(Pengirim: TObject);
//Menampilkan properti QuickRep.Page dan nilai properti lainnya
var
Saya: Byte;
mulai
PageCol.Teks:=IntToStr(QuickRep.Page.Columns);
PageSpace.Teks:=FormatFloat('0.00',QuickRep.Page.ColumnSpace);
PageTop.Text:=FormatFloat('0.00',QuickRep.Page.TopMargin);
PageBottom.Teks:=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.Diperiksa:=QuickRep.Page.Orientation=poPortrait;
Gambar1.Terlihat:=R1.Diperiksa;
R2.Diperiksa:=QuickRep.Page.Orientation=poLandscape;
Gambar2.Terlihat:=R2.Diperiksa;
PageDlux.Checked:=QuickRep.PrinterSettings.Duplex;
Halaman.Teks:=IntToStr(QuickRep.PrinterSettings.Copies);
PaperH.Text:=FormatFloat('0,00',QuickRep.Page.Length);
PaperW.Text:=FormatFloat('0.00',QuickRep.Page.Width);
Untuk I:=0 hingga 26 do //kotak daftar PS menampilkan jenis kertas
jika QuickRep.Page.PaperSize=PaperSize[I] maka mulailah
PS.ItemIndex:=I;
Merusak;
akhir;
//Tentukan apakah lebar kertas dapat diubah. Ini hanya dapat diubah jika jenis kertas disesuaikan (Ps.ItemIndex=26)
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
akhir;
prosedur TPrintForm.RadioButtonClick(Pengirim: TObject);
//Penanganan event perubahan orientasi kertas
var
S: Tali;
mulai
Gambar1.Terlihat:=R1.Diperiksa;
Gambar2.Terlihat:=R2.Diperiksa;
jika R1.Diperiksa kemudian
QuickRep.Page.Orientation:=poPortrait
kalau tidak
QuickRep.Page.Orientation:=poLandscape;
//Tukar nilai lebar dan panjang kertas
S:=KertasH.Teks;
PaperH.Teks:=KertasW.Teks;
KertasW.Teks:=S;
jika (Ps.ItemIndex=26) atau (Ps.ItemIndex=0) maka mulailah
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
akhir;
akhir;
prosedur TPrintForm.PageDluxClick(Pengirim: TObject);
mulai
QuickRep.PrinterSettings.Duplex:=PageDlux.Diperiksa;
akhir;
prosedur TPrintForm.PageColChange(Pengirim: TObject);
mulai
jika StrToInt(PageCol.Text)<1 maka PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
akhir;
procedure TPrintForm.PageSpaceExit(Pengirim: TObject);
mulai
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Teks);
akhir;
procedure TPrintForm.PagesChange(Pengirim: TObject);
mulai
jika StrToInt(Pages.Text)<1 maka Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
akhir;
prosedur TPrintForm.PageTopExit(Pengirim: TObject);
mulai
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Teks);
akhir;
procedure TPrintForm.PageBottomExit(Pengirim: TObject);
mulai
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
akhir;
procedure TPrintForm.PageLeftExit(Pengirim: TObject);
mulai
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
akhir;
prosedur TPrintForm.PageRightExit(Pengirim: TObject);
mulai
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
akhir;
procedure TPrintForm.TTExit(Pengirim: TObject);//Penanganan event perubahan judul
mulai
QuickRep.ReportTitle:=TT.Teks;
Judul.Caption:=TT.Teks;
Bt:=TT.Teks;
akhir;
prosedur TPrintForm.DTClick(Pengirim: TObject);//Peristiwa kotak centang kondisi permintaan cetak
mulai
QRSQL.Diaktifkan:=SR.Diperiksa;
akhir;
procedure TPrintForm.BtnPrviewClick(Sender: TObject); //Pratinjau acara klik tombol
mulai
QuickRep.Pratinjau;
akhir;
procedure TPrintForm.BtnSetClick(Sender: TObject); //Atur acara klik tombol
mulai
QuickRep.PrinterSetup;
akhir;
procedure TPrintForm.PsChange(Pengirim: TObject);//Peristiwa perubahan jenis kertas
mulai
QuickREp.Page.PaperSize:=Ukuran Kertas[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:=Benar;
BtnPrint.Enabled:=bukan CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
akhir;
procedure TPrintForm.PaperChange(Sender: TObject);//Peristiwa perubahan lebar dan panjang kertas
mulai
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
akhir;
procedure TPrintForm.FormClose(Pengirim: TObject; var Action: TCloseAction);
mulai
Tindakan:=caFree;
akhir;
procedure TPrintForm.FormDestroy(Pengirim: TObject);
mulai
HapusRep;
Bentuk Cetak:=nihil;
akhir;
prosedur TPrintForm.CreateReport(Pengirim: TObject);//Buat acara klik tombol
Var
Saya,L:Bita;
CHBtp,CHBlf,Cd,Lebar Panjang:Kata;
mulai
Layar.Kursor:=crHourGlass;
Title.Caption:=Bt;//Tetapkan judul
ClearRep(); //Hapus objek yang dibuat;
jika Sr.Diperiksa maka QrSQL.Caption:=CXTJ else QRSQL.Caption:=';//Apakah akan mencetak kondisi kueri?
CHBtp:=HB.Height-17;//Posisi teratas dari kontrol yang dibuat dalam pita
CHBlf:=0; //Kontrol yang dibuat berada di posisi kiri dalam pita
ObWidth:=0; //Lebar kontrol yang dibuat
for I := 0 to Query.FieldCount-1 do //Buat kontrol berdasarkan jumlah field yang dikembalikan oleh Query
mulai
jika (Query.Fields[I].DataType<>ftBlob) Dan (Query.Fields[I].DataType<>ftMemo) maka
mulai //Abaikan kolom catatan dan kolom foto
L:=Query.Fields[I].DataSize-1;//L=lebar bidang (byte)-1
case Rd1 of //Mengatur perataan kontrol sesuai dengan perataan yang dipilih
0: jika L<=10 maka Dj:=taCenter else DJ:=taLeftJustify;
//Penyelarasan otomatis: Bidang yang kurang dari atau sama dengan 10 disejajarkan di tengah, jika tidak disejajarkan ke kiri
1: Dj:=taCenter;//penjajaran tengah
2: DJ:=taLeftJustify;//Perataan kiri
akhir;
case Rd2 of //Mengatur lebar kolom laporan sesuai dengan lebar daftar yang dipilih
0: mulai
//Lebar otomatis: jika L>14 maka lebar ObWidth=14+(L-14)/2; jika ObWidth
//Lebar tidak dapat menampilkan judul kolom, maka ObWidth=lebar judul kolom jika tipe kolom
//Untuk tipe tanggal, tipe mata uang dan tipe angka floating point, ObWidth=65
jika L>14 maka L:=14+(L-14) div 2;
Lebar Panjang:=L*6;
L:=Panjang(Query.Fields[I].DisplayName);
jika ObWidth<L*6 maka ObWidth:=L*6;
Lebar Ob:=Lebar Obb+2;
jika (Query.Fields[I].DataType=ftDateTime) atau
(Query.Fields[I].DataType=ftFloat) atau
(Query.Fields[I].DataType=ftCurrency) lalu ObWidth:=65;
akhir;
1: jika ColWd.Text<>' maka ObWidth:=StrToInt(ColWd.Text)
else ObWidth:=100;//Lebar sama:ObWidth=nilai lebar masukan
2: mulai //Batasi lebar maksimum: pertama hitung lebar otomatis lalu tentukan apakah lebarnya melebihi nilai maksimum.
//Jika melebihi ObWidth=nilai input lebar maksimum
jika ColWd.Text<>' maka Cd:=StrToInt(ColWd.Text)
lain Cd:=200;
Lebar Panjang:=L*6;
jika ObWidth>Cd maka ObWidth:=Cd;
Lebar Ob:=Lebar Obb+2;
jika (Query.Fields[I].DataType=ftDateTime) atau
(Query.Fields[I].DataType=ftFloat) atau
(Query.Fields[I].DataType=ftCurrency) lalu ObWidth:=65;
akhir;
akhir;
jika CHBlf+ObWidth>=HB.Width lalu mulai //Buat kontrol>lebar kertas?
DlgMes:='Lebar kertas tidak cukup, harap ubah ukuran kertas. ';
Kotak Pesan(Menangani,DlgMes,Cap_Inf,Ico_Inf);
merusak;
akhir
yang lain dimulai
CHBShape[I]:=TQRShape.Create(HB);//Buat kontrol garis strip header kolom
CHBShape[I].Induk:=HB;
CHBShape[I].Atas:=CHBtp;
CHBShape[I].Kiri:=CHBlf;
CHBSape[I].Lebar:=Lebar Ob+1;
CHBBentuk[I].Tinggi:=17;
CHBNAME[I]:=TQRLabel.Create(HB); //Buat kontrol judul kolom
CHBNAME[I].Induk:=HB;
CHBNAME[I].Atas:=CHBtp+2;
CHBNAME[I].Kiri:=CHBlf+1;
CHBNAME[I].UkuranOtomatis:=Salah;
CHBNAME[I].Lebar:=Lebar Ob-1;
CHBNAME[I].Penjajaran:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//Dapatkan bidang sebagai nama kolom
CHBNAME[I].Bawa Ke Depan;
DBShape[I]:=TQRShape.Create(DB); //Membuat kontrol garis strip detail
DBShape[I].Induk:=DB;
DBShape[I].Atas:=-1;
DBShape[I].Kiri:=CHBlf;
DBShape[I].Lebar:=Lebar Obb+1;
Bentuk DB[I].Tinggi:=17;
DBNAME[I]:=TQRDBText.Create(DB); //Buat kontrol pita detail
DBNAME[I].Induk:=DB;
DBNAME[I].ParentReport:=QuickRep;
DBNAME[I].Atas:=2;
DBNAME[I].Kiri:=CHBlf+2;
DBNAME[I].UkuranOtomatis:=Salah;
DBNAME[I].Lebar:=Lebar Ob-3;
DBNAME[I].Tinggi:=13;
DBNAME[I].Penjajaran:=Dj;
DBNAME[I].DataSet:=Permintaan;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].Bawa Ke Depan;
jika Tj1.Dicentang maka mulai //Apakah Anda ingin membuat pita footer?
FBShape[I]:=TQRShape.Create(FB); //Membuat kontrol garis pita footer
FBShape[I].Induk:=FB;
FBShape[I].Atas:=0;
FBShape[I].Kiri:=CHBlf;
FBSape[I].Lebar:=Lebar Ob+1;
FBShape[I].Tinggi:=17;
jika (Query.Fields[I].DataType=ftFloat) atau
(Query.Fields[I].DataType=ftCurrency) atau (I<2) lalu
mulai //Jika tipe kolom adalah tipe numerik, buatlah
FBNAME[I]:=TQRExpr.Create(FB); //Buat kontrol pita footer
FBNAME[I].Induk:=FB;
FBNAME[I].ParentReport:=QuickRep;
FBNAME[I].Atas:=3;
FBNAME[I].Kiri:=CHBlf+2;
FBNAME[I].UkuranOtomatis:=Salah;
FBNAME[I].Lebar:=Lebar Ob-3;
FBNAME[I].Tinggi:=13;
FBNAME[I].Penjajaran:=taCenter;
FBNAME[I].Ekspresi:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].Bawa Ke Depan;
akhir;
akhir;
jika Tj2.Dicentang maka mulai //Haruskah kita membuat band penjumlahan?
SumShape[I]:=TQRShape.Create(SB); //Membuat kontrol garis sum strip
SumShape[I].Induk:=SB;
JumlahBentuk[I].Atas:=0;
SumShape[I].Kiri:=CHBlf;
SumShape[I].Lebar:=Lebar Obb+1;
JumlahBentuk[I].Tinggi:=17;
jika (Query.Fields[I].DataType=ftFloat) atau
(Query.Fields[I].DataType=ftCurrency) atau (I<2) lalu
mulai //Jika tipe kolom adalah tipe numerik, buatlah
SumNAME[I]:=TQRExpr.Create(SB); //Buat kontrol jumlah band
SumNAME[I].Induk:=SB;
SumNAME[I].ParentReport:=QuickRep;
JumlahNAMA[I].Atas:=3;
SumNAME[I].Kiri:=CHBlf+2;
SumNAME[I].UkuranOtomatis:=Salah;
SumNAME[I].Lebar:=Lebar Ob-3;
SumNAME[I].Tinggi:=13;
SumNAME[I].Penjajaran:=taCenter;
SumNAME[I].Ekspresi:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].Bawa Ke Depan;
akhir;
akhir;
CHBlf:=CHBlf+ObWidth;//Pemrosesan bidang saat ini selesai, lebar satu bidang ke kanan
akhir;
akhir;
akhir;
CrtRep.Enabled:=False;//Nonaktifkan tombol pembangkitan
BtnPrint.Enabled:=bukan CrtRep.Enabled;Izinkan pencetakan tombol amonium
BtnPrview.Enabled:=BtnPrint.Enabled;Izinkan tombol pratinjau
jika Tj1.Dicentang maka mulai //Jika pita footer dibuat, ubah dua kolom pertama di pita footer
FBNAME[0].Ekspresi:=''Jumlah halaman'';
FBNAME[1].Ekspresi:='COUNT+'baris'';
akhir;
jika Tj1.Dicentang maka mulai //Jika pita penjumlahan ditetapkan, ubah dua kolom pertama dalam pita penjumlahan
SumNAME[0].Ekspresi:=''Total'';
SumNAME[1].Ekspresi:='COUNT+'baris'';
akhir;
//Menyesuaikan posisi pencetakan tanggal dan nomor halaman pada zona header kolom
QRE2.Kiri:=HB.Lebar-Qre2.Lebar;
QRSQL.Kiri:=QRE1.Lebar+10;
QRSQL.Lebar:= QRE2.Kiri-10-QRSQL.Kiri;
QuickRep.DataSet:=Query; //Tentukan kumpulan data untuk QuickRep, kalimat ini tidak boleh hilang
Layar.Kursor:=crDefault;
akhir;
procedure TPrintForm.ClearRep();//Hapus kontrol yang dibuat saat membuat format laporan
Var
Saya: Byte;
mulai
Untuk I:=0 hingga Query.FieldCount-1 dimulai
jika Ditugaskan(CHBSape[I]) lalu mulai CHBSape[I].Gratis;CHBSape[I]:=nil;end;
jika Ditugaskan(CHBNAME[I]) lalu mulai CHBNAME[I].Free;CHBNAME[I]:=nil;end;
jika Ditugaskan(DBShape[I]) lalu mulai DBShape[I].Free;DBShape[I]:=nil;end;
jika Ditugaskan(DBNAME[I]) maka mulai DBNAME[I].Free;DBNAME[I]:=nil;end;
jika Ditugaskan(FBSape[I]) lalu mulai FBSape[I].Gratis;FBSape[I]:=nil;end;
jika Ditugaskan(FBNAME[I]) lalu mulai FBNAME[I].Free;FBNAME[I]:=nil;end;
jika Ditugaskan(SumShape[I]) lalu mulai SumShape[I].Free;SumShape[I]:=nil;end;
jika Ditugaskan(SumNAME[I]) lalu mulai SumNAME[I].Free;SumNAME[I]:=nil;end;
akhir;
akhir;
prosedur TPrintForm.SRClick(Pengirim: TObject);
mulai
jika Sr.Dicentang maka QrSQL.Caption:=CXTJ else QRSQL.Caption:=';
akhir;
procedure TPrintForm.FormShow(Pengirim: TObject); //Acara tampilan formulir
mulai
Kueri.Aktif:=Benar;//Cetak SQL
TT.Teks:=Bt;
QuickRep.ReportTitle:=Bt;//Tetapkan judul
//Array nama kontrol mengalokasikan ruang
SetLength(CHBNAME,Query.FieldCount);
SetLength(CHBSape,Query.FieldCount);
SetLength(DBNAME,Query.FieldCount);
SetLength(DBShape,Query.FieldCount);
SetLength(FBNAME,Query.FieldCount);
SetLength(FBShape,Query.FieldCount);
SetLength(SumNAME,Query.FieldCount);
SetLength(JumlahBentuk,Query.FieldCount);
akhir;
procedure TPrintForm.PaperSizeChg(Pengirim: TObject);
mulai
CrtRep.Enabled:=Benar;
BtnPrint.Enabled:=bukan CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
akhir;
procedure TPrintForm.DJChage(Pengirim: TObject);//Penanganan event perubahan keselarasan
var
Chg: Byte;
mulai
jika Djauto.Dicentang maka Chg:=0
lain jika DjCenter.Diperiksa maka Chg:=1
lain Chg:=2;
jika Chg<>Rd1 maka mulai PaperSizeChg(nil);Rd1:=Chg;end;
akhir;
prosedur TPrintForm.WdChage(Pengirim: TObject);//Penanganan kejadian perubahan lebar
var
Chg: Byte;
mulai
jika Wdauto.Dicentang maka Chg:=0
lain jika Wdall.Checked kemudian mulai
Chg:=1;
jika ColWd.Teks=' maka ColWd.Teks:='100';
akhir
yang lain dimulai
Chg:=2;
jika ColWd.Teks=' maka ColWd.Teks:='200';
akhir;
jika Chg<>Rd2 maka mulai PaperSizeChg(nil);Rd2:=Chg;end;
ColWd.Diaktifkan:=Chg<>0;
akhir;
prosedur TPrintForm.QuickRepStartPage(Pengirim: TCustomQuickRep);
//Pencetakan laporan memulai pemrosesan peristiwa halaman baru, dan nilai statistik di pita footer dihapus.
Var
Saya: Byte;
mulai
jika Tj1.Diperiksa kemudian
Untuk I:=0 hingga Query.FieldCount-1 lakukan
jika Ditugaskan(FBNAME[I]) maka FBNAME[I].Reset;
akhir;
prosedur TPrintForm.BtnPrintClick(Pengirim: TObject);
mulai
QuickRep.Cetak;
akhir;
akhir.
4. Contoh kotak dialog pemanggilan:
Pertama, sertakan unit PrintDlg dalam pernyataan USES dalam formulir yang akan dipanggil, lalu panggil dengan kode berikut:
jika tidak ditugaskan(PrintForm) maka PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
//Jika formulir pemanggilan tidak berisi kontrol Query, Anda bisa langsung mengatur nilai pernyataan SQL
PrintForm.Bt:=Judul laporan;
PrintForm.Caption:=Judul formulir;
PrintForm.CXTJ:=kondisi permintaan;
PrintForm.ShowModal;
5. Kesimpulan
Kunci dari program ini adalah proses event CreateReport dan pemrosesan nama kontrol dinamis. Karena keterbatasan ruang, beberapa konten tidak dijelaskan dan saya harap pembaca dapat memahaminya sendiri. Untuk pembuatan laporan secara umum, program ini dapat memenuhi persyaratan.
Saya memiliki versi terbaru yang fungsinya lebih kuat. Teman-teman yang membutuhkan bisa mengirimi saya email dan pasti akan saya kirimkan.