RealBasic University

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

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

内部の処理コード

我々のプログラムを少し拡張しましょう。これからプロジェクトにほんの少し-- ほんの数行 -- のプログラムコードをつけ加えて、プログラムに気の利いた機能を持たせましょう。この機能は「ホットヘルプ」と呼ばれます。「ホットヘルプ」は色々ありますが、基本的に オブジェクトを指し示したときに表示される情報のことです。

まず、最初にテキスト(StaticText)オブジェクトを付け加えましょう:ツールボックスから"A"のアイコンをプロジェクトウィンドウにドラッグします。それをウィンドウの最下部に置きましょう。オブジェクトの幅は充分でないので、右のハンドルのどちらかを クリックしてドラッグすることにより幅を広げるか、あるいはテキストオブジェクト選択して、属性Propertyウィンドウの"Width"欄を275に変えましょう。

次に、テキストオブジェクトを選択して、"Name"欄を"StaticText1"から"infoDisplay" に変えましょう(私はオブジェクトの名前を小文字で始めますが、気に入らなければ、そのようにする必要はありません)。テキストオブジェクトが選択された状態では、名前欄は次のようになっているでしょう:

(注意:オブジェクトの属性Propertyを変化させたときには、それはすぐに反映されます。例えば、名前の変更を確定するためにReturnを押す必要はありません。)

機能を追加するために、これから数行のコードを追加しましょう。REALbasicではどこにコードを入力するのでしょうか?こたえはスマートです(HyperCardに似ています):オブジェクトの内部 です!

オブジェクトの1つ、例えばEditField1を選択して、Option-Tab を押しましょう(Optionキーを押した状態で、Tabキーを押します)。すると次のようなウィンドウが現れるでしょう:

これは Window1のためのコードエディタです。左側にはオブジェクトの種類(Control、Event、Menu Handler、MethodおよびProperty)が表示されています。それぞれについては今後のコラムで説明しますが、今はコントロール(Controls)に注目します。 Window1に置かれた全てのインターフェイス要素はコントルールcontrolsですので、それぞれはコントロールセクションに現れているはずです。

(Finderでのファイルのリスト表示のように、それぞれのセクションは名前の横に小さな三角形disclosure triangleを持っています。 この三角形をクリックすることにより、セクションの中の項目を表示したり、隠したりすることができます。セクションの中のオブジェクトがその中に項目を持つこともあるでしょう-- そのような場合には、オブジェクトも小さな三角形を持つことになります。)

この例の場合には、EditField1のイベント としてKeyDown, GotFocus, LostFocus, SelChange, TextChange, MouseMove, MouseEnter, MouseExit, Open, Close, DropObjectが見えます。

イベントEventsとは基本的に言えばコントロールに発生するできごとです。REALbasicの独創的な点の1つはコードがオブジェクトの内部に包み込まれているだけでなく、オブジェクトそのもの(ウィンドウやコントロール)がそれぞれのコードを持つイベントで詰まっていることです。これにより、 あなたが特別に区別しなくても、 これは異なる種類のコードが分離されます。

例えば、以前のMacのプログラミングでは、プログラムには定期的にイベントをチェックするループがありました。ユーザがメニューをクリックしたか?ユーザがウィンドウをクリックしたか?マウスがあるコントロールの上にあるか?ユーザがキーボードを押したか?などなど...そして、それぞれの選択に対して、その選択を処理する特別なルーチンに制御を送っていたのです。

REALbasicでは、イベントは特定のオブジェクトに送られます。オブジェクトはそのオブジェクトに意味のないイベントを持つことはありません。例えば、ポップアップメニューはキー入力を受け付けないので、ポップアップメニューはキーの押し下げ(keydown)イベントを持つことはありません。

これらのことにより、プログラミングが非常に容易になります:処理をしなければならないイベントの中にだけコードを書けばいいのです。(イベントがしばしば「ハンドラhandler」と呼ばれる所以は、それらのコードは イベントを処理(handle)するからです。)

EditField1の場合、コードエディタを開くためにOption-Tabを押したときには、REALbasicは自動的にKeyDownイベントのハンドラを示します。KeyDownイベントは、ユーザが EditField1内で 何かをタイプするごとに発生します。もし、EditField2という2つめの文字入力欄があったとすると、EditField1EditField2への入力は受け取りません、同様にEditField2EditField1への入力を受け取りません。

