ห้องคอมพิวเตอร์ โรงพยาบาลแพทย์แผนจีนอู๋ซี มณฑลเจียงซู
หยวน โบ
----ระบบการจัดการข้อมูลของโรงพยาบาลของเราใช้การเขียนโปรแกรม Delphi เนื่องจากข้อกำหนดของแต่ละวิชามีความแตกต่างกัน และแบบฟอร์มรายงานก็มีความหลากหลาย การเขียนจึงเป็นเรื่องที่น่าปวดหัว Delphi ทำงานภายใต้แพลตฟอร์ม WINDOWS และการพิมพ์แตกต่างไปจากที่อยู่ภายใต้ DOS โดยสิ้นเชิง ควบคุมได้ยากและใช้ทรัพยากรมาก สำหรับรายงานที่ซับซ้อนเล็กน้อยซึ่งมีข้อกำหนดพิเศษ ไม่สามารถรับรู้ถึงรายงานด่วนได้ ต่อไปนี้เป็นวิธีการนำไปใช้สำหรับรายงานทั่วไปที่พบในการเขียนโปรแกรม
---- 1. แผนกการเงินของหน่วยงานใด ๆ มีบัญชีแยกประเภทหนาหลายบัญชี แผนกการเงินของโรงพยาบาลของเราเสนอให้พิมพ์บัญชีแยกประเภทของคลังยาเพื่อกำจัดบัญชีแยกประเภทแบบแมนนวล ถือได้ว่าเป็นการปรับปรุงให้ทันสมัย คำขอนั้นสมเหตุสมผลคณบดีก็บอกว่าควรเป็นเช่นนั้น เมื่อมองดูการ์ดใบเล็กสีแดงและเขียวที่ฝ่ายการคลังจัดให้ พิมพ์สม่ำเสมอ และมีระยะห่างระหว่างบรรทัด 3 มม. อดไม่ได้ที่จะนึกถึงคุณธรรมแห่งความประหยัดของชาวจีน โดยพิจารณาว่ายาแต่ละชนิดจะต้องพิมพ์อย่างน้อยหนึ่งครั้งและไม่มีบรรทัดตารางแม้แต่เส้นเดียว นอกจากนี้ ในโรงพยาบาลการแพทย์แผนจีนยังมียามากกว่า 2,000 ชนิด ดังนั้นรายงานนี้จึงต้องพิมพ์ด้วยเครื่องพิมพ์เลเซอร์ (เช่น ส่วนจะให้คณบดีตกลงซื้อเครื่องพิมพ์เลเซอร์ได้อย่างไร ก็อีกเรื่องหนึ่ง แนวคิดในการนำโปรแกรมไปใช้โดยพื้นฐานแล้วคือใช้กระดาษพิมพ์เป็นผืนผ้าใบเพื่อวาดรูปสี่เหลี่ยมเล็ก ๆ ลงไป ซึ่งดำเนินการเป็นพิเศษโดยกระบวนการต่อไปนี้: (ให้แบบฟอร์มตั้งชื่อว่า Ttzview)
ขั้นแรกให้กำหนดสองคลาสในโปรแกรม:
titlerecord=บันทึก
แก้ไขล่าสุด:Trect;
ชื่อ:สตริง;
จบ;
detailrecord=บันทึก
ตรง:Trect;
การจัดตำแหน่ง:คำ;
จบ;
---- สร้างสี่กระบวนการดังต่อไปนี้
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:บูลีน;ตำแหน่ง:คำ);
---- กระบวนการนี้ใช้ในการวาดรูปสี่เหลี่ยมผืนผ้า และกรอบจะกำหนดว่าจะวาดเส้นหรือไม่ (แน่นอนว่าต้องวาดตรงนี้!);
----PRintinitit (อันดับแรก, ซ้ายสุด: จำนวนเต็ม);
---- กระบวนการนี้ใช้สำหรับการเริ่มต้น ซึ่งก็คือการกำหนดตำแหน่งของแต่ละสี่เหลี่ยมเล็ก ๆ บนกระดาษ
---- ชื่อสิ่งพิมพ์(acanvas:Tcanvas);
----กระบวนการนี้เป็นการพิมพ์ส่วนหัว เนื่องจากอักขระในส่วนหัวจะมีขนาดใหญ่กว่าเสมอ
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:จำนวนเต็ม;หน้าแรก:จำนวนเต็ม);
----ขั้นตอนนี้คือการพิมพ์เนื้อหาเฉพาะ หน้าเดียวพิมพ์ได้ 40 บรรทัด หากไม่เพียงพอให้เปลี่ยนหน้า
---- printhj(ผ้าใบ:Tcanvas);
---- บอกได้เลยว่าขั้นตอนนี้คือการพิมพ์ยอดรวม!
---- เพียงสร้าง Botton แล้วเรียกกระบวนการทั้งสี่ ได้แก่ printinitit, printtitle, printdetail และ printhj ตามลำดับ
---- (รูปแบบการโทร: printtitle(printer.canvas);)
---- อย่างไรก็ตาม Qtz เป็นข้อมูลบัญชีแยกประเภทที่สอบถามถึงวิธีสร้างข้อมูลดังกล่าว จะไม่ถูกกล่าวถึงที่นี่
----ขั้นตอนเฉพาะมีดังนี้
---- โปรแกรมนี้ทำงานภายใต้แพลตฟอร์ม delphi1, delphi3 เวอร์ชัน WIN3.2, WIN95, WIN97 และ WIN98 อย่างไรก็ตาม มันมีโครงสร้างไลบรารีของฐานข้อมูลบัญชีแยกประเภท
---- 2. รายงานที่ซับซ้อนมากและไม่สามารถเข้าใจได้
---- แผนกเนื้องอกวิทยาของโรงพยาบาลจำเป็นต้องพิมพ์เวชระเบียนผู้ป่วย นี่เป็นส่วนหนึ่งของการปรับปรุงความเชี่ยวชาญเฉพาะทางให้ทันสมัย เวชระเบียนแต่ละรายการมีมากกว่า 100 รายการ หากคุณใช้ Qreport หากคุณต้องการเพิ่มหรือลบรายการตรงกลาง (ซึ่งเกิดขึ้นบ่อยครั้ง) การปรับและจัดเรียงรายการหลายสิบรายการจะทำให้คนเป็นลม ฉันสร้างตัวแปรชั่วคราวมากกว่า 100 รายการในคราวเดียวและวาดบนผืนผ้าใบเสมือน มันทำงานได้อย่างราบรื่นบนเครื่อง PII233 ของฉันที่มีหน่วยความจำ 64M แต่เมื่อฉันเปลี่ยนไปใช้เครื่องของแผนกเนื้องอกวิทยาที่มีหน่วยความจำ 486.8M (อย่าหัวเราะนะทุกคน) system stack จะล้นทันที เลยต้องหันไปใช้วิธี pointer (ดูเหมือนระดับการเขียนโปรแกรมจะดีขึ้นอีกแล้ว แอบดีใจ) วิธีเป็นดังนี้
ขั้นแรกให้สร้างคลาส titleprint:
titleprint=^บันทึกชื่อเรื่อง;
titlerecord=บันทึก
แก้ไขล่าสุด:Trect;
ชื่อ:สตริง[50];
จบ;
จากนั้นสร้างกระบวนการ printnow (ชื่อของแบบฟอร์มคือ
zlk, printdot คือจุดของเครื่องพิมพ์ โดยทั่วไปคือ 180)
ขั้นตอน Tzlk.printnow(acanvas:Tcanvas);
var i,x,y,pc_count:จำนวนเต็ม;
myprint:array[0..200] ของชื่อพิมพ์;
เริ่ม
อันดับแรก:=รอบ(int(0.5/2.54*printdot));
ซ้ายแรก:=รอบ(int(0.1/2.54*printdot));
ความสูงแถว:=รอบ(int(0.7/2.54*printdot));
x:=0+ซ้ายสุด;y:=round(int
(1.3/2.54*จุดพิมพ์))+อันดับแรก;
pc_count:=0;
inc(pc_count); ใหม่(myprint[pc_count]);
myprint[pc_count]^.currect:=rect
(x+รอบ(int(0.1/2.54*printdot))+ซ้ายสุด,y,
x+รอบ(int(3.0/2.54*printdot))+ซ้ายสุด
y+เฟิร์สท็อป+รอบ(int(0.5/2.54*printdot)));
myprint[pc_count]^.atitle:=Lname.
คำบรรยายภาพ+DBname.text;
ACanvas.MoveTo(myprint[pc_count]^.
ถูกต้อง.ซ้าย,
myprint[pc_count]^.currect.top-round
(ความสูงแถว/5));
{สี่บรรทัดต่อไปนี้จะถูกทำซ้ำมากกว่า 100 ครั้ง ซึ่งโดยพื้นฐานแล้วจะเหมือนกัน
ฉันไม่ได้เขียนทั้งหมดเพื่อรับค่าลิขสิทธิ์}
inc(pc_count); ใหม่(myprint[pc_count]);
myprint[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));
-
{พิมพ์}
ชื่อสิ่งพิมพ์(ผ้าใบ);
{จะไม่มีการระบุฟังก์ชันนี้ คุณไม่จำเป็นต้องมีส่วนหัวก็ไม่สำคัญ}
สำหรับ i:=1 ถึง pc_count ทำ
เริ่ม
RectDraw(Acanvas,myprint[i]^.atitle,
myprint[i]^.currect,false,
dt_left หรือ dt_singleline หรือ dt_vcenter);
จบ;
กำจัด(myprint[pc_count]);
{อย่าลืมปล่อยหน่วยความจำที่ตัวชี้ครอบครอง}
จบ;
---- สุดท้าย สร้าง Botton เพิ่มการตัดสินว่าพิมพ์จริงหรือไม่ จากนั้นจึงเรียกใช้ฟังก์ชันเหล่านี้
---- (รูปแบบการโทร: printtitle(printer.canvas);)
---- หลังจากอ่านสองตัวอย่างข้างต้นแล้ว คุณคิดว่าการพิมพ์ภายใต้ WINDOWS นั้นง่ายมากจริงๆ เช่นเดียวกับการวาดตารางด้วยมือ และตำแหน่งของเนื้อหาตารางจะอยู่ตรงกลาง ซ้าย หรือขวา ขึ้นอยู่กับ การจัดแนวเนื้อหาที่พิมพ์ รูปแบบการพิมพ์จะถูกกำหนดโดยรูปแบบการแสดงผลของเนื้อหา โดยที่คุณไม่ต้องคำนวณเอง ซึ่งสะดวกมาก