Computerraum, Krankenhaus für traditionelle chinesische Medizin Wuxi, Provinz Jiangsu
Yuan Bo
----Das Informationsmanagementsystem unseres Krankenhauses verwendet Delphi-Programmierung. Da die Anforderungen jedes Fachs unterschiedlich sind und auch die Berichtsformulare unterschiedlich sind, bereitet das Schreiben Kopfschmerzen. Delphi läuft unter der WINDOWS-Plattform und das Drucken ist völlig anders als unter DOS. Quick Report ist schwer zu kontrollieren und beansprucht Ressourcen. Für einen etwas komplexen Bericht mit besonderen Anforderungen ist Quick Report nicht realisierbar. Hier sind einige Implementierungsmethoden für typische Berichte, die bei der Programmierung vorkommen.
---- 1. Die Finanzabteilung jeder Einheit verfügt über mehrere Hauptbücher. Die Finanzabteilung unseres Krankenhauses hat vorgeschlagen, das Hauptbuch des Arzneimittellagers zu drucken, um das manuelle Hauptbuch zu entfernen Das Amt ist berechtigt, Dekan. Es wird auch gesagt, dass es so sein sollte. Beim Anblick der kleinen roten und grünen Karten des Finanzministeriums, einheitlich bedruckt und mit einem Zeilenabstand von 3 mm, musste ich an die Tugend der Genügsamkeit des chinesischen Volkes denken. Wenn man bedenkt, dass jedes Medikament mindestens einmal gedruckt werden muss und keine einzige Tabellenzeile fehlt, gibt es im Krankenhaus für traditionelle chinesische Medizin mehr als 2.000 Arten von Medikamenten, sodass dieser Bericht mit einem Laserdrucker gedruckt werden muss (wie). Wie man den Dekan dazu bringt, dem Kauf eines Laserdruckers zuzustimmen, ist eine andere Sache. Wie kann Büroautomation kostenlos sein?) Die Idee bei der Implementierung des Programms besteht im Wesentlichen darin, das Druckpapier als Leinwand zu verwenden, um kleine Rechtecke darauf zu zeichnen, was insbesondere durch die folgenden Prozesse umgesetzt wird: (Das Formular soll Ttzview heißen).
Definieren Sie zunächst zwei Klassen im Programm:
titlerecord=Datensatz
Aktuell:Trect;
Atitle:string;
Ende;
detailrecord=Datensatz
Arect:Trect;
Ausrichtung:Wort;
Ende;
---- Richten Sie die folgenden vier Prozesse ein;
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:boolean;position:word);
---- Dieser Prozess wird verwendet, um ein Rechteck zu zeichnen, und der Rahmen bestimmt, ob eine Linie gezeichnet werden soll (natürlich muss sie hier gezeichnet werden!);
----PRintinitit(firsttop,firstleft:integer);
---- Dieser Prozess wird zur Initialisierung verwendet, bei der die Position jedes kleinen Rechtecks auf dem Papier definiert wird.
---- printtitle(acanvas:Tcanvas);
----Dieser Vorgang dient zum Drucken der Kopfzeile, da die Zeichen in der Kopfzeile immer größer sind.
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;firstpage:integer);
----Dieser Vorgang besteht darin, den spezifischen Inhalt zu drucken. Wenn dies nicht ausreicht, kann die Seite nur ein einziges Mal sein.
---- printhj(acanvas:Tcanvas);
---- Sie können auf einen Blick erkennen, dass es sich bei diesem Vorgang um den Ausdruck der Gesamtsumme handelt!
---- Erstellen Sie einfach einen Botton und rufen Sie nacheinander die vier Prozesse printinitit, printtitle, printdetail und printhj auf.
---- (Aufrufformat: printtitle(printer.canvas);)
---- Qtz sind übrigens die abgefragten Ledger-Daten. Wie diese generiert werden, wird hier nicht erläutert.
----Die spezifischen Verfahren sind wie folgt
---- Dieses Programm läuft auf den Plattformen delphi1, delphi3, WIN3.2, WIN95, WIN97 und WIN98. Es stellt übrigens die Bibliotheksstruktur der Ledger-Datenbank bereit.
---- 2. Sehr komplexe und unverständliche Berichte
---- Die Onkologieabteilung unseres Krankenhauses muss Patientenakten drucken. Dies ist Teil der Modernisierung der Fachgebiete. Das Gesundheitsbüro wird zur Inspektion kommen, daher muss die Aufgabe abgeschlossen werden. Jede Krankenakte enthält mehr als 100 Elemente. Wenn Sie Qreport verwenden und ein Element in der Mitte hinzufügen oder entfernen müssen (was häufig vorkommt), führt die Anpassung und Anordnung von Dutzenden von Elementen dazu, dass Menschen ohnmächtig werden. Ich habe mehr als 100 temporäre Variablen auf einmal erstellt und auf der virtuellen Leinwand gezeichnet. Auf meinem PII233-Rechner mit 64 MB Speicher lief es reibungslos, aber als ich zum Rechner der Onkologieabteilung mit 486,8 MB Speicher wechselte (nicht lachen, alle zusammen). Der Systemstapel läuft sofort über, daher muss ich auf die Zeigermethode zurückgreifen (mein Programmierniveau scheint sich wieder verbessert zu haben, insgeheim bin ich glücklich), die Methode ist wie folgt:
Erstellen Sie zunächst die Titleprint-Klasse:
titleprint=^Titlerecord;
titlerecord=Datensatz
Aktuell:Trect;
Atitle:string[50];
Ende;
Erstellen Sie dann den Prozess printnow (der Name des Formulars lautet
zlk, printdot sind die Punkte des Druckers, im Allgemeinen 180);
procedure Tzlk.printnow(acanvas:Tcanvas);
var i,x,y,pc_count:integer;
myprint:array[0..200] of titleprint;
beginnen
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*Druckpunkt))+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.
caption+DBname.text;
ACanvas.MoveTo(myprint[pc_count]^.
gerade.links,
myprint[pc_count]^.currect.top-round
(Zeilenhöhe/5));
{Die folgenden vier Zeilen werden mehr als 100 Mal wiederholt, was im Grunde dasselbe ist.
Ich schreibe sie nicht alle, um Tantiemen zu verdienen}
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.currect:=scalerect(
myprint[pc_count-1]^.currect,round(int
(2,5/2,54*Druckpunkt)),0);
myprint[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(myprint[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
.......
{Drucken}
printtitle(acanvas);
{Diese Funktion wird nicht bereitgestellt, es spielt keine Rolle, wenn Sie den Header nicht benötigen}
for i:=1 to pc_count do
beginnen
RectDraw(Acanvas,myprint[i]^.atitle,
myprint[i]^.currect,false,
dt_left oder dt_singleline oder dt_vcenter);
Ende;
dispose(myprint[pc_count]);
{Vergessen Sie nicht, den vom Zeiger belegten Speicher freizugeben}
Ende;
---- Erstellen Sie abschließend einen Botton, beurteilen Sie, ob er tatsächlich gedruckt wird, und rufen Sie dann diese Funktionen auf.
---- (Aufrufformat: printtitle(printer.canvas);)
---- Denken Sie nach dem Lesen der beiden oben genannten Beispiele, dass das Drucken unter WINDOWS eigentlich sehr einfach ist, genau wie das Zeichnen einer Tabelle von Hand, und ob die Position des Tabelleninhalts zentriert, links oder rechts ist, hängt ganz davon ab Die Ausrichtung des gedruckten Inhalts wird durch das Anzeigeformat des Inhalts bestimmt. Sie müssen es nicht selbst berechnen, was sehr praktisch ist.