Tech Note 22: PalmPrint/SCSPrintを使ってプリント
|
Contributed by Michael J. Verive, author of NS BASIC Programming for Palm OS
Palmデバイスに情報を保管することは素晴らしいことです。そしてHotSyncがそのデータをあなたのデスクトップコンピュータに転送してくれ、必要に応じてプリント作業を行なうでしょう。しかし、Palmデバイスからシリアルポート使ったり、IR機能付きのプリンターに、直接プリントすることが必要になるかもしれません。NS Basicは組込みのプリントルーチンを持っていませんので、現在可能なのは、シリアルI/Oファンクションを使うか、サードパーティのアプリケーション(SCSPrint、PalmPrint等:Stevens Creek Softwareから入手可能)を使う必要があります。NS BasicでPalmPrintを使ってプリントを行うのは、他のBasicを使ってプリントするのとはちょっと異なります。(SCSPrintを使ってプリントするのは、PalmPrintと同じコードを使いますので、ここではPalmPrintを使ってPalmPrintとSCSPrintの両方を意味します。)
NS BasicでPalmPrintにプリントする簡単な方法は、AppLaunchステートメントを使います。このステートメントのシンタックスを覚えるのは簡単なことではないので、以下のサブルーチンをアプリケーションんコードモジュールに入れると良いでしょう。
Sub PalmPrint(PrintString as String) Dim CardNo as Integer Dim LaunchCode as Integer Dim result as Integer CardNo=0 LaunchCode=32768 result=AppLaunch(CardNo,"PalmPrint",LaunchCode,PrintString) If result<>0 Then result=alert("PalmPrint","Error printing to PalmPrint",3,"OK") End If End Sub このコードモジュールをあなたのアプリケーションに入れた場合、PalmPrintへプリントする時は、フォームからでもオブジェクトからでも、このサブルーチンの名前とプリントする文字列を与えるだけです。
PalmPrint "This is the print string"
または
Call PalmPrint("This is the print string")
一行だけのテキストをプリントするにはこれで良いでしょう。しかし、ほとんどの場合、複数行か複数ページの情報を扱うでしょう。各行ごとにPalmPrintステートメントを使うと動作はしますが、よろしくない結果となります。各行は別々のページにプリントされます! PalmPrintサブルーチンは呼ばれる度に、PalmPrintを別々のプリントジョブとして実行させます。ですからPalmPrintは各ジョブごとにページを送ってしまいます。
複数行を同じページにプリントするには、プリントする文字列を全ての行がプリントされるように変更しなければなりません。さらに必要な時にプリンターに次の行に移るようにするためのコードも含めなければなりません。各行を繋ぎ合わせて1つの「プリント文字列」を作るとよいでしょう。プリント時の改行はフィールドで次の行へ行く方法と同じです。Chr(10)(ラインフィード)文字を使います。
Dim PrintString as string PrintString="This is the first line." PrintString=PrintString+chr(10)+"This is the next line." PrintString=PrintString+chr(10)+"and so on…" PalmPrint PrintString
PalmPrintは、行の最後にラインフィード、キャリッジリターン(ASCII code Chr(13))、または両方を選択できるようになっています。両方がある場合は、ほとんどのプリンターで問題なくプリントできますが、実際にお持ちのプリンターで確かめてみるとよいでしょう。PalmPrintは更に、幅広いプリンターから選ぶことができ、様々なフォント、サイズ、および他の設定に必要なコードをプリンターに送ります。
PalmPrintを使ってのプリントは、IR機能を持ったプリンターにプリントするのが簡単です。シリアルポートを通してのプリントは、少し複雑になります。あなたのアプリケーションの処理は特に変える必要はありませんが、PalmPrintとプリンターが同じボーレートとシリアルパラメータを使っていることを確認してください。また、Palmのシリアルポートを使って直接プリンターにプリントする場合、プリンターによっては"null modem"ケーブルかアダプターが必要になるかもしれません。
多くの異なったプリンターへのプリントを既に分かっているため、ほとんど場合、PalmPrintは買ってきた状態で問題なく動作します。実際、PalmPrintはプリンターに依存しないように作られていますので、一つのプリンターでプリントした結果は、そのまま他のプリンターでプリントした結果と同じか、ほぼそっくりになるでしょう。しかし、出力をボールド、ワイド、コンデンス、または他のフォーマットを使ってプリントする必要があるかもしれません。PalmPrintは特別な"エスケープ"コードを埋め込めるようにしてあるため、プリンターに出力フォーマットを簡単に伝えられます。特殊なフォーマットは必ずしも全てのプリンターで同じように動作しませんが、特定のプリンターに依存していない分、このフォーマットのパワーが理解できるでしょう。
フォーマットするコードは、"<<"と">>"に囲まれた1〜3桁の数値で、PalmPrintに送られる文字列に挿入されます。これらはASCII 171とASCII 187で、単なる2つの小なりと大なりではなく、Palmのポップアップキーボードの1部である、"Int'l"の右下コーナにある文字です。
多くのフォーマットコードは"ESC" (ASCII 27)文字を使い、プリンターにフォーマットコマンドが後に続くことを伝えます。"<<>>"文字列にいれるのは27だけになります。例えば、"ESC"W1はCanonのプリンターでは「2倍幅」に設定し、"ESC"W0で元に戻します。以下のコードは「2倍幅」の文字列に普通の文字列が続いたものをプリントをします。
Dim EscStart as byte Dim EscEnd as byte EscStart=chr(171) EscEnd=chr(187) Msg=EscStart+"27"+EscEnd+"W1This is double-wide" Msg=msg+chr(10)+EscStart+"27"+EscEnd+"W0And this is back to normal" PalmPrint Msg
また、PalmPrintは"<<>>"文字の間にある数値しか認識しないので、数値以外の文字列は無視されます。従って、文字列の中にコメントを入れることが可能です。
Msg="<<This text is double-wide>>"+EscStart+"27"+EscEnd+"W1 Profits 2nd Quarter" Msg=msg+chr(10)+"<<Back to normal>>"+EscStart+"27"+EscEnd+"W0Region: Northwest" PalmPrint Msg
いくつかのプリンターでは"<<>>"を使わないでESC文字を挿入することができます。
Dim EscChar as string EscChar=chr(27) Msg=EscChar +"W1 Profits 2nd Quarter" Msg=msg+chr(10)+EscChar +"W0Region: Northwest" PalmPrint Msg
このエスケープの使い方はプリンターによってことなります。しかし多くのプリンターはEpson、またはHPと互換性があるモードを使っており、EpsonかHewlett-Packardの標準コードが使えます。プリンターのマニュアルを参照してコードを確認してください。以下の表は、Epson互換機で使われている一般的なエスケープシークエンスとファンクションです。
Epsonプリンターの制御コード (Esc=chr(27)).
コード文字列 |
効果 |
Esc © |
プリンターをリセット |
Esc -1 |
下線を始める |
Esc -0 |
下線を終える |
Esc E |
強調文字(ボールド)を始める |
Esc F |
強調文字(ボールド)を終える |
Esc G |
ダブルストライク(2重抹消線)を始める |
Esc H |
ダブルストライク(2重抹消線)を終える |
Esc P |
10文字/インチ(pica)モード |
Esc M |
12文字/インチ(elite)モード |
chr(15) |
圧縮プリント |
Esc S0 |
スーパースクリプト(右肩文字)を始める |
Esc S1 |
サブスクリプト(右下文字)を始める |
Esc T |
スーパースクリプト/サブスクリプトを終える |
Esc W1 |
2倍幅モードを始める |
Esc W0 |
2倍幅モードを終える |
バージョン2.0からPalmPrintは、特定のプリンターに依存しないプリントフォーマットの別の方法も提供しています。これはちょっと複雑になり、多少のプリンター制御(例えば、プリンター特有のフォントの指定)を失いますが、どのプリンターを使うか特定できないときは、この方法が良いでしょう。
このフォーマット方法の秘密は、PalmPrintがAppLaunchステートメントの異なった起動コードを受けつけることです(例えば32768は、PalmPrintに文字列をプリントするようにさせるために使います)。
result=AppLaunch(CardNo,"PalmPrint",32768,PrintString)
以下の表はNS Basicで使える起動コード一覧です(他のコードもありますが、それらはポインターが必要になり、NS BasicのAppLauchステートメントでは利用できません)。
NS Basicで使えるPalmPrint起動コード
起動コード |
説明 |
32768 |
文字列をプリントし、終わったらページを取り除く |
32770 |
一連のプリントコマンドの始まりをマークする |
32774 |
一連のプリントコマンドの終わりをマークする |
32771 |
一連の送信コマンドの始まりをマークする |
32775 |
一連の送信コマンドの終わりをマークする |
32772 |
(32768のように終わりを入れないで)文字列をプリンターに送る |
32773 |
文字列を送信する |
32800 |
プリンターにフォームフィードを送る(ページを取り除く) |
32802 |
通常プリントを設定する |
32804 |
ボールドプリントを設定する |
32828 |
プリンターを縦向きモードに設定する (PCLとPostscriptのみ) |
32830 |
プリンターを横向きモードに設定する (PCLとPostscriptのみ) |
上記の表で示すように、プリント処理を始めさせ、必要なフォーマットコマンドを送り、32768の代わりに32772を使ってテキストをプリントし、プリント処理を終わらせるようにすることができます。以下の例では、上の例と同じレポートをプリントしてますが、エスケープシークエンスの代わりに起動コードを使っています。
result=AppLaunch(CardNo,"PalmPrint",32770,"") ' start print job result=AppLaunch(CardNo,"PalmPrint",32804,"") ' set bold result=AppLaunch(CardNo,"PalmPrint",32772,"Profits 2nd Quarter") result=AppLaunch(CardNo,"PalmPrint",32802,"") ' set default print result=AppLaunch(CardNo,"PalmPrint",32772," Region: Northwest") result=AppLaunch(CardNo,"PalmPrint",32774,"") ' end print job
気が付いたかもしれませんが、上記の表には文字送信を制御するコードがあります。PalmPrintでは、HyperTermのようなターミナルプログラムに出力を送ることができます。32771 (送信開始)、32773 (文字列送信)、32775 (送信終了)を使って、プリンターではなくシリアルプログラムに出力できます。おそらくnull-modemアダプターが必要になり、PalmPrintとあなたの受信アプリケーションが同じボーレートに設定されていることを確認してください。(PalmPrintの他のシリアルパラメータ:8 data bits, 1 stop bit, no parity, hardware flow control) PalmPrintでこの機能を使う場合は、ドキュメントで詳細を確認してください。
PalmPrintを使ってプリントするときの最後のポイント:プリント文字列に挿入するnull(chr(0))文字の送信を必要とするアプリケーションを扱うかもしれません。しかし、Palm OSはnull文字を文字列の終わりとして扱いますので、null文字を使うとnull文字以降は切り取られてしまいます。ですからnull文字が必要なときは、代わりにchr(255)を使ってください。PalmPrintがその文字を出力用にnull文字に変換してくれます(chr(255)はプリンターに送れないことになります)。
PalmPrintはとても柔軟なアプリケーションですので、ドキュメントを参考にし、www.stevenscreek.comから特定のプリンターがサポートされているか確認してください。PalmPrintを使うと、サポートされている以外のプリンターでも動作するかもしれませんが、デバッグが大変になるであろう互換性の問題のリスクもあります。