RealBasic University

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

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

ダイアログボックスの追加

先週、我々はGenderChanger(Mac OSのTypeとCreatorを取り扱うユーティリティ)のプログラムを開始しました。そして、このダイアログボックスの作成を宿題にしておきました。

私は皆さんがこれを完全に再現されていると思います。しかし、大事をとって、ダイアログの種々のオブジェクトの属性をここに示します。あなたの結果と見比べてください。

私は幾つかのオブジェクトの名前を変更していることに注意して下さい、そして、あなたのオブジェクトの名前をそれらと同じにして下さい。そうしないと、今後、RBのコード内でオブジェクトの名前がでてくるときに混乱が生じるでしょう。

次に、プロジェクトにもう1つのウィンドウを追加します。これは名前変更ダイアログで、ユーザがファイルタイプの登録名を変更するときに使われます。

File メニューに行き、"New Window" を選択します。そして、ウィンドウの属性を以下のように設定します:

では、このウィンドウに幾つかのインターフェイス要素を追加しましょう。プッシュボタン(PushButton)を2個、文字入力欄(EditField)とテキスト要素(StaticText)を1個ずつドラッグしてきます。そして、これらの属性を以下のように設定して下さい:

さて、統合開発環境IDEでは一風変わって見えるもう一つのインターフェイス要素があります:左上の灰色の四角です。これは何でしょうか?それはキャンバスcanvasです。キャンバスは描画領域を表すREALbasicの特別なオブジェクトです。キャンバスの中ではどのようなものでも描画することができます。 描画は完全にREALbasicのコード指定されますので、IDEは何を表示するのかを知りません -- このため、IDEは灰色の四角を表示しています。

今のところは、それらのことを心配する必要はありません。ただキャンバス(日の出の絵ように見えるもの)(訳注:v3.xでは空が青く描かれているもの)をツールパレットからウィンドウにドラッグし、その属性を以下のように設定します:

データ構造の作成

よく出来ました!我々はものすごく進歩しました。これで、我々はすべてのユーザインターフェイスを設定しました。残っていることは、すべてを機能させる実際のコードを書くことです!

先ず最初に、我々のプログラムのデータ構造 data structureを決めねばなりません。データ構造とはプログラムの情報を概念的にどのように整理するかということです。もし、情報が整理されていなければ、我々のプログラムは必要な情報を見つけて処理をおこなうことはできません!

プログラムでの最も一般的なデータ構造は配列 arrayを使うことです。配列は特殊なデータ構造です:それは連続した変数のようなものです。変数はたんなる入れ物であることを思い出して下さい。配列はすべてが同じ名前で関連づけられた複数の入れ物のようなものです。配列の個々の入れ物は一意な指数(index)(番号)を持っています。

多くの他のプログラム言語と同じように、REALbasicでは配列を定義して、個々の変数には次のように名前の後に括弧で変数の指数を指定することでアクセスすることが可能です:arrayname(12)は配列の12番目の要素を指し示しています。

例を示しましょう。名前のリストがあるとしましょう。それらを以下のように個々の指数の配列に保存することができます:

   dim theArray(5) as string

   theArray(1) = "Steve Jobs"
   theArray(2) = "Steve Wozniak"
   theArray(3) = "Billy Joel"
   theArray(4) = "Michael Owen"
   theArray(5) = "Clint Eastwood"

上のコードの最初の行は、5個の文字列(string)変数の配列のためにメモリーを確保するようにREALbasicに指示しています。その後の行は配列の個々の要素に名前を代入しています。

プログラムにtheArray(2)を使うように指示すると、あなたの好きな果物会社(訳注:お判りになるとは思いますが、アップル社)の共同設立者の名前が得られます。

機能の低い過去の言語では、配列のサイズはプログラムがコンパイルされるまえに決定されていなければならないという制約がありました。配列のサイズを設定する上の"dim" コマンドはプログラムの実行中に変更することはできません。このように、前もってその大きさが判らないような場合には、配列は役に立ちませんでした。(代案はある種のデータの量を制限して配列を使うことです。このために、古いソフトウェアは恣意的な制限がしばしば見られます。例えば、GenderChangerで、プログラムが100種類以上のファイルを扱えないようにすることもできます。)

