江蘇省無錫中医薬病院コンピュータ室
袁伯
----当院の情報管理システムはDelphiプログラミングを採用しているため、科目ごとに要件が異なり、レポートの様式も多岐にわたるため、作成するのが大変です。 Delphi は WINDOWS プラットフォームで動作するため、クイック レポートの印刷は制御が難しく、特殊な要件を持つやや複雑なレポートの場合は実現できません。ここでは、プログラミングで遭遇する典型的なレポートの実装方法をいくつか紹介します。
---- 1. どの部門の財務部門にも分厚い台帳がいくつかあります。当院の財務部門は、手動台帳を廃止するために医薬品倉庫の台帳を印刷することを提案しました。事務局はその要求はもっともだ、学部長もそうあるべきだとも言われている。財務省から提供された、均一に印刷され、行間が 3 mm の小さな赤と緑のカードを見ていると、中国人の倹約の美徳を思わずにはいられませんでした。各薬剤を少なくとも 1 回印刷する必要があり、表の 1 行も欠けていないことを考慮すると、漢方薬病院には 2,000 種類以上の薬剤があるため、このレポートはレーザー プリンターで印刷する必要があります。学部長にレーザー プリンタの購入に同意してもらう方法については別の話ですが、オフィス オートメーションをコストなしで実現するにはどうすればよいでしょうか。)プログラムの実装の考え方は、基本的に、印刷用紙をキャンバスとして使用して、その上に小さな四角形を描画することです。これは、具体的には次のプロセスによって実装されます: (フォームの名前を Ttzview とします)。
まず、プログラム内で 2 つのクラスを定義します。
タイトルレコード=レコード
現在:トレクト;
タイトル:文字列;
終わり;
詳細レコード=レコード
アレクト:トレクト;
配置:単語;
終わり;
---- 以下の 4 つのプロセスを確立します。
---- RectDraw(Acanvas:Tcanvas;s:string;R:Trect;frame:boolean;position:word);
---- このプロセスは四角形を描画するために使用され、フレームは線を描画するかどうかを決定します (もちろんここで描画する必要があります)。
----PRintinitit(firsttop,firstleft:integer);
---- このプロセスは初期化に使用され、紙上の各小さな四角形の位置を定義します。
---- printtitle(acanvas:Tcanvas);
----ヘッダー内の文字は常に大きくなるため、このプロセスはヘッダーを印刷するためのものです。
---- printdetail(acanvas:Tcanvas;Qtz:Tdataset;acount:integer;firstpage:integer);
----このプロセスは、1 ページに 40 行を印刷するもので、足りない場合は 1 ページに 1 つの薬しか印刷できません。
---- printhj(acanvas:Tcanvas);
---- 合計を印刷する工程であることが一目で分かります!
---- ボットを作成し、printinitit、printtitle、printdetail、printhj の 4 つのプロセスを順番に呼び出すだけです。
---- (呼び出し形式: printtitle(printer.canvas);)
---- ちなみに、Qtz はクエリ対象の台帳データです。その生成方法についてはここでは説明しません。
----具体的な手順は以下の通りです
---- このプログラムは、delphi1、delphi3 バージョン WIN3.2、WIN95、WIN97、および WIN98 プラットフォームで実行されます。ちなみに、台帳データベースのライブラリ構造を提供します。
---- 2. 非常に複雑でわかりにくいレポート
---- 私たちの病院の腫瘍科では、専門分野の近代化の一環として患者の医療記録を印刷する必要があるため、この作業を完了する必要があります。 Qreport を使用すると、各診療録に 100 項目以上の項目があり、途中で項目を追加したり削除したりする必要がある場合 (これはよくあります)、数十項目の調整と配置に気が遠くなります。一度に 100 個以上の一時変数を作成し、仮想キャンバスに描画しました。64M メモリを搭載した PII233 マシンではスムーズに動作しましたが、486.8M メモリを搭載した腫瘍科のマシンに切り替えると (皆さん、笑わないでください)、システムスタックがすぐにオーバーフローしてしまうので、ポインタ方式に頼らざるを得ません(プログラミングのレベルがまた上がったようで、密かにうれしく思っています)。その方法は次のとおりです。
まず、titleprint クラスを作成します。
titleprint=^タイトルレコード;
タイトルレコード=レコード
現在:トレクト;
タイトル:文字列[50];
終わり;
次に、プロセス printnow を作成します (フォームの名前は
zlk、printdot はプリンタのドットで、通常は 180)。
プロシージャ Tzlk.printnow(acanvas:Tcanvas);
var i,x,y,pc_count:integer;
myprint:titleprint の配列[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]^.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。
キャプション+DB名.テキスト;
ACanvas.MoveTo(myprint[pc_count]^.
現在、左、
myprint[pc_count]^.currect.top-round
(行の高さ/5));
{次の 4 行は 100 回以上繰り返されますが、基本的には同じです。
すべて印税を稼ぐために書いているわけではありません}
inc(pc_count); new(myprint[pc_count]);
myprint[pc_count]^.currect:=scalerect(
myprint[pc_count-1]^.currect,round(int
(2.5/2.54*printdot)),0);
myprint[pc_count]^.atitle:=Lxb.caption+Cxb.text;
ACanvas.LineTo(myprint[i]^.currect.right,
myprint[i]^.currect.top-round(rowheight/5));
……
{印刷}
printtitle(acanvas);
{この機能は提供されません、ヘッダーは不要でも問題ありません}
for i:=1 から pc_count まで
始める
RectDraw(Acanvas,myprint[i]^.atitle,
myprint[i]^.currect,false,
dt_left または dt_singleline または dt_vcenter);
終わり;
destroy(myprint[pc_count]);
{ポインタが占有しているメモリを解放することを忘れないでください}
終わり;
---- 最後に、Bottonを作成し、本当に印刷されるかどうかの判定を追加して、これらの関数を呼び出します。
---- (呼び出し形式: printtitle(printer.canvas);)
---- 上記の 2 つの例を読んで、WINDOWS での印刷は実際には非常に簡単で、手で表を描くのと同じであり、表の内容の位置が中央、左、または右のいずれかに完全に依存すると思いますか?印刷されるコンテンツの配置は、コンテンツの表示形式によって決まります。これは、自分で計算する必要がなく、非常に便利です。