RealBasic University

このコラムはStone Table Softwareのオーナーであり、またREALbasic Developerの編集者でもあるMarc Zeedar氏により書かれたものを、著者の許可を得て翻訳したものです。この翻訳はHREM Researchにより提供されています。この日本語版へのご意見はRBU-Jまでご連絡下さい。

URL: http://www.applelinks.com/rbu/064/
INDEXに戻る

FontPrinter:パート 3

前回までに、様々なフォントの特殊文字をタイプするために特殊なキー配列のテーブルをプリントアウトするユーティリティであるFontPrinterの土台をほぼ構築し終えました。よって、今回は実際にどのように印刷するかを学習していきましょう。

プリント・メソッドを追加する

いったんコツをつかんでしまえば、REALbasicでの印刷は特に困難はありません。基本印刷はそれほど難しくありませんが、複数のページにわたる作業、様々なサイズの用紙の扱い、またその他の問題点がある場合はまさに複雑な事態になります。

印刷を取り扱うための基本ステップは次の通りです。

  1. ユーザのPage Setup設定を入手、あるいは復元する
  2. 標準のプリント・ダイアログを表示する
  3. 標準のREALbasicのグラフィック・コマンドを用いて、プリンターのgraphicsオブジェクトに書き出す

これらのうち始めのいくつかは難しいように見えますが、実際は極めて簡単です。標準のPage Setupダイアログは、用紙サイズ、ページの方向、縮小・拡大等を含むプリンターの様々な設定をユーザに選択させるものです。特定のプリンターに限って、独自の設定がいくつかあります。

ここで厄介なのが、これらの設定に直接アクセスすることができないということです。その理由は、あなた(REALbasicの内部)と、この情報を入手、設定する実際のMac OSのルーチンとの間に、情報を抽象化する階層が存在するからです。その翻訳階層は、異なるプリンターでは、設定が完全に異なるかもしれないので必要なものです。

幸いにも、REALbasicにはPage Setup情報の重要箇所にアクセスするための簡単な方法があります。またそれは、この情報を保存、復元する方法でもあります。REALbasicは、現在のプリンターの解像度、用紙サイズ、マージン等のような重要な属性を含むprinterSetupと呼ばれるオブジェクト(クラス)があります。用紙の方向のようないくつかの設定はアクセスできませんが、どのみちその情報をどう扱えばよいのか判らないと思うので、それでもよいでしょう。いずれにしても、Page Setupダイアログで設定されたすべての設定は、ユーザの指定を実際に処理するプリンター・ドライバーにただ渡されるだけです。

Window1を開き、新しいメソッド(Editメニューの"New Method")を加えましょう。それをpageSetupと命名してください。そこで次のコードを入力します。

   dim pageSetup as printerSetup 

pageSetup = new PrinterSetup
if gThePrintSettings <> "" then
pageSetup.SetupString = gThePrintSettings
end if

if pageSetup.pageSetupDialog then
gThePrintSettings = pageSetup.SetupString
end if

見た通り、それほど長くはありません。始めに、printerSetup型の変数pageSetupを定義します。pageSetupはオブジェクトなので、それにnewを付けなければなりません。

page setupデータは、文字列に保存されます。前回のレッスンではgThePrintSettingsと呼ばれる文字列変数を含むいくつかのグローバル属性を追加しました。そこに、Page Setupダイアログでユーザが作成したすべての設定を保存していきます。

よって次のステップは、gThePrintSettingsが何か持っているかどうか中身を確認することです。もし何か入っていれば、そのデータを.SetupString属性を経由してPage Setupダイアログに渡します。gThePrintSettingsが空であれば、初期設定が使用されます。

最後のif-then文では、ダイアログを表示しています。つまり、pageSetup.pageSetupDialogメソッドは標準のPage Setupダイアログを表示し、ユーザがOKをクリックすればtrueを、キャンセルを押せばfalseを返します。以上が初期の設定に係わるすべてです。

もしtrueならば、それがなんであろうと設定をgThePrintSettingsに保存します(REALbasicは新しい設定を.SetupString属性に入力します)。ダイアログがfalseを返せば、何もしません。

以上です!

ご承知の通り、Page Setup情報のフォーマットについてさえ何も知る必要がありません:REALbasicがあなたに代わって、保存、復元するためにそのデータを文字列に入力しますので、あなたはそれ以外は実際に何もする必要がありません。一度printerSetupオブジェクトを作成すれば、pageSetup.SetupString = gThePrintSettingsの一行が示すように、保存された設定をそこに入力することができます。

