RealBasic University

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

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

FontPrinter:パート 2

前回のレッスンでは、利用可能なフォントをプリントアウトするための簡単なプログラムであるFontPrinterの作成を開始しました。このプロジェクトでは、他のプログラムで使えるプリント・プレビューのシステムを作成するのと同時に、REALbasicでのプリントについても学んでいきます。

About Boxを作成する

これからプロジェクトを開始するにあたり、プログラムにAbout Boxを作成しましょう。そのためにはいくつか新しいファイルが必要なので、まずはこのファイルをダウンロードしてください。

アーカイブに含まれているファイルは、カーソル・リソースのfingerCursor、そしてRBUロゴのグラフィックであるrbulogo.pctです。また前回のプロジェクトで使用したhotCanvasClassと呼ばれるクラスもあります。それは、ユーザがURLのリンクをクリックしたときに、そのURLへジャンプする機能を持つURL属性を含んだcanvasサブクラスです。

グラフィックとカーソルを"Linked Resources"フォルダー(プロジェクト・フォルダーの中)に置いて、それからそれをプロジェクトへドラッグしてください。hotCanvasClassはどこに置いても構いません。いったんプロジェクト・ウィンドウにドラッグしてしまえば、それはプロジェクトに埋め込まれます。他のプロジェクトにも使いたいときは、探しやすい場所にオリジナルを置いておくのがよいでしょう。

それでは、About Boxウィンドウ(Fileメニューの"New Window")を追加しましょう。それに次の設定をしてください。

このウィンドウでは、いくつかの項目が必要になります:3つのstaticTextコントロール、1つのcanvas、2つのhotCanvasClass項目(これはプロジェクト・ウィンドウから)をドラッグしてください。

そしてcanvasコントロールに次の設定をしてください。

それからstaticText1を選択し、それに次の設定をしてください(大きなテキストは"FontPrinter"と書いてあります)。

StaticText2は次のように設定しなければいけません。

staticText2のテキストはこのようになっています(URLの行は空欄にしてあります)。

Copyright ゥ2002 by REALbasic University. All Rights Reserved.
Free, non-commercial distribution is permitted.
REALbasic University Website:
REALbasic Developer Magazine:

最後にstaticText3には次の設定をしてください。

完成したAbout Boxウィンドウは次のようになっているでしょうか。

2つのhotCanvasClassオブジェクトをウィンドウに置いたことを思い出してください(about textの右側にある四角形のことです)。上側のものはrbuCanvas、そして下側のものはrbdCanvasと名前をつけましょう。

これでグラフィカル・インターフェースの部分は完成しました。それではこれからコードを加えていきましょう。

まず始めに、初期設定が必要です。aboutWindowOpenイベントにいき、次の文を加えてください。

   rbdCanvas.url = "http://www.rbdeveloper.com/" 
rbuCanvas.url = "http://www.applelinks.com/rbu/"  

それから、keyDownイベントとmouseDownイベントの両方に、次を加えてください。

 self.close 

これでRBUのロゴと似た方法で、Adobe Photoshopのようなグラフィックソフトを使ってFontPrinterの"ロゴ"を作成し、それをプログラムに導入することもできます。しかし今回のケースでは、作成を急いでいたので、少しだけのテキストのためにPhotoshopを使う気がしませんでした。かといって、木炭画調などに書れたプログラム名は本当にうんざりします。

だから、ただ大きいサイズのstaticTextを使い、FrenchScriptのようにフォントを見栄えのよいものに設定するのはどうでしょう?

ただその方法の問題点は、ユーザがFrenchScriptをインストールしていない可能性があることですが、それに関しては次のような簡単な次善策があります。それは、使用したいフォントがインストールされているかどうかをチェックすればいいだけです。

aboutWindowにメソッドを加えましょう(Editメニューの"New Method")。それに次の設定をしてください。

いいですね。それでは次にこのコードを入力してください。

   dim i,n as integer 

n = FontCount-1
for i = 0 to n
if Font(i) = fontName then
return true
end if
next

またこれも簡単なコードです。ここで行っていることは、インストールされているすべてのフォントを探索しつつ、目当てのものがインストールされているか確認していきます。もし存在するのであれば、trueを返します。

このコードと全く同じものが、REALbasicのオンライン・ヘルプから入手することができます(フォーマットは少しだけ違いますが)。RBのサンプルコードでは、メソッドの最後に"return false"を加えています。実際には、メソッドはデフォルトでfalseを返すので、それは必要ありません(それ以前に明示的にreturn trueを返していないときには、メソッドは最後にfalseを返します)。

