RealBasic University

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

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

FontPrinter:パート 1

まず始めに、最近のRBUの発表スケジュールが不規則なことについてお詫びいたします。休暇、旅行、少しの風邪、Macworld Expoのためのニューヨーク行き、そしてREALbasic Developerマガジン創刊号の発行と、近頃、私は一度に6つの問題を掛け持ちしていました。

幸いにも、いまは家に戻り、RBDとフリーランス活動に精力を注いでいますので、より規則的なスケジュールに戻りつつあります。次からの数週間は、私は遅れを取り戻す(休んだ週の埋め合わせ)ために週2回の投稿を予定しています。ではプログラムを始めましょう!

私はもともとは新しいREALbasic 4.5の簡単なレビューをする予定でしたが、私自身それをきちんと検討する時間を取れませんでした。だから代わりに、多くの人たちが興味を持っているREALbasicでの印刷について理解する簡単なシリーズを始めることにします。数週間内にRB 4.5のレビューを行おうと思います。

FontPrinterについて

FontPrinterは数年前に私自身が書いたアプリケーションです。グラフィック・デザインの仕事をしていて、ときどき私はとりわけ記号フォント(Zapf Dingbatsのような)について、さまざまな特殊記号を生成するキーボードの組み合わせを知る必要がありました。

以前はこれを行うユーティリティは色々とありました。KeyCapsはApple社の軟弱なプログラムですが、キーボードをスクリーンに表示し、どのキーの組み合わせがどのフォントを生成するか確かめることができました。しかしながら、Fifth Generation System社のキーボードのサイズをこちらで指定できるBigCapsと比べると機能的に不十分でした。KeyCapsでは、記号はとても小さく、ときに私はそれが何であるか区別が付かないことさえありました!悲しいことに、BigCapsはいくつかのOS改定前に消えてしまい、それに置き換わるものはいまだに出ていません。

フォントから文字サンプルを生成するサード・パーティのプログラムがありますが、これらは機能過剰なところがあり、お金もかかります。私はたくさんのプログラムをテストしましたが、私の思うように機能するプログラムは一つもありませんでした。だからある日、私はFontPrinterを書きあげ、それ以来、他のプログラムは調査していません。

FontPrinterの背後にある理念は単純です。ただフォントを選び、プリントするだけの機能で、オプションはほとんどありません。プリントする図表は、8.5×11インチの用紙にフィットし、キーボードからアクセスできるすべての記号を与えます。それはあまりにも単純なので、おそらくインターナショナル・キーボードもサポートしないでしょう。しかしそれはREALbasicで書かれているので、あなたの望むどんな状況でも扱えるよう、簡単に修正を加えることができます。

FontPrinterで何をしていくのか理解したところで、それで生成した出力のサンプル(Webdingsフォントを使用)を示します。

ここには4つの列があります。それぞれの列は異なる修飾キー(修飾キーなし(Normal)、Shift、Option、Shift-Option同時)でタイプされた文字に対応します。

それぞれの列の括弧内の文字は、そのキーの組み合わせで生成される通常文字(Helveticaで印刷)であり、選択されたフォントでの同じ文字(より大きく印刷されている)があとに続きます。大きな文字は、垂直方向のスペースを確保するためにずらして表示してあります。これで記号あるいは飾り文字を出力させ、さらに何がどの文字であるか確認することができます。文字はQWERTYキーボード〔訳注:キーボードの最上段の配列がq,w,e,r,t,yの順になっているもの〕のレイアウトと同じ順番になっていて、一段おきのグレーのラインは、シンボルを生成するために入力する文字を見やすくするためのものであることに注意してください。

したがって、例としてプッシュピンの飾り文字を生成したい場合、チャートからそれが4番目の列のd行にあることが判りますので、Shift-Option-dを押すことでそれが生成されるでしょう。

ところで上のスクリーン・ショットはFontPrinterのprint preview機能です。それはあなたのプログラム中でも使用できる適応性のある方法で、大量の用紙を消費することなくテスト・プリントをする優れた方法であることが判るでしょう。

プロジェクトを開始する