我々はKeyDownハンドラへはコードを追加しません。我々はMouseEnterハンドラに関心があるのです。このため、左のEditField1セクションの下の方のMouseEnterイベントをクリックします。すると、右の欄が変わって、マウスカーソルがMouseEnterサブルーチンの中に現れるでしょう。

ここで漸くコードを書くところまで来ました!

カーソルがMouseEnterサブルーチンの中にある状態で"inf"とタイプしてみましょう-- 表示は次のように変わるはずです:

灰色の"oDisplay"に気が付きましたか?これはREALbasicの「自動補完autocomplete」機能の働いている状態です。あなたがオブジェクトの最初の数文字を入力すると、RBはあなたのために オブジェクトの名前の入力を完了しようとします。余分のテキストは実際にはそこに存在しないので 灰色です -- これは単にREALbasicの提案です。必要であれば、他の文字を入力することが可能です。あるいは、この提案が正しくて、RBにあとの入力をまかせたい場合には、Tabを押します。そうすると、完全な名前 "infoDisplay" が一様に(黒く)表示されます・

オブジェクトの属性の利用

我々はすでにHeightWidth などの属性(Property)を見たことがあります。属性はオブジェクトの設定なのですが、それらは実際には設定を保存するための入れ物です。EditField1の"width"属性は単に数値の保存場所です。やがて、あなたが定義したオブジェクトに属性(保存場所)を追加する方法を学ぶでしょう。

いま重要なことは 、どのようにしてオブジェクトの属性にアクセスするかということです。REALbasicでは、オブジェクト名.属性という非常に簡単な方法を使います。すなわち、オブジェクトの名前、ピリオド、そして属性の名前です。例えば、コードでEditField1.widthと書けば、RBはEditField1と呼ばれるコントロールの"width"属性に保存されている数値を返してくるでしょう。

今回、我々はinfoDisplayと呼ばれるテキストコントロールの"text" 属性の値を変化させたいのです。 代入命令(等号)の左辺に変化させたい属性を書くことにより、コンピュータに「右辺のものを左辺の入れ物に入れる」ように指示します。

コードは次のように書きましょう:

infoDisplay.text = "This is where you type."

ほら!あなたは コンピュータの言葉で「infoDisplayオブジェクトのtext属性に 'This is where you type.' という文章を代入する」ということを書いたのです。 text属性は文字列stringだけしか受け付けないということに注意して下さい。ここで、文字列というのは、ひと続き(string)の文字である、テキストを現すプログラム特有の表現です。文字列は数字を保持することもできますが、1つの数字は文字を表すことはできません。二重引用符(double-quotes)で文章を囲むことにより、それが文字列であるとREALbasicに知らせます。

もし

infoDisplay.text = This is where you type.

あるいは

infoDisplay.text = 4586

のように書いたとすると、そのプログラムを実行しようとしたときに、REALbasicは構文エラーsyntax errorを知らせてきます。(構文エラーとはコンピュータがあなたが何をしようとしているのかを理解できないということです;コンピュータはあまりにも気難しいので、あなたがコンピュータが期待している形式で 正確になにかを与えなければ、コンピュータはなにも理解しないということをのぞけば、これは 言葉の文法上の誤りとよく似ています。)

我々のこのコードをまたどこかで使いますので、これを選択してクリップボードにコピーしておきましょう(Command-Aで全体を選択し、Command-Cでコピーします)。

次に、コードエディタの左の欄のCheckBox1の小さな三角形をクリックしましょう。我々はCheckBox1の中のイベントを見えるようにしたいのです。MouseEnterイベントを見つけて、そのなかにコードをペースト(貼り付け)しましょう。 このコードは文字入力欄のヘルプの文章ですので、チェックボックスコントロールに合うように次のように編集します:

infoDisplay.text = "This is a checkbox."

素晴らしい!では、次にPushButton1のMouseEnterイベントを見つけて、そして同じことを行ないます。次のように変更して下さい:

infoDisplay.text = "This is a push button."