printerSetupオブジェクトの属性にアクセスするためには、いつも行っているように同様の"ドット(.)"記法を用いるだけです。上記で定義したpageSetupオブジェクトを使用するために、ここにいくつかのサンプル属性を示します。

pageSetup.pageHeight -- ピクセル単位で用紙の高さを返す(標準U.S.11インチ高用紙では792)
pageSetup.pageWidth -- ピクセル単位で用紙の幅を返す(標準U.S.8.5インチ幅用紙では612)
pageSetup.pageLeft -- ピクセル単位の左マージン(1インチはおよそ72)
pageSetup.pageTop -- ピクセル単位の上部マージン(1インチはおよそ72)
等。

例えば、これから印刷するものがユーザの用いる用紙にフィットしているかを確認するために、これらの情報を取り出すことができます(FontPrinterでは、ユーザが8.5インチ x 11インチの用紙を使用しているものとします――より詳しくはまた後ほど) 。

詳細

Page Setupダイアログさえも表示する必要がないことに注目してください:一旦あなたがいくつかのデータと共に設定されたprinterSetupオブジェクトをロードすれば、それでもう印刷の準備は整います。私はこれをZ-Writeというワープロで行っています。これはユーザ文書内にPage Setup設定情報を保存していますので、印刷する度にPage Setupダイアログを表示する必要がありません。(もちろん、設定の変更が必要ならば手動でPage Setupメニューコマンドを選択することができますが、変更が必要でないならばPage Setupは要求されません)

ところで文書の印刷についてはどうでしょうか?われわれは目的を達成しつつあります。Page Setupが一番始めに必要とされることから、まずそれを理解することが重要です。印刷ダイアログを開いたとき、ダイアログにprinterSetupオブジェクト(おそらく適切な設定情報と共に読み込まれている)に送らなければなりません。

printItと呼ばれるもう1つのメソッドを加え、次のコードを入力してください。

   dim g as graphics 
dim thePrinter as printerSetup

if gThePrintSettings = "" then
pageSetup
end if

if gThePrintSettings = "" then
return
end if

thePrinter = new PrinterSetup
thePrinter.setupString = gThePrintSettings

gPrintOkay = false

// 印刷プレビューを行うか?
if checkPreview.value then
p = newPicture(thePrinter.pageWidth, thePrinter.pageHeight, 8)
if p <> nil then
// 画像に書き出す
drawIt(p.graphics)

// 印刷をプレビューする
printPreview.showModal
else // p = nil = error
beep
msgBox "Sorry, there's not enough memory for print preview."
gPrintOkay = true
end if
else
gPrintOkay = true
end if

if gPrintOkay then
g = OpenPrinterDialog(thePrinter)
if g <> nil then
drawIt(g)
end if // g = nil
end if // gPrintOkay = true

いいですね。これは複雑そうに見えますが、実はそうではありません。始めにすることは、変数を定義し、それからgThePrintSettingsの中身があるかないか確認します。空であれば、ユーザがまだPage Setupダイアログで設定していないということなので、まず始めにそれを設定してもらいます。それにも関わらずまだ空である場合は、キャンセルボタンを押したことを意味し、印刷する意思がないこと(キャンセルしている)が明らかなので、returnコマンドでメソッドを終了します。

有効なgThePrintSettingsを一度手に入れれば、新しいthePrinter (printerSetupオブジェクト)を初期化し、gThePrintSettingsの中身をそれに割り当てます。これで印刷の準備はほぼ整いました。

FontPrinterの1つの特徴は、印刷プレビューウィンドウです:Mac OS Xではすでに組み込み機能(print-to-PDF機能を介して)があるので必要はないのですが、やはりあると便利な機能です。なぜでしょうか?なぜなら、プログラマーにとっては、多くの紙を無駄にせずにプリントルーチンをテストするのが簡単になるからです!

ユーザがチェックすれば、印刷する前に印刷ジョブをプレビューしたいことを示すcheckPreviewチェックボックスを設けています。それがチェックされていなければ、ただgPrintOkaytrueをセットし、実際に印刷を行う最後のif-then文にスキップします。

印刷プレビューを扱うには、印刷するものを保持するための一時的な画像を作成する必要があります。われわれはすでにpと呼ばれるグローバルな画像属性を定義しているので、それをnewPictureするだけです(それに十分なメモリー容量を確保します)。

