장쑤성 우시중의약병원 컴퓨터실
보 위안
----우리 병원의 정보관리 시스템은 델파이 프로그래밍을 사용하고 있는데, 과목마다 요구하는 사항이 다르고, 보고서 양식도 다양해서 작성하기가 귀찮습니다. Delphi는 WINDOWS 플랫폼에서 실행되며, 인쇄는 DOS에서의 인쇄와 완전히 다르며, 특별한 요구 사항이 있는 약간 복잡한 보고서의 경우에는 Quick Report를 구현할 수 없습니다. 다음은 프로그래밍에서 접하게 되는 일반적인 보고서에 대한 몇 가지 구현 방법입니다.
---- 1. 어느 부서의 재정부에는 두꺼운 장부가 여러 개 있습니다. 우리 병원의 재정부에서는 수작업 장부를 없애기 위해 약품 창고 장부를 인쇄하자고 제안했습니다. 사무실.요청이 합리적이군요, 학장님도 그래야 한다고 하더군요. 재무부에서 제공한 획일적으로 인쇄되고 줄 간격이 3mm인 작은 빨간색과 녹색 카드를 보면서 나는 중국인의 절약의 미덕을 생각하지 않을 수 없었습니다. 각 약품은 한 번 이상 인쇄해야 하고, 표 한 줄도 누락되지 않는다는 점을 고려하면, 한방병원에는 약품 종류가 2,000여종이 넘으므로 이 보고서는 레이저 프린터로 인쇄해야 한다. 학장이 레이저 프린터 구입에 동의하도록 하는 방법은 또 다른 문제입니다. 어떻게 비용 없이 사무 자동화를 할 수 있을까요?) 프로그램을 구현한다는 아이디어는 기본적으로 인쇄 용지를 캔버스로 사용하여 그 위에 작은 직사각형을 그리는 것인데, 이는 구체적으로 다음 프로세스에 의해 구현됩니다. (양식 이름을 Ttzview로 지정)
먼저 프로그램에서 두 클래스를 정의합니다.
타이틀레코드=레코드
현재:Trect;
제목:문자열;
끝;
세부기록=기록
직선:Trect;
정렬:단어;
끝;
---- 다음 4가지 프로세스를 수립합니다.
---- RectDraw(Acanvas:Tcanvas;s:string;R:Tect;frame:boolean;position:word);
---- 이 과정은 직사각형을 그리는 데 사용되며 프레임은 선을 그릴지 여부를 결정합니다(물론 여기에서 그려야 합니다!).
----PRintinitit(firsttop,firstleft:integer);
---- 이 프로세스는 초기화에 사용됩니다. 초기화는 종이 위의 작은 직사각형 각각의 위치를 정의하는 것입니다.
---- printtitle(acanvas:Tcanvas);
----이 과정은 헤더의 문자가 항상 더 크기 때문에 헤더를 인쇄하는 것입니다.
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;첫 번째 페이지:integer);
----이 과정은 특정 내용을 인쇄하는 것입니다. 한 페이지가 40줄을 인쇄하는 것입니다. 즉, 한 페이지는 한 약만 인쇄할 수 있습니다.
---- printhj(acanvas:Tcanvas);
---- 이 과정이 합계를 출력하는 과정임을 한눈에 알 수 있어요!
---- Botton을 생성하고 printinitit, printtitle, printdetail 및 printhj의 네 가지 프로세스를 순서대로 호출하면 됩니다.
---- (호출 형식: printtitle(printer.canvas);)
---- 그런데, Qtz는 쿼리된 원장 데이터입니다. 생성 방법은 여기에서 논의하지 않습니다.
----구체적인 절차는 다음과 같습니다.
---- 이 프로그램은 delphi1, delphi3 버전 WIN3.2, WIN95, WIN97 및 WIN98 플랫폼에서 실행됩니다. 그런데 원장 데이터베이스의 라이브러리 구조를 제공합니다.
---- 2. 매우 복잡하고 이해하기 어려운 보고서
---- 우리 병원의 종양학과는 환자의 의료 기록을 인쇄해야 합니다. 이는 전문 분야 현대화의 일부이므로 보건국이 검사하러 올 것이므로 작업을 완료해야 합니다. 각 의료기록에는 100개 이상의 항목이 있습니다. Qreport를 사용하면 중간에 항목을 추가하거나 빼야 하는 경우(자주 발생하는 현상) 수십 개의 항목을 조정하고 배열하면 사람들이 당황하게 됩니다. 100개 이상의 임시 변수를 한 번에 생성하고 가상 캔버스에 그렸습니다. 64M 메모리가 있는 PII233 시스템에서는 원활하게 실행되었지만 메모리가 486.8M인 종양학과의 시스템으로 전환했을 때(모두 웃지 마세요) 시스템 스택이 즉시 오버플로되므로 포인터 방법을 사용해야 합니다(내 프로그래밍 수준이 다시 향상된 것 같습니다. 비밀리에 행복합니다). 방법은 다음과 같습니다.
먼저 titleprint 클래스를 만듭니다.
titleprint=^제목기록;
타이틀레코드=레코드
현재:Trect;
제목:문자열[50];
끝;
그런 다음 printnow 프로세스를 만듭니다(양식 이름은
zlk, printdot은 프린터의 도트이며 일반적으로 180입니다.
절차 Tzlk.printnow(acanvas:Tcanvas);
var i,x,y,pc_count:integer;
myprint:제목 인쇄의 배열[0..200];
시작하다
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*printdot))+firsttop;
pc_count:=0;
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.curdirect:=ret
(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:=L이름.
캡션+DB이름.text;
ACanvas.MoveTo(myprint[pc_count]^.
현재.왼쪽,
myprint[pc_count]^.curdirect.top-round
(행 높이/5));
{다음 네 줄은 100번 이상 반복되며 기본적으로 동일합니다.
나는 로열티를 벌기 위해 그것들을 모두 쓰지 않습니다}
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.currect:=scalelect(
myprint[pc_count-1]^.curdirect,round(int
(2.5/2.54*printdot)),0);
myprint[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(myprint[i]^.curdirect.right,
myprint[i]^.currect.top-round(rowheight/5));
.......
{인쇄}
printtitle(acanvas);
{해당 기능은 제공되지 않으므로 헤더가 필요하지 않아도 상관없습니다}
i:=1 ~ pc_count do의 경우
시작하다
RectDraw(Acanvas,myprint[i]^.atitle,
myprint[i]^.curdirect,false,
dt_left 또는 dt_singleline 또는 dt_vcenter);
끝;
dispose(myprint[pc_count]);
{포인터가 차지하는 메모리를 해제하는 것을 잊지 마세요}
끝;
---- 마지막으로 Botton을 생성하고, 실제로 인쇄되었는지 판단을 추가한 후 이들 함수를 호출합니다.
---- (호출 형식: printtitle(printer.canvas);)
---- 위의 두 가지 예를 읽은 후 WINDOWS에서 인쇄하는 것은 실제로 손으로 표를 그리는 것처럼 매우 간단하며 표 내용의 위치가 가운데에 있는지, 왼쪽에 있는지, 오른쪽에 있는지는 전적으로 인쇄에 달려 있다고 생각하십니까? 인쇄된 내용의 정렬 인쇄 형식은 내용의 표시 형식에 따라 결정되므로 직접 계산할 필요가 없으므로 매우 편리합니다.