いったんこのメソッドを書いてしまえば、後はそれが使用できます。staticText1Openイベントにいって、次のコードを入力してください。

   if fontAvailable("FrenchScript") then 
me.textFont = "FrenchScript"
me.textSize = 60
elseif fontAvailable("Sand") then
me.textFont = "Sand"
elseif fontAvailable("Gadget") then
me.textFont = "Gadget"
else
me.textFont = "System"
end if

これがどのように動くか分りますよね?これはフォントがインストールされているかどうかをチェックします。もしインストールされていればそれを使用しますが、なければ他のフォントを探し始めます。このコードを好きなように変更して、より多くのフォントを見つけるようにしたり、あなた好みのフォントになるようにフォントの名称を変更したりしてください。

それからAbout Boxをアクティブにするためにあと1つすることがあります。Window1をオープンして、AppleAboutメニュー・ハンドラーに行き、次の一行を加えてください。

 aboutWindow.showModal 

これで完璧です!プログラムを実行してみて、Appleメニュー(Mac OS Xではappメニュー)から"About FontPrinter"を選択してください。About Boxは次のように動作します。まずホット・リンクのURLの上にマウス・カーソルを置いたとき、それが指差しマークのカーソルに変わります(そこでクリックすればウェブ・ブラウザーを立ち上げ、そのURLにジャンプします)。シンプルな機能ですが、簡単に出来て使いやすいものです。

グローバル変数を加える

About Box内の項目の1つに、"#kversion"のテキストが含まれているstaticTextの項目があることに気がついたでしょう。そしてプログラムを実行すると、それは"kversion"として表示されます――これは一体なんでしょうか?