プロジェクトのための新しいフォルダーを作成することから始めましょう。それをFontPrinterと命名し、そのフォルダーの中にLinked Resources(プログラムで必要なグラフィックやその他を収納します)と呼ばれるフォルダーを置いてください。

REALbasicを立ち上げ、新しいプロジェクト(Fileメニューの"New")を開始し、次のように新しいプロジェクトをFontPrinter.rbとして保存してください。

さてWindow1を選択し、それに次の設定を与えてください。

次にウィンドウにいくつかの簡単なコントロールを加えていきます。それが次のようになるようにしてください。

当然ですがここまではそれほど複雑なことは何もありません。そしてコントロールの正確な位置合わせや設定はそれほど重要なものではありません。しかし、コントロールの名前は図からは明らかではありませんが、それに次のような名前を付けてください。

popupMenu = fontPopup
checkBox = checkPreview
pushButton = printButton

また最初にcheckPreviewがチェックされ、printButtonが無効であることを確認しておいて下さい。

Font Menuを加える

FontPrinterの主要なインターフェースはフォント・メニューです。これはREALbasicではばかばかしいほど簡単に作ることができます(このコードは実際にオンライン・ヘルプにあります)。次のコードをfontPopupOpenイベントに加えてください。

   dim i, n as integer 

n = fontCount - 1
for i = 0 to n
me.addRow font(i)
next

me.listIndex = 0

FontCountは、現在のシステムにどれだけのフォントがインストールされているか示す、整数値を返すREALbasicの組み込み関数です。font()関数はゼロから始まるので、FontCountから1を引けばループをゼロ(0)から始めることができます。仮にループをゼロから始めなかったとすると、フォント・メニューは1番始めにインストールされたフォントが見つけられないでしょう!またfontCountから1を引かなかったとすると、ループが1つ余計に行われることになるでしょう。すなわち、font()はインストールされたフォントと同数の項目しかなく、しかもゼロから始まるので、font(fontCount)は"out of bounds"エラーを起こします。

コードの最後のステップは、リスト中で1番始めのフォントを選択するためのものです。

これだけです!プログラムを実行してみてください。そうすればシステムにインストールされているすべてのフォント・リストを含むポップアップ・メニューが表示されるでしょう。その中からフォントを選択して取り出すことができます。とても素晴らしいですね。

課外学習:あなたが望むなら、このコードを含みFontMenuClassと呼ばれるpopupMenuのサブクラスを作成することができるでしょう。それから他のプログラムで使用するために、そのクラスをエキスポート(Finderにドラッグ)することができます。それはすぐに使えるフォント・メニューです!

メニューを加える

次に、いくつかのこまごまとした仕事に取り掛かって、プログラムにいくつかの標準メニューを加えましょう。始めに、Aboutメニューコマンドを加えてください。プロジェクトのMenu項目をダブル・クリックしてください。Apple Menuの空白の行で、"About FontPrinter..."とタイプし、リターンを押してください。メニュー項目の名前を"AppleAbout"(より短くてシンプル)と付け直してください。

それからFileメニューに次のような2つの項目を加えてください。

それらを適切な位置にドラッグして、セパレータ(項目のテキストとしてハイフン"-"をタイプし、リターンを押す)を加え、そしてQuit項目の上に置いたことに注意してください。私はまた、キーボードのショートカットとしてPrintコマンドに"P"を与えました(ページ設定は通常ショートカットを持っていません)。われわれはこれらのすべての項目にデフォルトの名前を使用します。

それが完了したら、それらにいくつかのmenu handlersを加えましょう(Menu handlersは、対応するメニュー項目がユーザに選択されたときに実行されることを除いてはメソッドのようなものです)。

Editメニューに行き、"New Menu Handler"を選択してください。そしてそれぞれのハンドラーに追加するために1つずつappleAboutfilePageSetupfilePrintを選択します。今は、これらのハンドラーを空欄にしておきましたが、それは何の問題も生じないでしょう――プログラムは動きますが、メニュー項目が選択されたときに何も起こらないだけです。

