حاليًا، من بين أدوات تطوير البرمجيات، أصبحت دلفي أداة تطوير سريعة معترف بها عالميًا نظرًا لعناصر التحكم العديدة الخاصة بها، ووظائف البرمجة القوية الموجهة للكائنات، وسرعة تنفيذ التعليمات البرمجية السريعة والبساطة وسهولة الاستخدام، جنبًا إلى جنب مع بيئة التطوير المرئية وأسرع مترجم. يتم استخدام أدوات تطوير التطبيقات من قبل المزيد والمزيد من المبرمجين. يمكنك استخدام دلفي لكتابة تطبيقات ويندوز المختلفة، وخاصة تطوير أنظمة إدارة معلومات قواعد البيانات، والتي لها مميزاتها الفريدة. في عملية تطوير نظام إدارة معلومات قاعدة البيانات، غالبًا ما نحتاج إلى طباعة العديد من التقارير. يعد استخدام دلفي لتصميم تقارير معقدة أمرًا مرهقًا، وهو ليس بهذه البساطة مثل Visual FoxPRo. ومع ذلك، بما أن عناصر التحكم تستخدم أيضًا لتصميم التقارير في دلفي، فيمكننا إنشاء عناصر تحكم التقرير المطلوبة مباشرة أثناء تنفيذ البرنامج لإنشاء تقارير في الوقت الفعلي، ويمكن تحديد عينة التقرير التي تم إنشاؤها من خلال التحكم في البرنامج. على سبيل المثال، عندما نقوم بالاستعلام عن معلومات قاعدة البيانات، لا يتم إصلاح بنية معلومات النتيجة بشكل عام. إذا أردنا طباعة نتائج الاستعلام، فلا يكفي تصميم تنسيق تقرير واحد فقط، بل يجب علينا تصميم تنسيق واحد لجميع معلومات النتائج المحتملة تنسيق التقرير ليس حلاً جيدًا أيضًا. من أجل حل مثل هذه المشكلة، يمكننا استخدام تقنية إنشاء التقارير في الوقت الحقيقي. الغرض من هذه المقالة هو تقديم كيفية إنشاء التقارير في الوقت الفعلي بالتفصيل من خلال مثال.
سيقوم هذا المثال بتصميم مربع حوار طباعة، والذي يتضمن عنصر التحكم TQickRep وبعض عناصر التحكم في نمط التقرير، ويكون مظهر النماذج الأخرى كما هو موضح أدناه:
1. وصف وظيفة التحكم
QuickRep:TQuickRep يتضمن رأس العمود (HB:TQRBand)، والتفاصيل (DB:TQRBand)، والتذييل (FB:TQRBand)، ونطاقات الملخص (SB:TQRBand)، ولا يتضمن TQRLabel في التفاصيل أو التذييل أو الملخص، عنصر تحكم TQRExpr أو TDBText، والذي يتم إنشاؤه بشكل أساسي عند تنفيذ البرنامج. تتضمن منطقة رأس العمود عنوان (TQRLabel) لعنوان QRSQL: يتم استخدام TQRLabel لشروط الاستعلام، ويمكن تغيير خصائص التسمية التوضيحية لعنصري التحكم هذين بشكل تعسفي أثناء تنفيذ البرنامج. لمنع عرض QuickRep، ضعه خلف Panel1 (Tpanel) وقم بتوسيع Panel1 إلى النموذج بأكمله؛
الاستعلام: التحكم في عبارة TQuery SQL، سيقوم البرنامج بإنشاء تقارير بناءً على النتائج التي يتم إرجاعها بواسطة الاستعلام. ولذلك، عند إنشاء هذا النموذج، يجب عليك تحديد عبارة SQL للخاصية Query.SQL؛
في النموذج أعلاه، تتحكم عناصر التحكم المضمنة في أعمدة "الورق" و"إعداد الصفحة" في خصائص QuickRep.Page. سيؤدي تغييرها عند تنفيذ البرنامج إلى تغيير قيم الخصائص المقابلة لعنصر التحكم QuickRep مباشرةً يمكن إجراؤه من خلال حدث OnChange أو OnExit المكتمل؛
العنوان الموجود في العمود "إعدادات محتوى الطباعة" هو عنوان التقرير المحدد (TT:TEdit)، وتتوافق قيمته مع QuickReportTitle وTitle.Caption ويمكن تغييره بشكل عشوائي؛ كما تحدد خانة الاختيار "شروط استعلام الطباعة". ما إذا كان سيتم طباعة شروط الاستعلام أم لا. ما إذا كان تحديد مربع الاختيار هذا يتحكم مباشرة في ما إذا كان QRSQL.Caption فارغًا؛ يتكون "محاذاة عمود الجدول" من مجموعة من أزرار الخيارات، ويتم استخدامه بشكل أساسي لمحاذاة المحتوى التفصيلي عند إنشاء التقارير متغير التحكم في التغيير RD1 قيمة (بايت) (0 محاذاة تلقائية، 1 محاذاة للوسط، 2 محاذاة لليسار)؛ يتكون "عرض طباعة عمود الجدول" من مجموعة من أزرار الخيارات، المستخدمة بشكل أساسي لعرض قيم الأعمدة عند إنشاء تنسيقات التقارير، وتغييرها متغيرات التحكم قيمة RD2 (بايت) (0 العرض التلقائي، 1 نفس العرض، 2 الحد الأقصى للعرض)، عند تحديد 1 نفس العرض، 2 الحد الأقصى للعرض، يُطلب منك إدخال العرض بالبكسل؛ تشير "الطريقة الإحصائية" إلى ما إذا كان التقرير يتضمن تذييلًا (FB: TQRBAND) ومجموع (SB : TQRBAND ) المنطقة.
2. وصف البرنامج
يحدد البرنامج الأنواع التالية:
TQRLabelName=صفيف TQRLabel;
TQRDBTextName=صفيف TQRDBText;
TQRShapeName=صفيف TQRShape;
TQREExpName=صفيف TQRExpr;
النوع أعلاه هو نوع صفيف ديناميكي، وكل عنصر من عناصر البيانات عبارة عن فئة. عند إنشاء عناصر تحكم في التقارير في الوقت الفعلي، يكون عدد عناصر التحكم التي سيتم إنشاؤها غير مؤكد ولا يمكن تحديد أسماء عناصر التحكم. يعد استخدام المصفوفات الديناميكية حلاً أفضل، أي أنه يمكنك تحديد أبعاد البيانات بشكل تعسفي دون الحاجة إلى إدارة الذاكرة تخصيص نفسك تسهل هذه المشكلة أيضًا إصدار ومعالجة عناصر التحكم الموجودة في التقارير. كما يعلن البرنامج عن المتغيرات من الأنواع المذكورة أعلاه على النحو التالي:
CHBName:TQRLabelName;
DBName:TQRDBTextName;
CHBShape,DBShape,FBShape,SumShape:TQRShapeName;
FBName,SumName:TQRExpName;
ستقوم متغيرات الصفيف هذه بتخصيص الذاكرة بناءً على نتائج الحقول التي يتم إرجاعها بواسطة الاستعلام عند إنشاء النموذج، ويتوافق كل حقل مع عنصر من عناصر الصفيف.
عملية تنفيذ البرنامج: عند إنشاء النموذج وعرضه، يتم إنشاء عملية التهيئة لهذا النموذج. عرض القيمة المطابقة لخاصية QuickRep.Page في الحدث OnCreate، وتنفيذ عملية Query.Open في الحدث OnShow، وتخصيص مساحة متغير صفيف التحكم وفقًا لنتيجة الإرجاع. بعد إنشاء النموذج، انقر فوق الزر "إنشاء" لإنشاء التقرير (تجاهل حقل المذكرة وحقل الصورة)، ثم انقر فوق "طباعة" و"معاينة" لطباعة التقرير أو معاينته. عند تغيير الإعدادات بعد إنشاء التقرير، يجب إعادة إنشاء التقرير. إذا كانت مجموعة النتائج التي تم إرجاعها بواسطة الاستعلام تحتوي على عدد كبير جدًا من الحقول، فقد لا يكون حجم الورق كافيًا لإنشاء كافة التقارير عند إنشاء التقرير. يمكنك ضبط حجم ورق التقرير ثم إنشاء التقرير. عند إغلاق النموذج، يتم تحرير عناصر التحكم التي تم إنشاؤها.
3. قائمة البرامج المصدرية والتعليقات
وحدة PrintDlg؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار،
ستدكترلس، أزرار، إكستكرلز، سبين، كويكربت، كيوربرنتر، الطابعات، Qrctrls،
ديسيبل،DBTables،ComCtrls،سيسيني؛
يكتب
TQRLabelName=صفيف TQRLabel;// مصفوفة ديناميكية لفئات التحكم في عنوان العمود في شريط رأس العمود
TQRDBTextName=array of TQRDBText; // المصفوفة الديناميكية لعناصر التحكم في عنوان العمود في نطاق التفاصيل
TQRShapeName=صفيف TQRShape; // مصفوفة ديناميكية لأجزاء التحكم في الخط
TQREExpName=صفيف TQRExpr; // مصفوفة ديناميكية لفئة التحكم الإحصائي
TPrintForm = فئة(TForm)
GroupBox1: TGroupBox;
التسمية 5: TLabel؛
BtnSet: TbitBtn;// زر التحكم في "الإعدادات".
BtnCancel: TBitBtn؛ // زر التحكم "إغلاق".
اللوحة 1: لوحة T؛
BtnPrint: TBitBtn؛ // زر التحكم "طباعة".
BtnPrview: TBitBtn؛ // زر "معاينة".
QuickRep: TQuickRep؛ // التحكم في التقرير السريع
HB: TQRBand؛ // التحكم في النطاق "رأس العمود".
العنوان: TQRLabel;// التحكم في عنوان التقرير
QRE1: TQRExpr;// التحكم في "رقم الصفحة" في شريط رأس العمود
QRE2: TQRExpr;// التحكم "بالتاريخ" في شريط رأس العمود
اللوحة 2: لوحة T؛
التسمية 1: TLabel؛
R1: TRadioButton;//التحكم في "طباعة بورتريه".
R2: TRadioButton;//التحكم في "الطباعة الأفقية".
GroupBox4: TGroupBox;
TT: TEdit;// التحكم في مربع إدخال العنوان
التسمية 2: TLabel؛
SR: TCheckBox؛ // التحكم في "طباعة شروط الاستعلام".
التسمية 3: TLabel؛
Image1: TImage;//عرض صورة الطباعة العمودية
Image2: TImage;//عرض صورة الطباعة الأفقية
QRSQL: TQRLabel; // يُستخدم لعرض عنصر التحكم "حالة الاستعلام" في شريط رأس العمود
GroupBox2: TGroupBox;
التسمية 7: TLabel؛
Label8: TLabel؛
التسمية 9: TLabel؛
Label10: TLabel؛
Label11: TLabel؛
التسمية 12: TLabel؛
التسمية 13: TLabel؛
PageSpace: TEdit؛ // التحكم في مربع إدخال تباعد الأعمدة
PageTop: TEdit; // التحكم في مربع الإدخال على هامش الصفحة
PageBottom: TEdit; // التحكم في مربع الإدخال أسفل هامش الصفحة
PageLeft: TEdit; // التحكم في مربع الإدخال الأيسر لهامش الصفحة
PageRight: TEdit; // التحكم في مربع الإدخال الأيمن لهامش الصفحة
PageDlux: TCheckBox؛ // التحكم في "الطباعة على الوجهين".
PageCol: TEdit؛ // التحكم في مربع إدخال العمود
الصفحات: TEdit؛ // التحكم في صندوق إدخال رقم الطباعة
PaperH: TEdit; // التحكم في صندوق إدخال طول الورق
PaperW: TEdit;// التحكم في صندوق إدخال عرض الورق
Label4: TLabel؛
التسمية 6: TLabel؛
Ps: TComboBox;// التحكم في مربع قائمة النماذج الورقية
الاستعلام: TQuery;//تحكم استعلام SQL
DB: TQRBand؛ // التحكم في النطاق "التفاصيل".
CrtRep: TBitBtn؛ // زر التحكم "إنشاء".
التسمية 14: TLabel؛
التسمية 15: TLabel؛
اللوحة 3: لوحة T؛
Wdauto: TRadioButton؛ // التحكم في "العرض التلقائي".
Wdall: TRadioButton؛ // التحكم "بنفس العرض".
Wdmax: TRadioButton؛ // التحكم "بالحد للعرض".
التسمية 16: TLabel؛
ColWd: TEdit; // التحكم في مربع إدخال عرض العمود
اللوحة 4: لوحة T؛
DJAUTO: TRadioButton؛ // التحكم في "المحاذاة التلقائية".
DJCENTER: TRadioButton؛ // "المركز" التحكم
DJLEFT: TRadioButton؛ // عنصر التحكم "محاذاة لليسار".
FB: TQRBand؛ // التحكم في نطاق التذييل
التسمية 17: TLabel؛
اللوحة 5: لوحة T؛
TJ1: TCheckBox؛ // عنصر التحكم "الإحصائيات لكل صفحة".
TJ2: TCheckBox؛ // التحكم في "المجموع الإحصائي".
SB: TQRBand؛ // التحكم في نطاق المجموع
الإجراء FormCreate(Sender: TObject);
إجراء RadioButtonClick(Sender: TObject);
إجراء PageDluxClick(Sender: TObject);
إجراء PageColChange(Sender: TObject);
الإجراء PageSpaceExit(Sender: TObject);
الإجراء PagesChange(Sender: TObject);
الإجراء PageTopExit(Sender: TObject);
الإجراء PageBottomExit(Sender: TObject);
الإجراء PageLeftExit(Sender: TObject);
الإجراء PageRightExit(Sender: TObject);
الإجراء TTExit(Sender: TObject);
الإجراء DTclick(Sender: TObject);
الإجراء BtnPrviewClick(Sender: TObject);
الإجراء BtnSetClick(Sender: TObject);
الإجراء PsChange(Sender: TObject);
الإجراء PaperChange(Sender: TObject);
الإجراء FormClose(Sender: TObject; var Action: TCloseAction);
إجراء FormDestroy(Sender: TObject);
الإجراء CreateReport(Sender: TObject);
الإجراء SRclick(Sender: TObject);
الإجراء ClearRep();
الإجراء FormShow(Sender: TObject);
الإجراء PaperSizeChg(Sender: TObject);
الإجراء DJChage(Sender: TObject);
إجراء WdChage(Sender: TObject);
الإجراء QuickRepStartPage(Sender: TCustomQuickRep);
الإجراء BtnPrintClick(Sender: TObject);
خاص
{تصريحات خاصة}
CHBName:TQRLabelName;// تحديد اسم عنصر التحكم في شريط رأس العمود اسم الصفيف الديناميكي
DBName:TQRDBTextName; // تحديد اسم المصفوفة الديناميكية لاسم التحكم في نطاق التفاصيل
CHBShape,DBShape,FBShape,SumShape:TQRShapeName; // تحديد اسم الصفيف الديناميكي لعنصر التحكم في الخط
FBName,SumName:TQRExpName; // تحديد اسم المصفوفة الديناميكية لأسماء التحكم في التذييل (FBNAME) والنطاق الإجمالي (SUMNAME).
DJ: TAlignment;//محاذاة العمود (taLeftJustify، taRightJustify، taCenter)
Rd1, Rd2:Byte; // يستخدم لحفظ محاذاة أعمدة الجدول (RD1) وأسماء متغيرات حالة عرض الطباعة (RD2).
عام
{التصريحات العامة}
CXTJ,BT:String;//CXTJ يخزن شروط الاستعلام، ويخزن BT عناوين التقارير
// محدد بنموذج المستوى العلوي
نهاية؛
ثابت
حجم الورق: صفيف [0..26] من TQRPaperSize=(A3، A4، A4Small، A5، B4، B5، Letter،
LetterSmall، التابلويد، دفتر الأستاذ، القانوني، البيان، التنفيذي، فوليو،
كوارتو، qr10X14، qr11X17، ملاحظة، Env9، Env10، Env11، Env12،
Env14، CSheet، DSheet، ESheet، Custom)؛
// أنواع الورق المدرجة بواسطة QuickRep
فار
نموذج الطباعة: نموذج الطباعة؛
تطبيق
{$R *.DFM}
الإجراء TprintForm.FormCreate(Sender: TObject);
// عرض خاصية QuickRep.Page وقيم الخصائص الأخرى
فار
أنا: بايت؛
يبدأ
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.Checked;
R2.Checked:=QuickRep.Page.Orientation=poLandscape;
Image2.Visible:=R2.Checked;
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، يعرض مربع القائمة //PS نوع الورق
إذا QuickRep.Page.PaperSize=PaperSize[I] فابدأ
PS.ItemIndex:=I;
استراحة؛
نهاية؛
// تحديد ما إذا كان يمكن تغيير عرض الورق، ولا يمكن تغييره إلا إذا تم تخصيص نوع الورق (Ps.ItemIndex=26).
PaperH.Enabled:=Ps.ItemIndex=26;
PaperW.Enabled:=Ps.ItemIndex=26;
نهاية؛
الإجراء TprintForm.RadioButtonClick(Sender: TObject);
// تغيير اتجاه الورق لمعالجة الأحداث
فار
S:سلسلة؛
يبدأ
Image1.Visible:=R1.Checked;
Image2.Visible:=R2.Checked;
إذا R1.Checked بعد ذلك
QuickRep.Page.Orientation:=poPortrait
آخر
QuickRep.Page.Orientation:=poLandscape;
// قم بتبديل قيم عرض الورق وطوله
S:=PaperH.Text;
PaperH.Text:=PaperW.Text;
PaperW.Text:=S;
إذا كان (Ps.ItemIndex=26) أو (Ps.ItemIndex=0) فابدأ
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
نهاية؛
نهاية؛
الإجراء TprintForm.PageDluxClick(Sender: TObject);
يبدأ
QuickRep.PrinterSettings.Duplex:=PageDlux.Checked;
نهاية؛
الإجراء TprintForm.PageColChange(Sender: TObject);
يبدأ
إذا StrToInt(PageCol.Text)<1 ثم PageCol.Text:='1';
QuickRep.Page.Columns:=StrToInt(PageCol.Text);
نهاية؛
الإجراء TPrintForm.PageSpaceExit(Sender: TObject);
يبدأ
QuickRep.Page.ColumnSpace:=StrToFloat(PageSpace.Text);
نهاية؛
الإجراء TprintForm.PagesChange(Sender: TObject);
يبدأ
إذا كان StrToInt(Pages.Text)<1 ثم Pages.Text:='1';
QuickRep.PrinterSettings.Copies:=StrToInt(Pages.Text);
نهاية؛
الإجراء TPrintForm.PageTopExit(Sender: TObject);
يبدأ
QuickRep.Page.TopMargin:=StrToFloat(PageTop.Text);
نهاية؛
الإجراء TPrintForm.PageBottomExit(Sender: TObject);
يبدأ
QuickRep.Page.BottomMargin:=StrToFloat(PageBottom.Text);
نهاية؛
الإجراء TprintForm.PageLeftExit(Sender: TObject);
يبدأ
QuickRep.Page.LeftMargin:=StrToFloat(PageLeft.Text);
نهاية؛
الإجراء TprintForm.PageRightExit(Sender: TObject);
يبدأ
QuickRep.Page.RightMargin:=StrToFloat(PageRight.Text);
نهاية؛
الإجراء TprintForm.TTExit(Sender: TObject);// معالجة حدث تغيير العنوان
يبدأ
QuickRep.ReportTitle:=TT.Text;
Title.Caption:=TT.Text;
بت:=TT.Text;
نهاية؛
الإجراء TprintForm.DTClick(Sender: TObject);// حدث خانة الاختيار لحالة استعلام الطباعة
يبدأ
QRSQL.Enabled:=SR.Checked;
نهاية؛
الإجراء TPrintForm.BtnPrviewClick(Sender: TObject); // حدث النقر على زر المعاينة
يبدأ
QuickRep.Preview;
نهاية؛
الإجراء TPrintForm.BtnSetClick(Sender: TObject); // حدث النقر على الزر Set
يبدأ
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:=True;
BtnPrint.Enabled:=not CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
نهاية؛
الإجراء TprintForm.PaperChange(Sender: TObject);// أحداث تغيير عرض الورق وطوله
يبدأ
QuickRep.Page.Width:=StrToFloat(PaperW.Text);
QuickRep.Page.Length:=StrToFloat(PaperH.Text);
نهاية؛
الإجراء TprintForm.FormClose(Sender: TObject; var Action: TCloseAction);
يبدأ
الإجراء:=caFree;
نهاية؛
الإجراء TprintForm.FormDestroy(Sender: TObject);
يبدأ
كليرريب؛
نموذج الطباعة:=nil;
نهاية؛
الإجراء TPrintForm.CreateReport(Sender: TObject);//إنشاء حدث النقر على الزر
فار
أنا، ل: بايت؛
CHBtp,CHBlf,Cd,ObWidth:Word;
يبدأ
Screen.Cursor:=crHourGlass;
Title.Caption:=Bt;// قم بتعيين العنوان
ClearRep(); // مسح الكائن الذي تم إنشاؤه؛
إذا كان Sr.Checked ثم QrSQL.Caption:=CXTJ آخر QRSQL.Caption:=';// ما إذا كان سيتم طباعة شروط الاستعلام؟
CHBtp:=HB.Height-17;// الموضع العلوي لعنصر التحكم الذي تم إنشاؤه في النطاق
CHBlf:=0; // عنصر التحكم الذي تم إنشاؤه موجود في الموضع الأيسر في النطاق
ObWidth:=0; // عرض عنصر التحكم الذي تم إنشاؤه
for I := 0 to Query.FieldCount-1 do // إنشاء عنصر تحكم بناءً على عدد الحقول التي يتم إرجاعها بواسطة الاستعلام
يبدأ
إذا (Query.Fields[I].DataType<>ftBlob) و(Query.Fields[I].DataType<>ftMemo) ثم
ابدأ // تجاهل حقل الملاحظة وحقل الصورة
L:=Query.Fields[I].DataSize-1;//L=عرض الحقل (بايت)-1
الحالة Rd1 of // قم بتعيين محاذاة عنصر التحكم وفقًا للمحاذاة المحددة
0: إذا كان L<=10 ثم Dj:=taCenter else DJ:=taLeftJustify;
// المحاذاة التلقائية: تتم محاذاة الحقول الأقل من أو تساوي 10 في المنتصف، وإلا فإنها تتم محاذاتها إلى اليسار
1: Dj:=taCenter;//محاذاة المركز
2: DJ:=taLeftJustify;//محاذاة لليسار
نهاية؛
case Rd2 of // قم بتعيين عرض عمود التقرير وفقًا لعرض القائمة المحدد
0: البدء
// العرض التلقائي: إذا كان L> 14، فسيتم عرض ObWidth=14+(L-14)/2;
// لا يمكن للعرض عرض عناوين الأعمدة، ثم ObWidth=عرض عنوان العمود إذا كان نوع الحقل
// بالنسبة لنوع التاريخ ونوع العملة ونوع رقم النقطة العائمة، ObWidth=65
إذا كان L>14 ثم L:=14+(L-14) div 2;
ObWidth:=L*6;
L:=Length(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)
else 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، فابدأ //إنشاء عنصر تحكم>عرض الورق؟
DlgMes:='عرض الورق غير كافٍ، برجاء تغيير حجم الورق. ';
messageBox(Handle,DlgMes,Cap_Inf,Ico_Inf);
استراحة؛
نهاية
آخر تبدأ
CHBShape[I]:=TQRShape.Create(HB);// إنشاء عنصر تحكم في خط شريط رأس العمود
CHBShape[I].Parent:=HB;
CHBShape[I].Top:=CHBtp;
CHBShape[I].Left:=CHBlf;
CHBShape[I].Width:=ObWidth+1;
CHBShape[I].الارتفاع:=17;
CHBNAME[I]:=TQRLabel.Create(HB); // إنشاء عنصر تحكم في عنوان العمود
CHBNAME[I].Parent:=HB;
CHBNAME[I].Top:=CHBtp+2;
CHBNAME[I].Left:=CHBlf+1;
CHBNAME[I].AutoSize:=False;
CHBNAME[I].Width:=ObWidth-1;
CHBNAME[I].Alignment:=taCenter;
CHBNAME[I].Caption:=Query.Fields[I].DisplayName;//احصل على الحقل كاسم العمود
CHBNAME[I].BringToFront;
DBShape[I]:=TQRShape.Create(DB); // إنشاء عنصر تحكم في خط شريط التفاصيل
DBShape[I].Parent:=DB;
DBShape[I].Top:=-1;
DBShape[I].Left:=CHBlf;
DBShape[I].Width:=ObWidth+1;
DBShape[I].Height:=17;
DBNAME[I]:=TQRDBText.Create(DB); // إنشاء عنصر تحكم في نطاق التفاصيل
DBNAME[I].Parent:=DB;
DBNAME[I].ParentReport:=QuickRep;
DBNAME[I].Top:=2;
DBNAME[I].Left:=CHBlf+2;
DBNAME[I].AutoSize:=False;
DBNAME[I].Width:=ObWidth-3;
DBNAME[I].الارتفاع:=13;
DBNAME[I].Alignment:=Dj;
DBNAME[I].DataSet:=Query;
DBNAME[I].DataField:=Query.Fields[I].FieldName;
DBNAME[I].BringToFront;
إذا كان Tj1.Checked فابدأ // هل تريد إنشاء شريط تذييل؟
FBShape[I]:=TQRSShape.Create(FB); // إنشاء عنصر تحكم في خط شريط التذييل
FBShape[I].Parent:=FB;
FBShape[I].Top:=0;
FBShape[I].Left:=CHBlf;
FBShape[I].Width:=ObWidth+1;
FBShape[I].الارتفاع:=17;
إذا (Query.Fields[I].DataType=ftFloat) أو
(Query.Fields[I].DataType=ftCurrency) أو (I<2) إذن
ابدأ // إذا كان نوع الحقل نوعًا رقميًا، فقم بإنشائه
FBNAME[I]:=TQRExpr.Create(FB); // إنشاء عنصر تحكم في شريط التذييل
FBNAME[I].Parent:=FB;
FBNAME[I].ParentReport:=QuickRep;
FBNAME[I].Top:=3;
FBNAME[I].Left:=CHBlf+2;
FBNAME[I].AutoSize:=False;
FBNAME[I].Width:=ObWidth-3;
FBNAME[I].الارتفاع:=13;
FBNAME[I].Alignment:=taCenter;
FBNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
FBNAME[I].BringToFront;
نهاية؛
نهاية؛
إذا كان Tj2.Checked ثم يبدأ // هل يجب علينا إنشاء النطاق الإجمالي؟
SumShape[I]:=TQRShape.Create(SB); // إنشاء عنصر تحكم في خط الشريط الإجمالي
SumShape[I].Parent:=SB;
SumShape[I].Top:=0;
SumShape[I].Left:=CHBlf;
SumShape[I].Width:=ObWidth+1;
SumShape[I].Height:=17;
إذا (Query.Fields[I].DataType=ftFloat) أو
(Query.Fields[I].DataType=ftCurrency) أو (I<2) إذن
ابدأ // إذا كان نوع الحقل نوعًا رقميًا، فقم بإنشائه
SumNAME[I]:=TQRExpr.Create(SB); // إنشاء عنصر تحكم في النطاق الإجمالي
SumNAME[I].Parent:=SB;
SumNAME[I].ParentReport:=QuickRep;
SumNAME[I].Top:=3;
SumNAME[I].Left:=CHBlf+2;
SumNAME[I].AutoSize:=False;
SumNAME[I].Width:=ObWidth-3;
SumNAME[I].Height:=13;
SumNAME[I].Alignment:=taCenter;
SumNAME[I].Expression:='SUM(QUERY.'+Query.Fields[I].FieldName+')';
SumNAME[I].BringToFront;
نهاية؛
نهاية؛
CHBlf:=CHBlf+ObWidth;// اكتملت معالجة الحقل الحالي، بعرض حقل واحد إلى اليمين
نهاية؛
نهاية؛
نهاية؛
CrtRep.Enabled:=False;//تعطيل زر الإنشاء
BtnPrint.Enabled:=not CrtRep.Enabled;السماح بطباعة أزرار الأمونيوم
BtnPrview.Enabled:=BtnPrint.Enabled;السماح بزر المعاينة
إذا تم التحقق من Tj1، فابدأ // إذا تم إنشاء شريط تذييل، فقم بتغيير العمودين الأولين في شريط التذييل
FBNAME[0].Expression:=''إجمالي الصفحات'';
FBNAME[1].Expression:='COUNT+'row'';
نهاية؛
إذا تم التحقق من Tj1، فابدأ // إذا تم إنشاء النطاق الإجمالي، فقم بتغيير العمودين الأولين في النطاق الإجمالي
SumNAME[0].Expression:=''الإجمالي'';
SumNAME[1].Expression:='COUNT+'row'';
نهاية؛
// اضبط موضع طباعة التاريخ ورقم الصفحة في منطقة رأس العمود
QRE2.Left:=HB.Width-Qre2.Width;
QRSQL.Left:=QRE1.Width+10;
QRSQL.Width:= QRE2.Left-10-QRSSQL.Left;
QuickRep.DataSet:=Query; // حدد مجموعة البيانات لـ QuickRep، يجب ألا تكون هذه الجملة مفقودة
Screen.Cursor:=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(Sender: TObject);
يبدأ
إذا كان Sr.Checked ثم QrSQL.Caption:=CXTJ وإلا QRSQL.Caption:=';
نهاية؛
الإجراء TprintForm.FormShow(Sender: TObject); // حدث عرض النموذج
يبدأ
Query.Active:=True;//اطبع SQL
TT.Text:=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(Sender: TObject);
يبدأ
CrtRep.Enabled:=True;
BtnPrint.Enabled:=not CrtRep.Enabled;
BtnPrview.Enabled:=BtnPrint.Enabled;
نهاية؛
الإجراء TprintForm.DJChage(Sender: TObject);// معالجة حدث تغيير المحاذاة
فار
التغيير: بايت؛
يبدأ
إذا Djauto.Checked ثم Chg:=0
وإلا إذا كان DjCenter.Checked ثم Chg:=1
آخر تغيير:=2;
إذا كان Chg<>Rd1 فابدأ PaperSizeChg(nil);Rd1:=Chg;end;
نهاية؛
الإجراء TprintForm.WdChage(Sender: TObject);// معالجة حدث تغيير العرض
فار
التغيير: بايت؛
يبدأ
إذا 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(Sender: TCustomQuickRep);
// تبدأ طباعة التقرير في معالجة حدث الصفحة الجديدة، ويتم مسح القيم الإحصائية في شريط التذييل.
فار
أنا: بايت؛
يبدأ
إذا Tj1.Checked بعد ذلك
بالنسبة إلى I:=0 إلى Query.FieldCount-1، قم بذلك
إذا تم تعيينه (FBNAME[I]) ثم FBNAME[I].Reset؛
نهاية؛
الإجراء TprintForm.BtnPrintClick(Sender: TObject);
يبدأ
QuickRep.Print;
نهاية؛
نهاية.
4. مثال على مربع حوار الاتصال:
أولاً، قم بتضمين وحدة PrintDlg في عبارة USES في النموذج المراد استدعاؤه، ثم استدعيها بالكود التالي:
إذا لم يتم تعيينه (PrintForm) ثم PrintForm:=TPrintForm.Create(application);
PrintForm.Query.SQL.Assign(Query.SQL);
// إذا كان نموذج الاتصال لا يحتوي على عنصر تحكم استعلام، فيمكنك تعيين قيمة عبارة SQL مباشرة
PrintForm.Bt:=عنوان التقرير؛
PrintForm.Caption:=عنوان النموذج؛
PrintForm.CXTJ:=شروط الاستعلام؛
PrintForm.ShowModal;
5. الاستنتاج
مفتاح هذا البرنامج هو عملية حدث CreateReport ومعالجة أسماء عناصر التحكم الديناميكية. نظرًا لضيق المساحة، لم يتم شرح بعض المحتويات وآمل أن يتمكن القراء من فهمها بأنفسهم. لإنشاء التقارير العامة، يمكن لهذا البرنامج تلبية المتطلبات.
لدي الإصدار الأحدث، الذي يتمتع بوظائف أقوى، ويمكن للأصدقاء الذين يحتاجون إليه أن يرسلوا لي بريدًا إلكترونيًا وسأرسله بالتأكيد.