غرفة الكمبيوتر، مستشفى ووشي للطب الصيني التقليدي، مقاطعة جيانغسو
يوان بو
----يستخدم نظام إدارة المعلومات في مستشفانا برمجة دلفي نظرًا لاختلاف متطلبات كل موضوع وتنوع نماذج التقارير أيضًا، فمن الصعب الكتابة. تعمل دلفي ضمن نظام WINDOWS، والطباعة مختلفة تمامًا عن تلك الموجودة في نظام DOS، حيث يصعب التحكم في التقرير السريع ويستهلك الموارد. بالنسبة لتقرير معقد قليلاً مع متطلبات خاصة، لا يمكن تنفيذ التقرير السريع. فيما يلي بعض طرق التنفيذ للتقارير النموذجية التي تتم مواجهتها في البرمجة.
---- 1. لدى القسم المالي في أي وحدة عدة دفاتر سميكة. اقترح القسم المالي في مستشفانا طباعة دفتر الأستاذ الخاص بمستودع الأدوية للتخلص من دفتر الأستاذ اليدوي المكتب الطلب معقول يا عميد ويقال أيضا أنه ينبغي أن يكون كذلك. وبالنظر إلى البطاقات الحمراء والخضراء الصغيرة التي تقدمها وزارة المالية، والتي كانت مطبوعة بشكل موحد، وبمسافة 3 مم بين الأسطر، لم أستطع إلا أن أفكر في فضيلة التوفير لدى الشعب الصيني. مع الأخذ في الاعتبار أنه يجب طباعة كل دواء مرة واحدة على الأقل، وعدم فقدان سطر واحد من الجدول، بالإضافة إلى أن هناك أكثر من 2000 نوع من الأدوية في مستشفى الطب الصيني التقليدي، لذلك يجب طباعة هذا التقرير بطابعة ليزر (كما هو موضح). أما بالنسبة لكيفية إقناع العميد بالموافقة على شراء طابعة ليزر، فهذا شيء آخر، كيف يمكن أن تكون أتمتة المكاتب بدون تكلفة؟) تقوم فكرة تنفيذ البرنامج بشكل أساسي على استخدام ورق الطباعة كلوحة قماشية لرسم مستطيلات صغيرة عليها، وهو ما يتم تنفيذه تحديداً من خلال العمليات التالية: (دع النموذج يسمى Ttzview).
أولاً قم بتعريف فئتين في البرنامج:
titlerecord=record
الصحيح: صحيح؛
العنوان: سلسلة؛
نهاية؛
Detailrecord=record.detailrecord=record.detailrecord=record
صحيح: صحيح.
المحاذاة:كلمة؛
نهاية؛
---- إنشاء العمليات الأربع التالية؛
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:boolean;position:word);
---- تُستخدم هذه العملية لرسم مستطيل، ويحدد الإطار ما إذا كان سيتم رسم خط (بالطبع يجب رسمه هنا!) ؛
----PRintinit(firsttop,firstleft:integer);
---- تُستخدم هذه العملية للتهيئة، وهي تحديد موضع كل مستطيل صغير على الورقة؛
---- printtitle(acanvas:Tcanvas);
---- تهدف هذه العملية إلى طباعة الرأس، لأن الأحرف الموجودة في الرأس تكون دائمًا أكبر؛
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;firstpage:integer);
----هذه العملية هي طباعة المحتوى المحدد. صفحة واحدة تطبع 40 سطرًا. إذا لم يكن ذلك كافيًا، قم بتغيير الصفحة.
---- printhj(acanvas:Tcanvas);
---- يمكنك أن ترى في لمحة أن هذه العملية تهدف إلى طباعة المجموع!
---- ما عليك سوى إنشاء بوتون واستدعاء العمليات الأربع وهي printinitit وprinttitle وprintdetail وprinthj بالتسلسل.
---- (تنسيق الاتصال: printtitle(printer.canvas);)
---- بالمناسبة، Qtz هي بيانات دفتر الأستاذ التي تم الاستعلام عنها ولن تتم مناقشة كيفية إنشائها هنا.
----الإجراءات المحددة هي كما يلي
---- يعمل هذا البرنامج تحت إصدارات delphi1 وdelphi3 WIN3.2 وWIN95 وWIN97 وWIN98. وبالمناسبة، فهو يوفر بنية المكتبة لقاعدة بيانات دفتر الأستاذ.
---- 2. تقارير معقدة للغاية وغير مفهومة
---- يحتاج قسم الأورام في مستشفانا إلى طباعة السجلات الطبية للمرضى، وهذا جزء من تحديث التخصصات المتخصصة، وسيأتي مكتب الصحة للفحص، لذا يجب إكمال المهمة. يحتوي كل سجل طبي على أكثر من 100 عنصر. إذا كنت تستخدم Qreport، إذا كنت بحاجة إلى إضافة أو طرح عنصر في المنتصف (يحدث هذا غالبًا)، فإن تعديل وترتيب عشرات العناصر سيؤدي إلى إغماء الأشخاص. لقد قمت بإنشاء أكثر من 100 متغير مؤقت في وقت واحد ورسمت على اللوحة الافتراضية، وقد تم تشغيله بسلاسة على جهاز PII233 الخاص بي المزود بذاكرة تبلغ 64 ميجا بايت، ولكن عندما قمت بالتبديل إلى جهاز قسم الأورام بذاكرة تبلغ 486.8 ميجا بايت (لا تضحكوا جميعًا)، سوف يفيض مكدس النظام على الفور، لذلك لا بد لي من اللجوء إلى طريقة المؤشر (يبدو أن مستوى البرمجة الخاص بي قد تحسن مرة أخرى، سعيد سرًا)، الطريقة هي كما يلي:
قم أولاً بإنشاء فئة طبعة العنوان:
titleprint=^Titlerecord;
titlerecord=record
الصحيح: صحيح؛
العنوان:سلسلة[50];
نهاية؛
ثم قم بإنشاء عملية الطباعة الآن (اسم النموذج هو
zlk، printdot هي نقاط الطابعة، بشكل عام 180)؛
الإجراء Tzlk.printnow(acanvas:Tcanvas);
فار i,x,y,pc_count:integer;
myprint:array[0..200] of titleprint;
يبدأ
firsttop:=round(int(0.5/2.54*printdot));
firstleft:=round(int(0.1/2.54*printdot));
Rowheight:=round(int(0.7/2.54*printdot));
x:=0+firstleft;y:=round(int
(1.3/2.54*نقطة الطباعة))+firsttop;
pc_count:=0;
inc(pc_count new(myprint[pc_count]);
myprint[pc_count]^.currect:=rect
(x+round(int(0.1/2.54*printdot))+firstleft,y,
x+round(int(3.0/2.54*printdot))+firstleft,
y+firsttop+round(int(0.5/2.54*printdot)));
myprint[pc_count]^.atitle:=Lname.
تسمية توضيحية+DBname.text;
ACanvas.MoveTo(myprint[pc_count]^.
صحيح.يسار,
طبعتي[pc_count]^.currect.top-round
(ارتفاع الصف/5))؛
{سيتم تكرار الأسطر الأربعة التالية أكثر من 100 مرة، وهو نفس الشيء في الأساس.
أنا لا أكتبهم جميعًا لكسب الإتاوات}
inc(pc_count new(myprint[pc_count]);
طبعتي[pc_count]^.currect:=scalerect(
myprint[pc_count-1]^.currect,round(int
(2.5/2.54*نقطة الطباعة)),0);
myprint[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(myprint[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
........
{مطبعة}
printtitle(acanvas);
{لن يتم توفير هذه الوظيفة، لا يهم إذا لم تكن بحاجة إلى الرأس}
لأني:=1 إلى pc_count افعل
يبدأ
RectDraw(Acanvas,myprint[i]^.atitle,
طباعتي[i]^.currect,false,
dt_left أو dt_singleline أو dt_vcenter)؛
نهاية؛
التخلص(myprint[pc_count]);
{لا تنس تحرير الذاكرة التي يشغلها المؤشر}
نهاية؛
---- أخيرًا، قم بإنشاء بوتون، وأضف حكمًا على ما إذا كان مطبوعًا بالفعل، ثم قم باستدعاء هذه الوظائف.
---- (تنسيق الاتصال: printtitle(printer.canvas);)
---- بعد قراءة المثالين أعلاه، هل تعتقد أن الطباعة تحت WINDOWS هي في الواقع بسيطة جدًا، تمامًا مثل رسم جدول يدويًا، وما إذا كان موضع محتوى الجدول في المنتصف أو اليسار أو اليمين يعتمد كليًا على يتم تحديد محاذاة المحتوى المطبوع من خلال تنسيق عرض المحتوى، ولا يتعين عليك حسابه بنفسك، وهو أمر مريح للغاية.