もちろん、いまプログラムを実行しても新しいメニュー項目のどれも利用できません。われわれはREALbasicにそれをアクティブにするよう伝えていないからです(初期設定ではそれらを利用不可にしています)。

EnableMenuItemsイベントへ行き、次のコードを加えてください。

   appleAbout.enabled = true 
filePageSetup.enabled = true
if fontPopup.text <> "" then
filePrint.enabled = true
printButton.enabled = true
else
printButton.enabled = false
end if

ここで行っていることに注意してください。まず始めに、常に利用可能(いつも有効)でなければならないappleAboutfilePageSetupをアクティブにします。印刷はいったんユーザがフォントを選択したときだけ利用可能になる(フォントが選択されていないのに印刷するのは意味がありません)ので、プリントメニューとプリントボタンはfontPopupがフォントをセットしていないときは無効にしておく必要があります(filePrintはデフォルトで無効なので、printButtonだけ手動で無効にする必要があることに注意してください)。

これでFontPrinterの骨子となるインターフェースの大部分が完成しました。次のレッスンでは、プログラムが実際の作業をするようコードを作成し始めましょう!

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

次週

FontPrinterのコーディングを開始します。

Letters

ここに、プログラムの学習の難しさについて、いくつかの素晴らしい質問をしてくれたBenさんからの手紙を掲載します。

Marcさんへ

私は、RB大学およびプログラムを学ぶ初心者を支援する試みに注がれているすべての努力を高く評価します。問題なのは、この種のサイトで見る95%のものは、まったく私にとって役に立たないということです。

まず私の紹介をさせてください。私は科学者で、ローテクの製造(太陽エネルギー装置の製造)を行っています。従業員と自身のために研究開発を行い、器具(顕微鏡、嚢胞性繊維症の治療器具など)を考案したり、修理をしています。

80年代初頭に、私は太陽エネルギー装置ビジネスを経営するために、AII〔訳注:Apple IIの略〕で5つのプログラムを書きました。それらは受注/注文書のプログラム、台帳プログラム(Quickenより古いものですが、いくつかの点でよりよいもの)、特定のアプリケーションの太陽エネルギーシステムの能力を計算するためのエンジニアリング・プログラム、太陽エネルギー設備の内部収益率を決定するための財務分析プログラム、そして最後に、屋根の角度や方向に基づいて光捕集器を真南に保つフレーム形状の算出のための計算プログラムを含みます。

われわれはこのようなプログラムをビジネスで広範に使用し、エンジニアやディーラーにプログラムを売りもしました。だから彼らは私を呼び出さないでもその場で計算を行うことができたのです。われわれの簿記係は、記帳を維持するために台帳プログラムを使用しました。

AIII〔訳注:Apple III〕が出たとき、私はすべてのプログラムをApple Business Basicに変換しました。太陽関連業は、いまはかなり廃れてしまいましたが、まだ私の書いたたくさんのソフトウェアが必要で、それを最近の言語で再び動くようにしようと思いました。

RealBasicに取り掛かってみると、構造がスパゲッティのように入り組んだ昔のコードとかなり違うので、学ぶのにはとっつきにくいです。私はまだ、構造体はこうこうこういうもので、こんな具合に働きますと記述されている一冊のチュートリアルにお目にかかったことがありません。だいたい3ページに、10,000フィートまで降下して行き、初心者向けだと主張している本がかなりあります。ナンセンスです!

私が新しいプログラム構造を学習するただ1つの方法は、例題によってです。私が見るたいていの例題は、かわいい画像をどこかに貼り付けそれをスクロールするゲームです(ゲームや遊ぶためのソフトウェアを書きたいと思わない人にとってはまったく役に立ちません)。私はここでことを荒立てようとしているのでなく、ただ私のように何か単純なできれば販売可能なビジネス・プログラムを作ろうとする人にとっては、そこには何も見るべきものがありません。

私は初めてRBでプログラムを書いてから、いまでは1年半になります。私にとって一般的なユーティリティは、受注/注文書のプログラムです。現在、85%は完成しています。私はここまで、クラッシュを繰り返し、偶然によって学び、そして勉強(Newberg?の本を持っています)をしながらやってきました。明らかに、これは片手間の仕事です。ここにはプログラム要員のスタッフは一人もいません。