しかしながら、REALbasicは最新の言語です:配列の項目の数を実行中に減少したり増加したりすることができます。 このことは好ましいことです。というのは、配列は便利で有用な、容易にプログラムできるデータ構造です、しかし、我々は単にプログラムの容易さを求めることにより、その機能が制限されたくはありません。REALbasicでは容易なプログラムと利用可能なメモリーのみによる配列サイズの制限という両方の利点が得られます。

GenderChangerの場合には、どのような種類のデータを保存しなければならいのでしょうか?我々は色んな種類のTypeとCreatorコードを保存したいのでしたね?それらの1つ1つが固有の名前を持つ必要があるでしょう。ですから、個々のファイルの種類に対して我々が必要とする3つの情報があることになります:

我々は保存すべき一連のファイル種類があり、それは配列構造に最適です。しかし、ここで問題に突き当たります:配列の個々の要素は1つの項目しか保持することができません。我々には配列の個々の要素に対して3つの項目があります。これはどのようにすればいいのでしょうか?

そうですね、色んな方法があります。1つの方法は3個のデータの全ての情報を1つの配列の要素に入れてしまうことです。個々の情報の間に特別な区切りを入れることによって、どれがどれに対応しているかを区別することが可能です。例えば、fileArray(3) = "FreeHand;FH80;AGD3" は3番目の項目の name に "FreeHand", Creator に "FH80"、そして Type に "AGD3" を設定する1つの方法です。

別の方法は、3つの別々の配列(それぞれの情報に1個の配列)を使うことです。3つの全ての配列で個々の要素の指数は同じなので、name(10) は fileType(10) と fileCreator(10) に対応していることが判ります。指数の数値が何かの理由で一致しなくならないかぎり、データにアクセスすることが可能です。

これらの両方の問題点は、それらが複雑で壊れやすいことです。もし、突然にそれぞれのレコードに4番目の情報を保存したいと思ったときはどうなるでしょうか?ファイルの種類の名前の一部としてユーザがセミコロンを入力した場合はどうなるでしょうか?3つの配列の場合には、あなたは全てのステップを3度(それぞれの配列に対して一度)繰り返す必要があります:1つを忘れることはよくあることでしょう、そしてあなたのプログラムは正常に動かなくなるでしょう(そして、あなたはバグがどこにあるのかを見つけるために大変な苦労をするでしょう)。

より良い方法はREALbasicのオブジェクトの機能を使うことです。文字列の配列の替わりに、我々が作り出した特別なオブジェクトの配列を用います。我々のオブジェクトは3つの属性:name欄、Type欄とCreator欄、を持つことになるでしょう。このようにして、我々は取扱いが効率的な単一の配列を使います、しかしデータはうまく構造化されていて、我々のコードは理解しやすくなります。

このためには、先ず最初に、我々の新たなオブジェクトを造り出す(定義する)必要があります。REALbasicのオブジェクトはクラス classと呼ばれます(全てのオブジェクトは特有のクラスに属します)。では、Fileメニューに行き、"New Class"を選んでプロジェクトに"Class1"オブジェクトを追加しましょう。そして、Class1を選択して、その名前を"fileTypeClass"に変えましょう。

では、fileTypeClassをダブルクリックして、そのウィンドウを開きましょう。クラスは、他のオブジェクトと同様に、イベント、メニューハンドラ等々を持つことが可能ですが、我々が関心を持っているのはオブジェクトの属性だけです。属性を追加するには-- fileTypeClassを最前面ウィンドウにして -- Editメニューに行って、"New Property"を選択します。すると、以下のようなダイアログが現れるでしょう:

文字入力欄にMacCreator as stringと入力してリターンキーを押します(あるいは、OKをクリックします)。

この操作を2回繰り返して、"macType as string"と"name as string"の属性を追加します。最終的なfileTypeClassウィンドウは以下のようになっていなければなりません:

よくできました! あなたは新たなオブジェクト fileTypeClassを作り、そのオブジェクトに3つの属性(保存場所)追加したのです。来週にはそのオブジェクトを我々のコードで利用してfileTypeClassの項目の配列を作るでしょう。

起動/終了ルーチンの追加

今週の最後の仕事は我々のプログラムにアプリケーションクラス(application class)を追加することです。アプリケーションクラスとは何のことなのでしょうか?

さて、デフォルトでは、新しいプロジェクトを作成したときにREALbasicが作るWindow1があなたのプログラムです。そのウィンドウを閉じれば、プログラムは終了します。これはあなたがアプリケーションそのものに対するインターフェイスをまだ作っていないからです。