では、次は何でしょう?これで終わりです!まず、プログラムを保存(Command-Sあるいはファイルメニューの保存(Save))しましょう。それから、プログラムを実行(Command-Rあるいはデバッグ(Debug)メニューの実行(Run))します、そしてプログラムがどうなるか見てみましょう。 プッシュボタン、文字入力欄、チュックボックスの上へ矢印カーソルを持っていってみましょう。 ウィンドウの下のテキストが変化するのが判りますか?素晴らしいですね?あなたはプログラムにホットヘルプを付けたのです!ほとんど、苦労することもなしに。

ホットヘルプが機能している最終のプログラム:

このプログラムにはちょっと問題があります。例えば、プログラムが起動したときにウィンドウの下のラベルは"Label:" となっている(これは実に醜い)、また、カーソルをオブジェクトの外に移動しても、ヘルプのラベルは依然として古いテキストのままです -- 理想的に言えば、オブジェクトが指し示されなくなったときには、ヘルプの文章は消えるべきです。これはどのようにすれば達成されるか判りますか?お判りだと思いますので、これは宿題としておきます。

次週

REALbasicの構文syntaxについてさらに詳しく学習します。

Letters

最初の猛攻撃で見過ごしていた2通の手紙を見つけましたので、それらから始めましょう。 まず、Mike Zieglerさんの手紙です:

私はHypercardからRealBasicに切換えようと考えています。手持ちのHypercardのスタックをRealBasicに変換することは可能でしょうか?

私が知っているかぎりでは、そのような方法はありません。REALbasicは簡単に使えはしますが、それはHyperCardではないのです。 HyperCardは全てが「カード」(標準のMacのウィンドウではなく)に書かれているという、他のものとは非常に異なった構造をとっています。原理的には誰かがHyperCardのスタックを走らせる、あるいはREALbasicに変換するというRBのツールを書くことは可能です。しかし、誰かがそれをやったということは聞いていません。

もし、あなたがHyperCardのような製品に興味があるのならMetaCardあるいはSuperCardを見るといいでしょう。

次は、Alvin Chanさんからです:

おはようございます。私はRealBasicを使ったことがあります。しかし、RealBasicは私が現在使っているVB6と較べてどれほど強力なのでしょうか? Active X のような異なる形式のデータベースを取り扱うことができるでしょうか、またAPIへの関数呼出が可能ですか

私はVBの使いやすいメニュー機能を除いては、VB6よりもRealBasicのインターフェースが好きです。

私はVB6からC++、そしてJavaへと移行しようとしました。ところで、最高のC++ やJava、あるいはAppleのような大きな会社が使っているベンダはどこですか?

神のお守りを、
Alvin Chan

お便りをありがとう、Alvin。私はVisual Basicを使ったことがないので、実際に2つを比較することはできません。 しかし、Macに関するかぎり、RBはおなじように強力だと思います。とはいっても、VBはRBに対応していない幾つかの機能を持っていると聞いたことはあります。 例えば、MacにはActive Xは存在しませんので、それは適用されません。 RBには、その内蔵形式あるいはSQL、ODBCまたはOracleなどの外部データベースを使うデータベース機能がいくらかあります。そして、Paradigma SoftwareのValentinaのようなプラグイン(拡張機能)があります。あなたはそれらを調べて、あなたの要求に合致するかを確かめるといいでしょう。

REALbasicはMac OSの関数への呼び出しをサポートしています。そして、それらを使うことによりRB で高度なことを実現している人々がいます。

C++とJavaに関する質問に関しては、あなたは私の仲間から外れようとしています。(私は その領域を探検する野望は毛頭ありませんし、それは私がREALbasicを使っている理由でもあります ;-)。 しかし、私が知っている限り、ベスト(1つしかない?)なツールはCodewarriorでしょう。

最後に、先週のJohn Rahnさんの質問に戻りましょう。それは、彼のプロジェクトでは、「灰色」になるふに落ちないアクティブなウィンドウがあるということでした。私はこの状況を再現しようとしましたが、できませんでした。そこで、Johnは彼のプロジェクトのソースコードを送ってきました。 私は調査の末、ようやく間違いを見いだしました。

そうこうするうちに、Paul Harveyさん(ラジオ解説者ではないかと思います ;-)が同じ問題に対して次のように書いてきました:

私もrealbasicの最前面ウィンドウが灰色になるという同じ問題に出くわしました!私は原因を突き止めてはいませんが、私のプロジェクトには文字入力欄のデータを処理するための走り書きの領域である複数の「隠された」ウィンドウがありました。 我々はそれを見ることができませんが、 それらのうちのどれかが最前面にあるのではないかと思います。灰色になっているウィンドウをクリックしても、灰色の状態のままです。 しかし、別の文書ウィンドウをクリックして、それから灰色のウィンドウに戻ると、この状況はときどき解決します。

Paulさんは正しく推察しています。まさに、そのことが問題なのです。Johnのプロジェクトは多くの隠されたウィンドウを持っていました。そのうちの幾つかは「浮遊パレットfloating palette」でした。それらの隠れたウィンドウがときどき最前面にあり、別のときにはそうではありませんでした。 これは、彼の"Settings"ウィンドウがアクティブであるにもかかわらず、ときどき灰色になるということを説明します。

私はこのことを短いルーチンをかいて最終的に確認しました。私はポップアップコントロールを彼のプロジェクトのメインウィンドウに追加しました。そして、MouseEnterハンドラに以下のようなコードを入力しました:

 
   dim  i  as  integer

   me.deleteAllRows
   for  i = 0 to  windowCount - 1
       me.addRow  window(i).title
   next

これは、 アクティブウィンドウの名前を前から後ろの順にポップアップメニューに代入します。 ここでアクティブウィンドウというのは「活動中」である(すなわち、ロードされて、動作している)ウィンドウのことですが、これはスクリーン上で必ずしも見えている訳ではありません。

このコードはMouseEnterハンドラ内に置かれていますので、ポップアップメニューの領域にポインタが入るたびに、ウィンドウリストは更新されます。彼のプログラムで遊んでいるときに、定期的にそのときのウィンドウリストを調べました。私はすぐに、"Settings" が灰色になるときはいつでも、それは最前面ウィンドウではなく、正しく表示されるときはいつでも最前面ウィンドウであることに気付きました。このことにより、私は以下のことを理解しました:他の隠れたウィンドウが、どれが最善面ウィンドウであるかというREALbasicの判断を誤らせ、そのウィンドウを間違って表示させている。

この解決法は単純です:不要になったウィンドウは隠す(hide)のではなく、終了(close)しましょう。 終了はウィンドウを処分するのに対して、 隠すのはただ不可視にしているだけです。 例えば、Johnはプログラムが起動されたときに「起動画面(splash screen)」を表示します。そして、そのウィンドウを終了していないので、そのウィンドウはまだどこかにあって、それが見えないにもかかわらす、ときどき最前面になったのです!

Johnの起動画面を終了するために、私はself.closeコマンドをこのウィンドウのMouseDownハンドラに追加(彼のhideコマンドに置換)しました。

アクティブウィンドウは隠されていてもメモリーを消費しますので、使用しないウィンドウを終了することはメモリーの節約にもなります。ウィンドウはREALbasicプロジェクトの一部ですので、いつでももとに戻すことができます -- メモリーからでなくディスクからロードされるだけです。

ウィンドウに関して知っておくべきもう1つの重要な事項:どのようなウィンドウへの参照はそれをアクティブにする(メモリー上に持ってくる)。そのウィンドウは見えることもあり、見えないこともあるでしょう、しかし参照するだけで、それをアクティブにするのです。 Johnの場合には、プログラムが起動されたときに、初期設定ファイルから幾つかの項目を読み込んで、それらの設定を隠れたウィンドウの変数に代入していました。これがウィンドウが見えないにもかかわらず、それを事実上アクティブにしていました。 より間違いのない方法は、ウィンドウが開かれたときに、そのウィンドウが読むことの出来るグローバルな変数に設定値を保存することです。(例えば、チェックボックスの状態を設定するのに、ウィンドウのOpenハンドラにcheckBox1.value = globalCheckBoxValueをおくことです。ここで、globalCheckBoxValueは設定値を保持している変数です。)

今週はこれで終わりです。質問をどしどし送って下さい!もし、今週、あなたの質問に答えていないとしても、いつかはそれにお答えします。

INDEXに戻る