最も単純なもののいくつかがカバーされていません。率直に言って、editfieldのすべてのイベント領域の用法は?コードの流れはどうなっているのですか?キー入力はどうやって取得するのですか?あちこちで入力/削除が可能なスプレッドシートのようなシンプルなテーブルはどのように作成しますか?非常に難しいです。数量、説明、価格、そして集計の列の計算はどのように行いますか?名前を読み込むためのファイルを開くにはどうしますか?特定のフォルダーへパスを指定して、毎回指示する必要のないようにするにはどうしますか?どのように印刷しますか?キャンバスの意味は何ですか?

イベント駆動プログラムのループは、気が狂いそうになります。私はプログラムがどこへ向かっているのか知る術がありません。いつこのキーが評価されるかを、どのように知ることができますか?デバッグでのブレークポイントもあまり役に立ちませんでした。

RBの癖のすべてはまた別の問題です。数値フォーマットはお粗末で単調でバグがあります。エラーメッセージは解説的ではありません。editfieldは正しく動作しません―editfieldから離れないカーソルがあります。などなど……。editfieldに数を挿入するすべての仕事は、それを数値としてフォーマット形式を合わせ、正しく位置合わせすることです。

私が以前に述べたように、このプログラムの完成まで約85%のところまで来ています。だから私はこれらの質問の多くに答えを持っています。しかし私はまだ自分がしていることについて十分な自信がありません。私は家からよろめきながら外に出て来た盲人のように感じますが、どうやってそこへたどり着いたかについては少しも憶えていません。

それでは、これを要約しましょう。簡単な例題は私が得たもっとも重要な方法です。私は、必要なものを詰め込んでおく場所である"Utilities"と呼んでいるフォルダーを作成しました。私がレファレンスをチェックするとき、説明はたいてい前後関係がばらばらで、私の頭の上をかすめて行きます。私はまだレファレンスの例からでは、editfieldでパラメータの長いリストをどのように実装したらよいのか考えが浮かびません。私はどこでどうやってコマンドが使用されるのか分かりません。私はすべてに目を通し、もし例題があればそれからすぐに取り掛かります。私はそれが動作するかどうか確かめます。違う傾向の5つの例題があればさらによいでしょう。私はまだ印刷するためのPage Setupコマンドが機能したためしがありません。1年半の後、始めた頃に比べて理解は深まりましたが、まだ部分的なものがごちゃ混ぜになっています。

私の切実な願いは、基礎や基本、小さな部分が学べるウェブサイトを誰か開設してくれないかということです。イベント駆動のプログラムはとても複雑です―それが簡単だと言うのはやめるべきです。アーキテクチャーを頭の中にしっかり据えていないと、完全に迷子になってしまいます。私は始めるのに数ヶ月かかりました。私はどの要素がプログラムを実行するのか知りませんでした。すべての組み込みのイベント・リストはとっつきにくいものでした。私は何のためにそれがあるのか分かりませんでした。

さて、私は繰り返して言います。心遣いありがとうございます。

Ben Gravely

Benさん、お手紙ありがとうございます。最近、私はこのテーマについて相当考えていました。そしてすぐには抜本的な変化は予定していませんが、指導方法をいくらか変えることを考えています。

私は現在2つの指導する場を持っています。それはREALbasic UniversityREALbasic Developerマガジンです。RBUは時折ほんの数時間前に書かれるウェブ・ベースの週刊のチュートリアルです。いっぽう、マガジンは数ヶ月前もって書かれます。それぞれの媒体の内容や指導スタイルを読者に合うように調整するのは私にとって重要なことです。(これに関する考えやアイデアがあったらなんでも知らせてください。)

私はどちらの出版物も重要で必要なものと固く信じています。そして、どちらもわずかばかり違う読者層(もちろん重複はあります)に届きます。もちろん、マガジンはたくさんの人によって書かれているので、より多様性に富み、私のほとんど知らないトピックをカバーしています。

