Tech Note 22: PalmPrint/SCSPrintを使ってプリント

Sep 17, 2003

© NSB Corporation. All rights reserved.

[英語版]  

Contributed by Michael J. Verive, author of NS BASIC Programming for Palm OS

PalmPrint/SCSPrintを使ってNS Basicからプリント

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倍幅モードを終える

アドバンス プリンティング - AppLaunchとLaunchコードを使う

バージョン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を使うと、サポートされている以外のプリンターでも動作するかもしれませんが、デバッグが大変になるであろう互換性の問題のリスクもあります。

Non-IRDAプリンターを無線で使用する

Photologicは、IRDA信号を受け標準プリンターへ印刷するためのブラックボックスを販売しています。詳細はこちら(英語)