メニュー項目のテキストあるいはstaticTextのテキストの前に、ナンバー記号(#)を付けると、REALbasicに定数を使用していることを伝えます。FontPrinterの場合では、kversionと呼ばれる定数をまだ定義していないので、ただそのテキストが表示されます。それでは次にそれを定義しましょう。

新しいモジュール(Fileメニューの"New Module")を追加し、それをglobalsModuleと命名しましょう。その中に(それをダブル・クリックして開いてください)、kversionと呼ばれる新しい定数(Editメニューの"New Constant")を追加し、それに"1.0"の値を入力します(もちろん引用符(")は要りません)。これでアプリケーションのバージョンを表します。

それから、以下のグローバル属性(変数)をglobalsModuleに追加します。

最後に、初期化ルーチンをプログラムに追加しましょう。私が最初にFontPrinterを書いたときは、各々のキー入力に対して、特殊文字を分りやすいように"ハード・コーディング"〔直接プログラムに定数を書き込む〕していました。しかし、REALbasic UniversityFontPrinterを公開する準備しているときに、私はすぐに、特殊文字はテキストとしてウェブ・ブラウザーに表示されないということに気が付きました。

そのために、私は特殊文字のテキスト文字列を含む特別なリソース・ファイルを用意しました。それはResEditでは次のように見えます。

ここからそのファイルをダウンロードしてください。それを"Linked Resources"フォルダーに置いて、プロジェクト・ウィンドウにドラッグしてください。

それからglobalsModule内に新しいメソッド(Editメニューの"New Method")を作成してください。それを"init" (パラメータはありません)と呼ぶことにして、そこに次のコードを加えてください。

   dim i as integer 
dim res as resourceFork

res = app.resourceFork

if res <> nil then
for i = 1 to 4
gTheString(i) = res.GetResource("TEXT", 999 + i)
next
end if

ここでしているのは、FontPrinterアプリケーションのリソース・フォーク(resource fork)を読み込んで、gTheString配列へそれら4つの文字列を取り込むだけです。プリント・ルーチンは適したフォントで文字を印刷するために、後でその文字列を使用します。

さて、さらに1つの作業が残っています。Window1Openイベントにいき、次を挿入してください。

 init 

これはFontPrinterが始めて実行されるときに、initを実行(呼び出し)します。gTheStringはグローバル属性で、一度適当なテキストで満たされれば、それはずっとそのままになることから、これは一度だけ実行すれば十分です。

それでは、今回のレッスンはここまでにしましょう。次回のレッスンでは、REALbasicでのプリントについて学習しましょう。

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

次週

プリントについて学習します!

Letters

今回はコントロール配列に関する質問をしてくれたToddさんからの手紙を紹介します

(ここで前回までの復習をすると、control配列はコントロールの配列です。分りやすく言えば、それはa(1), a(2), a(3)…のような配列ですが、それぞれの要素には文字列あるいは整数が入っているのではなく、コントロール[editFieldstaticTextcheckBoxpushButtonなど]が入っています。これはたくさんのコントロールをプログラム的に扱うのに便利です。例えばRBU Pyramidでは、canvasコントロールのサブクラスであるトランプカードをプログラム的に作成、操作するために、われわれはコントロール配列を使用しました。)

Marcさん、はじめまして。

REALbasicとあなたのすばらしいサイトを見つけるまで、私の作成したプログラムの中でいちばん複雑だったものはVCRでした。そしてついに、私はいままでずっと作ろうと心に抱いていたソフトウェアを実際に作る段階に来たと感じましたが、商用的に売られている他のプログラムがあまりにも私の目的に適していました。

私はやってみたいプロジェクトのアイデアがあります。そのアイデアとは、インターフェース要素のコントロールを、ウィンドウに動的に配置したり、あるいはそこから動的に削除したりすることです。コントロール配列の使用がおそらく理にかなっていることだと気づきましたが、その使用に関してはいくつか質問があります。例えば、私はアクティブ・ウィンドウ上で開いたコントロールのコピーがいくつあるか割り出すために、"ubound"を試してみました。しかしREALbasicは、例えばeditField(0), editField(1), editField(2)…等を使用しているにもかかわらず「"editField()"は配列ではありません」と苦情をいってきます。コントロール配列の"ubound"を使用するために、そのコントロールがどれくらい存在するかを決定する方法はありますか?

そしてまた、私は次のことについて教えていただければと思います。どのようにすれば、コントロール配列に新しいコントロールを追加して、インターフェース・エディタを使わないでプログラム的にウィンドウに配置することができますか?もっと具体的に言うと、私はウィンドウにeditFieldを動的に作成、配置する方法を模索しています。

質問にお答えいただければ幸いです。それができれば、私のプログラムの効率はもっと上がると思います。

Todd Janiak
ミシガン州キャデラック市

Toddさん、とてもいい質問ですね!

簡単に答えてしまうと、答えは"ノー"です――コントロールではuBoundを使うことはできません。だからといって、それは大した問題にはなりません。コントロール配列を作成するには2つの方法があります:IDEでコントロールをウィンドウにドラッグして、それに次のようにindexを与えます(indexはゼロです):

あるいはコードにより今あるコントロールを複製することによって、それをプログラム的に行うこともできます。

IDEでそれを行うときは、いままでどれだけの項目を作成してきたかすでに知っているので、uBoundは必要ありません。プログラム的にそれを行うときは、どれだけ作成してきたかを簡単に追跡する必要があります。いちばん簡単な方法は、それを配列に入れてしまうことです(グローバルあるいは特定のウィンドウのどちらか)。

例を挙げれば、ここに私がデモ用に書いた簡単なプログラムがあります。ウィンドウにはActionイベント内に次のコードを持つpushButton1、それから複製するための1つのstaticText項目(そのindexはゼロにセットされているので、それはコントロール配列でstaticTextArrayと呼びます)があります。window1では、属性としてs(10) as staticTextと定義しました。

   dim i, x as integer 

x = me.top + me.height + 8
for i = 1 to 10
s(i) = new staticTextArray
s(i).top = x
s(i).left = me.left
s(i).text = "This is static # " + str(i)
x = x + s(i).height + 8
next // i
 

プログラムを見れば判るように、pushButtonを押すと、10のstaticTextコントロールを作成します。new staticTextArrayを呼び出す度に、新しいコントロールが作成されて、その内容はs()配列に蓄えられます。それによって後々それを自由に扱うことが可能になります。つまり望みのところに動かしたり、配置したり、また表示するテキストを変化させたりできます。

すでにわれわれの配列にコントロールを設定してあるので、サイズを把握するためには難なくuBoundを使用できます。ここに私がstaticTextArrayオブジェクトのmouseDownイベントに入力したコードを掲載します。

 msgBox "Control # " + str(index) + " out of " + str(uBound(s)) 

staticTextコントロールのどこをクリックしても、コントロールの番号とコントロールの総数を示すダイアログを表示します。

(このようにする代わりに、コントロールを新たに作成する度ごとに、増加する特別なカウンター変数を作成する方法もあるでしょう。すなわちgNumControls = gNumControls + 1とします)

もちろん私は、この例においてはstaticTextコントロールを使用しましたが、これはeditField、canvas等のどんなコントロールでもうまく動作します。ただしなければならないことは、コピーしてくるソース・オブジェクトと、コントロール配列の属性を変更するだけです。

この用例の完全なプロジェクトが欲しい場合は、ここから手に入れてください。


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

INDEXに戻る