DEFINE FORMによる帳票印刷


このページはまだ作業中です

DOSからWindowsに移行する中で印刷部分が大変だと言う人がいます。

どこが大変なのかよくわかりません。 ARAGO for Windowsでは印刷部分をFORMという概念で処理します。 @...SAYのプログラムと比べてそれほど行数が増えるわけではないのですが、初めて作る印刷が罫線をふんだんに使った複雑なものではどのように動くのか理解できず、さじを投げるようです。



何事も基本からはじめましょう!

DOSでは印刷の概念は連続紙でそこに、@...SAYや?、 ??などを使いプリンタでの紙の頭だしをしたりしていました。 印刷ではスクリーンを文字の位置として25X80文字サイズのどこかに表示したりしています、この25行を超えるとスクロールされ最初の0,0の位置の文字は画面から消えていました。

Windowsには基本的にDOSのように無限にスクロールする画面という概念がありません。

あくまでPixl 0.0の位置からユーザーによって設定された最大の位置までにオブジェクトを表示します。そして印刷出力はこの画面を単に出力先をプリンターに切り替えているだけです。 あたりまえですが、出力されるプリンタの設定されている紙のサイズを超えると印刷できません。

Windows NT 4.0からプリンタの設定ダイアログのなかのプロパティの用紙サイズでユーザー定義サイズというのがありましたが、現在ここにはユーザー定義のが出てきません。

このユーザー定義サイズはドットプリンタでしかできません。 そりゃそうですよね。 Laser PrinterのTrayと無関係なサイズを指定されてもプリンタにとってはなんともできませんから。この部分は別項で説明します。



ではFORMで使えるオブジェクト

TEXT、LINE、CIRCLE、IMAGE、BOX、BARCODE、そしてWALLPAPERです。

TEXT、LINE、はサイズ、強調などのスタイル、方向、カラーなどを指定できます。

BOXはサイズ、強調などのスタイル、カラーなどを指定できます。

出力されるオブジェクトをグループ分けしたり、グラフを書いたりすることにも使えます。

CIRCLEはサイズ、線のスタイル、円にするか弧にするか、方向、カラーなどを指定できます。 これを使うことでパイグラフなどを書くこともできます。

IMAGEは.BMPファイルを指定した位置に指定するサイズで印字します。

WALLPAPERは壁紙として全体のバックとして印字されます。

BARCODEは指定するサイズで表示印刷されます。 渡されるデータがその規格に適合しないときは表示されません。 チェックサムなどの計算はそれぞれの規格どおりに計算されます。



実際にこれらのオブジェクトを使ったプログラムを作るときにはPANEL PAINTERで行ってください。 PANEL PAINTERを起動しオブジェクトの新規作成でFORMを選んでください。FORMがオープンされるとそれぞれのFORMオブジェクトが右のダイアログに表示されます。

SIZEが印刷する紙のサイズです。 INCHとMMがあります、連続用紙、ミリ単位以外の用紙ではINCHを使ってください。 連続用紙ではミリでは必ずずれます。

必要なオブジェクトを貼り付け、できるだけ正確な位置に直しセーブしてください。

外部でこのプログラムを直したとき、PANEL PAINTERで読み込めなくなることがあります。

MODIFY COMMANDでそのあとは修正します。



ではできたプログラムです。

これは長さ 1.5 Inch X 幅 4 Inchの連続用紙に住所ラベルを印字します。

最初にこのプログラムにはいたときに出力するデータがあるかを確認してください。

出力するデータを保存するDBFです。

フィールド名 フィールド型

CSTNUMBER 数値型 出力する顧客の番号。 これをもとに住所データがある顧客台帳         DBFから印字データを拾う。

INPUTDATE 日付型 入力日 入力された日付

OUTPUTDATE 日付型 出力日 印刷した日付



ここでは未出力分を印刷するとすると、 

DO WHILE ((.NOT. EOF()) .AND. OUTPUTDATE = { / / })で出力するデータ件数を確認

もしなければこのプログラムはRETURNで終了。 もちろん必要なメッセージを表示してください。

DEFINE FORM FORM2 ;  <-- この部分がFORMの定義です。
FROM 0.00, 0.00 TO 2.00, 6.21 ;
SIZE 1.5, 4.00 ; <-- この部分が用紙のサイズの定義です。
INCH;
TITLE "郵送ラベル印刷"; <-- この部分がプリンタステータスダイアログのドキュメント名として表示される部分の定義です。
FONT GOT12


PRINT FORM FORM2 <--ここで印刷ダイアログがオープンされる。

GO TOP
LOCATE FOR OUTPUTDATE = { / / }
DO WHILE ((.NOT. EOF()) .AND. OUTPUTDATE = { / / })
REPLACE OUTPUTDATE WITH DATE() <--ここで出力したことを保存
USER = USERNUMBER
IF FOUND()
SELE 1
IF SEEK(USER)
STORE AUTOMEM
DEFINE TEXT TEXT1 OF FORM2 ;
At 0.2, 0.2;
PROMPT "〒" + M->NEWZIP;
FONT GOT12