RBUに対する私の最初の考えは、人々が使用することのできるプログラムをステップ・バイ・ステップで構築していく場所を設けるためでした。私は依然そのアイデアが気に入っていて、たいていのプログラムの概念はあるタイプのプログラムから別のタイプへ移行可能なので、プログラムを学習するよい方法だと考えています。例えば、あなたはわれわれが現在作成しているfont printerには興味ないかもしれませんが、このチュートリアルは、あなたが必要としているようなPage Setupコマンドがどのように働くのか教えてくれるでしょう。

しかしながら、より完全なプログラムは説明するのに長い時間(RBU Pyramidでは6ヵ月間かかりました)を必要としますので、私はそのようなものから少し軌道修正しようとしています。私は現在、3回か4回のレッスンでカバーできる実用的(例えば役に立つ)プログラムを探し求めています。

あなたが言うようにプログラミングは、たとえオブジェクト指向のプログラミングでさえも易しいものではありません。それは様々な点において従来のプログラミングよりは易しくなっています(特に従来のテクニックによって、あなたの気持ちが"悪影響"を受けない場合です;-)が、それはまだ大仕事です。私はプログラムの経験のない人がプログラムを学習するためになるよう最大限努力します――私はそれは人間のできる最高の思考術の一つだと思います――しかし同時に、REALbasicのような製品は扱いやすいですが、プログラムはステップ・バイ・ステップの調理法に従ってケーキを焼くようには簡単ではないことを忠告したいと思います。

あなたの述べる特定の事柄について見てみると、あなたは2つの異なるもものをもとめているのに気づくと思います。いっぽうでは、あなたは簡単な項目(キャンバスとは何か、のような)について助言を求め、しかしもういっぽうでは、あなたはスプレッドシートのコントロール(かなり難しい)についても求めています。

正直に言いましょう。ノン・グラフィックのユーザ・インターフェースの環境(例えばDOSの動いているPC)でプログラムを学んだ人にとって、ノン・グラフィックの環境がプログラムするのが分かりやすく、簡単な場合が多くあります!

プログラムには2つの部分があります。プログラムがユーザに見える方法(インターフェース)と、データがプログラムに見える方法(データ構造)です。たいていこれら2つは、完全に正反対です。それは人間はコンピュータのように考えることはできないし、その逆もまたそうであるというだけのことです。時間や日付のように物事を単純化してみましょう。コンピュータは、現在の時刻と日付を秒で表示するために15桁を使えればとてもハッピーです。人間に関しては、それを理解することは実際には不可能です。われわれは秒数をカレンダーの日付と時計の時間に変換する必要があります。

プログラムを複雑にする多くの要因は、コンピュータのデータを人間に理解できるフォーマットへの変換で、その逆もまた同様です。その上、扱いやすいユーザ・インターフェースを追加すれば、さらにまたプログラムが複雑になります。従来のシーケンシャル・プログラムを使い慣れているときに、イベント駆動のプログラムを導入すれば、本当に困った状態に陥ります。

例えば、あなたは数値の列を編集したり合計したりするスプレッドシートのようなものについて言及しました。

もちろん、REALbasicはそのようなものを行うことはできます。しかしそれに関してはビルト・インでサポートされていません。あなたは融通の利くlistBoxコントロールを用いて、スプレッドシートのように機能するようにそれをプログラムしなければなりません。それは可能ですが、簡単ではありません。そしてたくさんのテキスト―数値変換が必要とされます(listBoxesはテキストのみで機能するので)。それは実際にRBUのために良いプロジェクトのように思えます――将来のレッスンのために考慮しましょう。

実のところ、私は将来のコラムのアイデアを募集したいと思います。あなたはどんなタイプのプロジェクトをカバーして欲しいですか?できるだけ具体的に書いてください。ほとんどの人と同じように、私は実際の例題から最もよく学んでいます。そして役に立つアプリケーションでなお、2、3回のレッスンでカバーできる簡単なプロジェクトがあれば、それを取り上げたいと思います。あなたの提案をrbu@stonetablesoftware.comまで送ってください。


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

INDEXに戻る