Sala de informática, Hospital de Medicina Tradicional China de Wuxi, provincia de Jiangsu
Yuanbo
----El sistema de gestión de información de nuestro hospital utiliza programación Delphi. Dado que los requisitos de cada tema son diferentes y los formularios de informe también son diversos, escribirlo es un dolor de cabeza. Delphi se ejecuta en la plataforma WINDOWS y la impresión es completamente diferente a la de DOS, es difícil de controlar y consume recursos. Para un informe ligeramente complejo con requisitos especiales, Quick Report no se puede realizar. A continuación se muestran algunos métodos de implementación para informes típicos que se encuentran en la programación.
---- 1. El departamento de finanzas de cualquier unidad tiene varios libros de contabilidad gruesos. El departamento de finanzas de nuestro hospital propuso imprimir el libro de contabilidad del almacén de medicamentos para deshacerse del libro de contabilidad manual. Puede considerarse como una modernización. la oficina. La solicitud es razonable, decano. También se dice que debería ser así. Al mirar las pequeñas tarjetas rojas y verdes proporcionadas por el Departamento de Finanzas, impresas uniformemente y con un espacio entre líneas de 3 mm, no pude evitar pensar en la virtud de la frugalidad del pueblo chino. Teniendo en cuenta que cada medicamento debe imprimirse al menos una vez y que no falta ni una sola línea de la tabla. Además, hay más de 2000 tipos de medicamentos en el hospital de medicina tradicional china, por lo que este informe debe imprimirse con una impresora láser (como. (Para saber cómo lograr que el decano acepte comprar una impresora láser, entonces es otra cosa, ¿cómo puede la automatización de oficinas ser gratuita?). La idea de implementar el programa es básicamente utilizar el papel de impresión como lienzo para dibujar pequeños rectángulos sobre él, lo cual se implementa específicamente mediante los siguientes procesos: (Deje que el Formulario se llame Ttzview).
Primero defina dos clases en el programa:
títulorecord=registro
Currect:Trect;
Título:cadena;
fin;
detalleregistro=registro
Recto: Recto;
alineación: Palabra;
fin;
---- Establecer los siguientes cuatro procesos;
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:boolean;position:word);
---- Este proceso se utiliza para dibujar un rectángulo y el marco determina si se debe dibujar una línea (¡por supuesto que debe dibujarse aquí!);
----PRintinitit(primero arriba,primero a la izquierda:entero);
---- Este proceso se utiliza para la inicialización, que consiste en definir la posición de cada pequeño rectángulo en el papel;
---- printtitle(acanvas:Tcanvas);
----Este proceso consiste en imprimir el encabezado, porque los caracteres en el encabezado siempre son más grandes;
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;firstpage:integer);
----Este proceso consiste en imprimir el contenido específico. Una página imprime 40 líneas. Si no es suficiente, cambie la página. En resumen, una página solo puede ser un medicamento;
---- printhj(acanvas:Tcanvas);
---- ¡Puedes darte cuenta de un vistazo que este proceso es para imprimir el total!
---- Simplemente cree un botón y llame a los cuatro procesos de printinitit, printtitle, printdetail y printhj en secuencia.
---- (Formato de llamada: printtitle(printer.canvas);)
---- Por cierto, Qtz son los datos del libro mayor consultados. Aquí no se discutirá cómo generarlos.
----Los procedimientos específicos son los siguientes
---- Este programa se ejecuta en las plataformas delphi1, delphi3 versiones WIN3.2, WIN95, WIN97 y WIN98. Por cierto, proporciona la estructura de la biblioteca de la base de datos del libro mayor.
---- 2. Informes muy complejos e incomprensibles
---- El Departamento de Oncología de nuestro hospital necesita imprimir los registros médicos de los pacientes. Esto es parte de la modernización de las especialidades. La Oficina de Salud vendrá a inspeccionar, por lo que la tarea debe completarse. Cada registro médico tiene más de 100 elementos. Si usa Qreport, si necesita sumar o restar un elemento en el medio (esto sucede a menudo), el ajuste y la disposición de docenas de elementos hará que la gente se desmaye. Creé más de 100 variables temporales a la vez y dibujé en el lienzo virtual. Funcionó sin problemas en mi máquina PII233 con 64 M de memoria, pero cuando cambié a la máquina del departamento de oncología con 486,8 M de memoria (no se rían todos), el La pila del sistema se desbordará inmediatamente, por lo que tengo que recurrir al método del puntero (mi nivel de programación parece haber mejorado nuevamente, secretamente feliz), el método es el siguiente:
Primero crea la clase titleprint:
titleprint=^Títuloregistro;
títulorecord=registro
Currect:Trect;
Título:cadena[50];
fin;
Luego cree el proceso printnow (el nombre del formulario es
zlk, printdot son los puntos de la impresora, generalmente 180);
procedimiento Tzlk.printnow(acanvas:Tcanvas);
var i,x,y,pc_count:entero;
myprint:matriz[0..200] de titleprint;
comenzar
primertop:=round(int(0.5/2.54*printdot));
primeraizquierda:=round(int(0.1/2.54*printdot));
altura de fila:=redondo(int(0.7/2.54*printdot));
x:=0+primera izquierda;y:=redondo(int
(1.3/2.54*printdot))+primertop;
recuento_pc:=0;
inc(pc_count); nuevo(miimpresión[pc_count]);
miimpresión[pc_count]^.currect:=rect
(x+redondo(int(0.1/2.54*printdot))+primeraizquierda,y,
x+ronda(int(3.0/2.54*printdot))+primeraizquierda,
y+primertop+ronda(int(0.5/2.54*printdot)));
miimpresión[pc_count]^.atitle:=Lname.
título+nombreBD.texto;
ACanvas.MoveTo(miimpresión[pc_count]^.
actual.izquierda,
miimpresión[pc_count]^.currect.top-round
(alto de fila/5));
{Las siguientes cuatro líneas se repetirán más de 100 veces, que es básicamente lo mismo.
No los escribo todos para ganar regalías}
inc(pc_count); nuevo(miimpresión[pc_count]);
miimpresión[pc_count]^.currect:=scalerect(
miimpresión[pc_count-1]^.currect,round(int
(2.5/2.54*printdot)),0);
miimpresión[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(miimpresión[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
.......
{Imprimir}
printtitle(acanvas);
{Esta función no se proporcionará, no importa si no necesita el encabezado}
para i:=1 a pc_count hacer
comenzar
RectDraw(Acanvas,myprint[i]^.atitle,
miimpresión[i]^.currect,false,
dt_left o dt_singleline o dt_vcenter);
fin;
disponer(miimpresión[pc_count]);
{No olvides liberar la memoria ocupada por el puntero}
fin;
---- Finalmente, cree un botón, agregue un juicio si realmente está impreso y luego llame a estas funciones.
---- (Formato de llamada: printtitle(printer.canvas);)
---- Después de leer los dos ejemplos anteriores, ¿crees que imprimir en WINDOWS es en realidad muy simple, como dibujar una tabla a mano, y si la posición del contenido de la tabla está centrada, izquierda o derecha depende completamente de la La alineación del contenido impreso. El formato de impresión está determinado por el formato de visualización del contenido. No es necesario que lo calcule usted mismo, lo cual es muy conveniente.