DEFINE TEXT TEXT2 OF FORM2 ;
At 0.4, 0.2 ;
PROMPT RTRIM(M->NEWADDRES1) + M->NEWADDRES2 ;
FONT GOT12


DEFINE TEXT TEXT3 OF FORM2 ;
At 0.6, 0.2 ;
PROMPT M->COMPANY;
FONT GOT12

DEFINE TEXT TEXT4 OF FORM2 ;
At 0.8, 0.2 ;
PROMPT M->SECTION;
FONT GOT12

DEFINE TEXT TEXT5 OF FORM2 ;
At 1.0, 0.2 ;
PROMPT RTRIM(M->NAME) + "様" + " " + "USER # "+  LTRIM(STR(M->USERNUMBER));
FONT GOT12

DEFINE BARCODE BARCODE1 OF FORM2 ;
AT 1.3, 0.2 ;
HEIGHT 3.606 ; <--このサイズが郵政省の規格に適合するかは未確認
BAR WIDTH 0.601 ;
TYPE "FOURSTATE" ;
DATA M->NEWZIP

PRINT FORM  <--ここで一ページ分を出力、 これを繰り返す
ELSE
? "never happen" <--ここへくることはありえないはず! でも必ずトラップすること!
ENDIF
ENDIF
SELECT 2
CONTINUE
ENDDO

PRINT FORM END <-- プリントを終了します

//おまけですが何枚出力したかを表示。
DEFINE TEXT TEXT3 OF PMAIL1 ;
AT 80.0, 300.0 ;
PROMPT "件を出力しました";
FONT MIN10



この後オブジェクトとFORMのRELESEをすること







印刷帳票のユーザー定義サイズの方法 (User defined size)



Windows NT 3.51まではプリンタダイアログの用紙の設定でユーザー定義サイズがありましたが、 NT4.0からこの部分がなくなりました。 では連続用紙にどうやって印字するのでしょうか? もちろん宅急便専用みたいなプリンタでは最初からそれぞれのサイズがありますのでそこから選べばいいのですが、 安いプリンタではA4、A5...と大して種類がありません。



ここで説明するのは、ここで使っているOKI 590です。 これはよくアメリカ系の会社が複数コピーが必要なときに使っているプリンタです。 特徴は安い! 後方、上部、下部の三箇所からトラクタで用紙を選択して送れます。 アメリカではずいぶん安いようです。



ただこのML590のWindows用のドライバーはほとんどごみです! 使えません! OKIDATAのサポートはMSに文句を言えといいますが、まあこんな人間に聞くほうが馬鹿なのでしょう。 OKIDATA推奨のEPSON LQ1000のドライバを使用しています。

Windows 2000からはプリンタドライバが日本版以外も標準になっていますのでそこから選べます。 いまさらFDDを使うこともありません。 またここまで枯れすぎたドライバですから、Webからダウンロードしても多分見つからないでしょう。



プリンタドライバの基礎知識

UNIDRV.SYSと 定義ファイルの二つに分かれています。 oemsetup.infの書き方はDDKをインストールすると説明が出てきます。 英語が読めて一日あれば十分理解できると思います。



で具体的にはどうするのか?



まず スタートメニュの設定からプリンタを選ぶと、追加のアイコンがありますのでここからLQ1000をローカルにインストールします。そこでLQ1000にフォーカスをあわせ、色が変わりましたね。 そこでファイルメニュの中のサーバのプロパティをクリックします。

用紙の説明の下に新しい用紙を作成するというチェックボックスがありますからこれをクリックしてください。 連続用紙はインチですからヤードポンド法を選ぶとすべてのサイズの単位がインチになります。 ここで使いたい用紙サイズをインチで入力します。 設定する値は幅と高さです。 余白は設定する必要がありません。 ここで最後にこのプリンタの名前を決めます。 用紙の説明の右にあるエントリフィールドに好きな名前を入れてください。

あとは実際に印刷するときに出てくるプリンタダイアログで用紙の設定で(Windows2000では詳細設定の中)で今設定した用紙を選択すればそれでそのサイズの用紙に連続して打つことができます。

このユーザー定義サイズが有効なプリンタはあくまでドットプリンタです。 ページプリンタでどうなるかは知りません。

なおこのLQ1000とOKI ML590の組み合わせでは少し不思議なことがおきます。

最初にディフォルトのA4か何かに出力した後でないと、ユーザー定義サイズの用紙にプリントを開始しません。 多分誰かがどこかで間違えているのでしょうが、安いプリンタですから、この儀式も我慢してください。 ひょっとしたら別のドライバを選択するとこんなことはないかもしれません。

OKIDATAのドライバを使うと、どこかで計算を間違えているようで、途中から、印字できなくなります。 印字がおかしければ、ドライバを変えてみてください。



このプリンタサーバとは前に出てきた定義ファイルのことだと思います。そこに新規追加するわけです。