それを行った後に、pnilでないことを確認するために再度チェックします――仮にnilならば、pを作成する十分なメモリーがないことを意味するので、ユーザに適切なエラーメッセージを示します。これを行うときに、gPrintOkaytrueをセットするので、もしユーザが希望しているならばプレビューなしで印刷することができることに注意しましょう(ユーザは印刷したくない場合にいつでも印刷ダイアログをキャンセルできます)。

コードの中盤――if p <> nil thenの後の部分――はメインの印刷プレビューの部分です。始めに、pgraphics属性の中に印刷物を描画することをdrawItメソッドに伝えます。次に、printPreviewウィンドウを表示します。

何か意見でも?この2つがどこにあるのかに関心があるんですね?あなたの言うとおり、それを作成するまでプログラムは実行できないので、それを次に行いましょう。

まず始めに、drawItと呼ばれる新しいメソッドを追加してください。それにg as graphicsのパラメータを与えます。今のところは、それを空欄にしておきます。

次に、ウィンドウを加えます(Fileメニューの"New Window")。それに次の設定を与えてください。

よろしいですね。これでFontPrinterはそれをコンパイルして実行できますが、まだ十分には機能しません。filePageSetupメニュー・ハンドラーに行き、次を入力してください。

 pageSetup 

この方法でプログラムは少なくとも何かするでしょう:あなたはPage Setupダイアログを立ち上げて、それに手を加えることができます!

申し訳ないですが、印刷プレビューは少し複雑なので、それは次回にとっておきましょう。

今週のチュートリアルの完全なREALbasicプロジェクト(リソースを含む)を手に入れたい場合は、ここからダウンロードしてください。

次週

FontPrinterへの印刷プレビュー機能の追加を完成します。

News

2002 キュービー賞受賞者の発表

毎年、REAL Software社はREALbasicのプログラマーにとってはオスカー賞に当たる"キュービー"賞を授与します。それは自薦、他薦を問わず誰でもノミネートすることができます。ここには素晴らしいプログラムがいくつかあるので、私はそれをよく見て勉強することをお勧めします(少なくとも、それはあなたがREALbasicで作ることのできる高水準のプログラムのよいお手本となります)。

ここに今年の受賞者を掲載します。

今年の唱道者:Erick Tejkowski氏
最後に、今年のREALbasic支持者たちのための特別なカテゴリーがあります。コミュニティーのために最も尽力した人、そして本当に素晴らしいツールとしてREALbasicをあらゆる場所に知らしめた人たちのための賞です。

ビジネス: Barcode Producer 制作 Intelli Innovations, Inc.
従来のビジネスアプリケーションやユーザーに利益をもたらす素材を作成するためのツール等のような、ある種の商用活動を行うための最良のツール。

クロス・プラットフォーム: Quick Pallet Maker 2 制作 SCA Mecanica
Mac、Mac OS XおよびWindowsで動作するベストなアプリケーション。

REALbasic開発ツール:UniHelp 制作 Electric Butterfly
プラグ・イン、クラス、モジュール、フレームワーク、前、後処理プログラムなどを含む、REALbasic開発者が仕事をする上で助けになるもの。

教育ソフト:A-OK! The Wings of Mercury  制作 You Are Go!
学習のためのソフトウェア(理想としては何か役立つもの)。

企業支援ソフト:Visual 3270  制作 Trizen Systems
事業ソフトウェア。ビッグ・アイロン、メインフレーム、レガシー・システム――大きな事業を行うための鍵を握るツール。

インターネット:AthenaIRC  制作 ChiperSoft Systems
インターネットのためのベストツール。 これはサーバーツールから、デコーダ、プレーヤ、テストツールまでやや広い分野で役に立つもの何でもです。それはIP(またはそれに関するもの)やある既存のプロトコルやフォーマットもそこに含まれます!

Mac OS X: MediaEdit 制作 Mien Software
Mac OS Xのための最良のアプリケーション。それはある特別のカテゴリーに分類される必要はなく、以前のMac OSにも対応します(そしてまた例のWindowsにも…)。

マルチメディア:Baytex Party! 制作 Baytex
オーディオ、ビジュアル、今後の動向に対しての重要なアプリケーション。