REALbasicはオブジェクト指向であることを思い出して下さい:それはあなたのアプリケーションにメッセージを送ろうとしているのですが、あなたのアプリケーションはオブジェクトを持っていないのです。あなたはそれを作成する必要があります(私はREAL Software社 は自動的にアプリケーションクラスを持った新しいプロジェクトを作るべきだと個人的に思います。しかし、彼らはそうはしていません;私は何故だかよく理解できません。)

プログラムにアプリケーションクラスを持つのには幾つかの利点があります。もし、例えば、あなたのプログラムが複数の書類を扱えるとすると、あなたは1つの書類を開いていなければならないでしょう(もしそうでないとすると、最後の書類を閉じたときにあなたのプログラムは終了してしまうでしょう)。我々の場合には、GenderChangerが、起動されたときに保存されているファイルタイプのリストを読み出して、そして終了するときに更新されたリストを保存することを期待しています。アプリケーションは起動と終了のメッセージを受け取りますので(単純なウィンドウはそれができません!)、アプリケーションクラスを持てば、この機能は容易に追加できます。

アプリケーションクラスを作るのは簡単です:Fileメニュー行き、"New Class"を選びます(丁度、fileTypeClass を作ったときのように)。今回は、新しいオブジェクトの名前を"app"に変えるだけでなく、"Super"属性を"Application" に変更します(Super属性の横のポップアップメニューから"Application"を選びます)。

あなたのアプリケーションクラスオブジェクトの属性はこのようになっていなければなりません:

オブジェクトの作成はこれで終わりです:これからアプリケーションオブジェクトの"Open" (起動)と"Close" (終了)イベントにすこしコードを追加します。

appオブジェクトを開きます。"Events"の横の小さな三角形をクリックし、Openイベントを選びます。右のコード編集領域で、"openFile"と入力します。あなたのウィンドウは次のようでしょう:

いいですね。では次に、"Close"イベントをクリックして、そこに"saveFile"と入力しましょう。

今日はこれで終わりです!

(今のところはプログラムはコンパイル出来ません -- "openFile" が未定義(unknown)だと言ってくるでしょう。これはまだそのルーチンを書いていないからです。それは次週に行ないます。)

次週

データの読み込み/保存のルーチンを追加し、GenderChangerのコードの他の部分の完成を目指します。

Letters

今週の手紙はJerome Guelatさんのコメントです:

今日は、

この新しい解説に非常に感謝しています。私はREALbasicの初心者で、あなたの素晴らしい仕事に感謝しています。私の様な初心者にとって全てが非常に判りやすく、実に興味ある内容です。でも、言葉使いに関する質問があります:ルーチンとサブルーチンはどういう意味ですか、そしてその2つの言葉の違いはなんでしょうか?

用語集に定義を示してもらえませんか?

素晴らしい質問です、Jeromeさん、そしてあなたの反応に感謝します。私は初心者にとって物事を簡潔にしようとずっと試みています、そしてそれがうまくいっているのか知りたいと思っていました(我々は一度何かを習得すると、その知識を得る前には我々の知識がどのようであったかを思い出すのはなかなか難しいことです)。うまくいっていることが判って喜んでいます!

さて、あなたの質問ですが、それらは非常に似通っています;少なくとも私はそれらを同じ意味で使っています。専門的には、処理(あるいは関数やメソッド)の全体をサブルーチン subroutineと呼び、一方ルーチンは大きなサブルーチンの一部の数行の場合であると思います。 私は以下のことからこの相違点が判るでしょう:ルーチンは小さな仕事を行なうアルゴリズムと考えられますが、サブルーチンは、その定義より、独立のメソッドである。 しかし、これらは些細な違いです:ほとんどの実際的な目的には、それらは同じものです。(もし、ルーチンが2行以上であれば、それはサブルーチンにするといいでしょう。)

あなたが用語集を有用だと思われているのを知って喜んでいます!質問や説明を希望する用語の提案をどしどし送って下さい。

RBUの通知への申し込み!

別のお知らせ:Applelinksは要望の大きかったREALbasic Universityへのメーリングリストを開設しました。今日申し込みをすれば、コラムが発表されるたびにお知らせの emailがあなたに届きます!これはRBUに遅れを取らないための便利なお知らせです。

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

INDEXに戻る