ユーティリティ:PrefsOverload 4.1.2  制作 Zik's Software 及び Passenger 制作MacinMind Software
とにかく役立つベストなアプリケーション。これもまた意図的に広範なものを含んでいます!それは役に立つものすべてを次から次へと世に送り出さねばならないからです。

REALbasic Developer創刊号を手に入れる最後のチャンス

その他のニュースは、もしまだ新刊のREALbasic Developerマガジンの定期購読を申し込みしていないなら、急いで申し込みをしてくださいというちょっとしたお知らせです。〔訳注:原文は2002年8月23日発行のものです〕

8月に申し込みされた印刷版の定期購読者には、創刊号(8/9月号)が9月に郵送されます。9月に申し込みされた人には、10月/11月号が最初に郵送されます。だから創刊号を見逃したくない場合は、今すぐ申し込みましょう!

Letters

今回のレターは、REALbasicの最新バージョンが安定しているかどうか疑問に思っているLenさんからです。(彼はRB4が現行バージョンの時にこれを送ってくれました。もちろん今はRB4.5が出ています。)

私はRB3.5.2からRB4にアップグレードしようと思っているので、RB4がどれくらい安定しているか調べていました。フォーラムではこのトピックについては取り上げていないようですが、私はこの場合「ニュースがないことはいいことだ」とは思えません。私はバージョン4が出たときに、editfieldに問題があるようなことを耳にしました。この問題はすでに解決されているのかどうか、そしてまたあなたのRB4に関する一般的な意見を教えてください。

よろしくお願いします。

Lenさん、アップグレードする価値があるかどうかは、REALbasicで何をするかで決まってきます。必要なプラグインが動作し、作成したプログラムが思ったとおりに機能し、その他のあなたのやりたいどんなことも3.52バージョンでできるならば、アップグレードは必要ないと思います。

一方で、REAL Software社はすべてのユーザに毎回アップグレードしてもらいたいと思っているのは確かでしょうが、実際にはREALbasicを時々使用する人や、ただ学習のために使用する人にとっては、6ヶ月ごとのアップグレードはあまりにも頻繁すぎるでしょう。(しかしプロのユーザにとっては、それは理想的なリリース・スケジュールです。)

ところが、毎回のREALbasicの新しいバージョンでは、バグが修正されて、あなたにとって必要かもしれない新機能が追加さています。例えば、RBの最新のバージョンでは、dictionaryクラスと正規表現が追加され、Mac OS Xでのサポートが強化され、またIDEインターフェースがさらに良くなりました。

あいにくにも、新しいバージョンは古いものと比べると若干動作が異なるので(それは進化の対価です)、最新のバージョンで動作させるためには、古いバージョンのプログラムに少し修正を加えなければなりません(一般的にいって、REAL Software社は古いバージョンとの互換性を保つためにとてもいい仕事をしています。私の意見では、AppleやCodeWarriorよりもはるかに優れています)。例えば、私はプログラムでRBのバグのために、複雑な次善策を使ってその問題を解決するのですが、RBの新しいバージョンではそのバグが修正されていることがしばしばあるので、その見苦しい代替コードをきれいに整理することができます。

また、REAL Software社が改良したものが裏目に出ることも時々あります。例えば、RB4を見てみれば、REAL Software社はMac OS Xでうまく動作するようにeditFieldコントロールを書き直しました。この修正は、以前のeditFieldが持っていた視覚的な問題を解決しましたが、その副作用として、新しいeditFieldは長文を入力するときに動作がおそくなることがあります。REAL Software社は、これはMac OS Xのバグで、Appleが修正する必要があると主張しますが、プログラムがeditFieldに依存する場合は依然として厄介な問題です。

安定性に関していえば、IDEのクラッシュについてなのか、あなたの作成するプログラムについてなのか、あなたの言いたい事がはっきり分かりません。私はそのどちらについても不満はありませんが、IDEはかなり頻繁に"unexpectedly quit(不意なクラッシュ)"をしてしまうことがあるのは認めます。しかし、私はいつもMac OS Xを使用しているので、IDEのクラッシュはその他のアプリケーションに影響を与えないので大きな問題ではありません。

私は新しいREALbasic 4.5を使用し始めました。1週間かそこらで、いくつかの新しい機能を取り上げるミニ・レビューを行いたいと思いますので、アップグレードする価値があるか参考にしてください。


RBU-Jの通知サービス!コラムが発表されるたびに日本語版REALbasic Universityのお知らせの emailがあなたに届きます。登録・削除は ここ から。

INDEXに戻る