RealBasic University

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

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

悩みの種

私はプリントショップで働いていて、毎日顧客からファイルを受け取ります。それらのファイルの多くは私が使っていないプログラムで作成されています。あるいは、仕事がPCからきたり、インターネットを介してきたりします。 これらの場合には、それらをダブルクリックしても開くことができない 一般のアイコンをもつファイルを得ることになります。 何とかして、私のMacに"ad.jpg"はJPEGファイルであって、Adobe Photoshopで開く必要が有ることを教えなければなりません。

秘訣はMacがすべてのファイルにTypeとCreatorコードを持っているということです。 これらのコードは単に4つの文字列です。 多くは単純です。 例えば、テキストファイルのTypeは"TEXT"(TypeとCreatorでは大文字小文字の区別は重要です)。 もし、"R*ch"のCreatorコードのファイルをダブルクリックすると、Macはその文書をBare Bones SoftwareのテキストエディタBBEditで開こうと試みます(もし、それがインストールされていれば)。もし、その代わりに、そのファイルをSimpleTextで開きたいのであれば、Creatorコードを"ttxt"に変えればOKです。

これらの隠されたコードは、例えば、ResEditなどの多くの専門的なプログラムあるいはユーティリティで見ることができます。しかし、それらの多くは使いづらく、また私の要求にたいして高機能過ぎます。 TypeとCreatorコードを確認して、変更できるシェアウェアもあります。 しかし、私のようなプログラマは生来的にけちで、また自分で作るのが好きなのです。ですので、TypeとCreatorコードを変更する自分のユーティリティを書こうと思います。

REALbasicによる解決

このような種類の問題はREALbasicにとって理想的です。それは単純ですが、しかし充分に興味がわく問解です。そして答を探る間に、我々はREALbasicのいくつかの側面、ユーザインターフェイス、クラスおよびデータ構造の設計、あるいはファイル、ダイアログボックスの使い方などなどを勉強することになるでしょう。

プログラムのデザイン

どのようなプログラムを書く場合でも、最初のステップは少々の設計をすることです。よく判ります。もし、あなたが私のようであるならば、今すぐにプログラミングを始めたいことでしょう。しかし、前もって少し考えることは後での多くの頭痛の種を減らすことができます。ですから、立ち止まって、そしてこのプログラムの希望する動作について考えましょう。我々の要求はなにか?プログラムの概観はどうか?どのようにすれば快適に使えるか?

まず、我々のプログラムの基本的な必要条件をいくつかリストしてみましょう。

  1. 単純:TypeとCreatorコードは混乱しやすい。我々は混乱は避けたい。単純で、早くて、分かりやすいものがいい。 ファイルの保存や面倒なダイアログボックスに悩まされたくない。事実、実際の Type と Creator コードは表に現れない方がいいだろう -- プログラムは我々が変換しようとしているファイルの種類を表示する、それは我々が知る必要のある全てである

  2. 強力:私はしばしば同じタイプのファイルを次から次へと変換する必要がある。もし、プログラムが種々の Type と Creator コードを記憶していて、"Quark XPress"を選ぶだけでQuarkの書類にできれば理想的です。また、プログラムは複数のファイルを取り扱えるべきでしょう -- すべての Photoshopの書類にしたいJPEG画像のフォルダがあった場合はどうでしょうか?

  3. 簡潔: プログラムはさっぱりしたインターフェイスをもち、使いやすいものであるべきです。追加、削除、保存した項目の変更等が容易であるべきです。

これはかなりいい第一歩ですが、少し一般的すぎます:ほとんどのプログラムは単純、強力、簡潔であるべきです。次に必要なのはプログラムの詳細です。プログラムがどのようにその要求を満たそうとしているのか?概観はどうなのか?どのようにTypeとCreatorコードの組み合せを記憶するか?

プログラムが動いている状況を想像してみましょう。我々はブレインストーミングを行なっているということに注意して下さい:なんでもOKですし、なにもまだ決定はされていません。 我々はまだコードを何も書いていません、ですからどのような変更も自由です。 複数の構想を提案することが重要です:プログラミングでは、すべてのことを行なうのに多くの方法があり、あるものは他のものよりすぐれています。それらがさらに想像しやすくなるように、紙と鉛筆をもってそれらをスケッチしてみるのもいい考えでしょう。

構想 #1
最初は、ファイルタイプ(Quark XPress, Photoshop JPEGなどの)のリストのメニューがあります。それらのうちの1つだけにチェックをつけることができます。それから"Convert File/Folder"のメニューコマンドがあります。そのコマンドで、指示したファイルタイプにファイルが変更されます。追加、削除、保存項目の編集のためのメニューコマンドも必要でしょう。

長所: 単純で簡潔;ウィンドウさえありません。

欠点: 選択されているファイルタイプがメニューがプルダウンされているときだけしにか見えない;フォルダ全体しか変換できない(フォルダの中の10項目だけというのはダメ);ファイル選択ダイアログを使うのは苦痛である、特に複数のファイルを変換する場合。


構想 #2
メニューバーの替わりに、ファイルタイプのリストを示すポップアップメニューをもつウィンドウを使って見ましょう。ユーザはその中から1つを選びます。 ウィンドウにドラッグされた全てのファイル/フォルダを変換する変換ボタン(Convert)があります。ファイルリストに項目を追加するには、その種類のファイルをただポップアップメニューにドラッグします。ファイルタイプを編集/削除するためのメニューコマンドも必要でしょう。

長所:単純;複数のファイルが容易に扱える;ファイル選択ダイアログを用いていない。

欠点: ポップアップと変換ボタンの両方がドラッグを受け付けるので、どちらがどっちか混乱するかもしれない。


構想 #3
ここにはウィンドウにリストボックスコントロールがあります。リストボックスはドラッグされたファイル/フォルダを表示します。それぞれのファイル名の横にはファイルタイプのアイコン、そしてファイルタイプのポップアップメニューがあります。ユーザはそれぞれのファイルの横にあるメニューから新しいファイルタイプを選ぶことにより容易にファイルタイプを変えることができます。リストボックスの下には変換ボタンがあります。全てのファイルが設定されれば、それらは一度のクリックで変換されます。ここでは複数のファイルを複数のファイルタイプに同時に変換できます!

長所: 強力;見やすい(ファイルのアイコンが表示され、変換されるファイルがリストされている)。

欠点: 複雑 -- 複数のファイルを異なるファイルタイプに同時に変換する機能は強力すぎるかもしれない;プログラムが困難(REALbasicはファイルのアイコンを取得する機能を持っていない);RBのリストボックスはポップアップメニューを含むことができない。


構想 #4
これは構想2と構想3の変形。上部にファイルタイプのポップアップメニューを置く。変換されるファイルのリストと変換ボタンがあります。もし、ユーザがあるファイルの変換をやめたい場合には、それを選択して、deleteキーを押すことにより取除くことができる。全てのファイルは同じファイルタイプに変換される。ファイルリストを編集するメニューコマンドが必要でしょう、しかし、ファイルをポップアップにドラッグして簡単にリストに加えることもできるでしょう。

長所: 単純で簡潔;視覚的に異なる大きなリストボックスと小さなファイルタイプのポップアップリストは混乱を最小にする;実際のTypeとCreatorコードは編集されるまでは隠れている;追加された個々のファイルを取除く機能はすごい。

欠点: 複数のダイアログボックスが必要なのでプログラムが少し複雑である。

それでは、始めましょう。我々は幾つかの選択肢があります。構想3は明らかに最も強力ですが、少々複雑です;我々の望む簡単なユーティリティにしては強力すぎます。構想1と2は容易にプログラムできるでしょう、しかしそれらは構想4ほど簡潔ではないでしょう。構想4は他のものに較べてそれほど多くの作業を必要とはしないでしょう、しかしそれは利用のしやすさと作成の容易さとを理想的に折衷したものです。だから、決定です:我々は構想4を進展させるでしょう。

最後に残っていることはプログラムにかわいい名前を考えることです。何かFileTyperのような直ぐにわかるものにしてもいいですが、もう少し独創的なものにしましょう。何か憶えやすくて少しひょうきんなものはどうでしょうか...ファイルのTypeとCreatorを変更するというのはある種の手術にちょっと似ていますので、GenderChangerというのはどうでしょうか?

次週

GenderChangerのユーザインターフェイスをデザインします。

Letters

今週の最初の手紙はJean-Yves Boscさんからのお褒めの言葉です。彼は次のように書いています:

あなたのネット上のREALBasicコースに大変感謝しています。私はデータベース開発者でREALBasicを試してみたいと思っています。私はオンラインレッスンを提供しているあなたの努力に感動し、 感謝しています。それではこれで。もう一度、大いに感謝しています。

p.s.: 私もサッカーの大ファンです。

ありがとう、Jean-Yvesさん!明らかに、味の違いのわかる人です。 ;-)  本当に、RBUがあなたの目的を実現する手助けができることを望んでいます。

アクティブなウィンドウが灰色になる問題について以前の手紙をもらったJohn Rahnさんからの手紙です:

簡単な質問です:カーソルを強制的に 選択された文字入力欄に入れる方法はありますか?

例:"Preferences" ウィンドウなどのように、複数の文字入力欄をもつウィンドウがあります。ユーザがダイアログボックスを閉じる前に、1つの文字入力欄にはその中に必ず値を入力する必要があります。

ユーザがその文字入力欄が空欄のままでウィンドウを閉じようとします、すると、そのボックスには何かが入力されなければならないということをユーザに伝えるメッセージボックスが表示されます。メッセージボックスが閉じられたときに、カーソルは自動的に問題の文字入力欄に設定したい。

できますよ、John!editField.setFocusコマンドを使います。ここで、editFieldは文字入力欄の名前です。これによりあなたの名前を付けた文字入力欄にカーソルが移動します。

次に、Dennisさんは幾つかのコメントと1つの質問を書いてきています:

Hi, Mr. Zeedar.

最初に、あなたの非常にスマートなREALbasicの解説に感謝をしたいと思います。REALbasicの初心者として、そしてプログラム全般にたいして初心者からあまり進歩していないものとして、あなたの解説は私の技術レベルに上手くマッチしています。私はあなたの他の読者のフィードバックなどを我々初心者に対して明らかにし、そして、REALbasicのマニュアルだけに頼った場合に較べてREALbasicの学習を大いに容易にするするやり方が特に気に入っています。すでに、私はそれから多くのことを勉強して、格好のいい(他人にとってほとんど役には立ちませんが)アプリケーションを作りました。これはCodeWarriorのようなもので作れば何ヶ月も掛かったでしょう。

1つの質問と1つの一般的なコメントがあります。1つ目のものは、大局的(グローバル)変数はどのようにつくるのか?マニュアルを探しまして、大局的<定数>はモジュールに記憶されるということを見つけました。しかし、大局的変数の作成に関してはどのようなことも見いだせませんでした。( 私はカード合わせゲームの1つを作ろうと考えています。 そこでは一人が一致するものを見つけるまで トランプのカードをひっくり返します。1つのカードオブジェクトに対して他のそのようなオブジェクトが表返ったかどうかを知らせるために 1つか2つの大局的変数が必要になるだろうと思います。)2つ目のコメントは、 多くの人々 -- 特に私のような趣味に熱中する人 -- はPongやBreak-outというようなゲームを作ることに楽しみを感じるとだろうということです。多分、将来、このことに関して解説をされるでしょう、あるいは、少なくともspritesについて REALbasicのマニュアルよりもずっと詳しく論じられるでしょう。

もう一度、ありがとう。よい仕事を続けて下さい。他の読者も言っていますように、あなたのコラムを楽しみに待っています、そして、新たなコラムが毎日あればと思っています。 :)

-- Dennis

ご意見、ありがとうございます、Dennisさん。私はあなたがこのペースを気に入ってくれて喜んでいます -- 私はある人にとってはあまりにも遅くて、他の人にとっては早すぎるのではないかと気にしていました。このような微妙なバランスを見いだすのは実に難しいことです。

あなたの質問に関して:大局的(グローバル)変数はモジュールに属性(property)を追加することによって簡単につくれます。モジュールは本質的に大局的です。ですから、定数、属性、あるいは関数などモジュールに置いたものは何でも大局的で、プログラムのどこからでもアクセス可能です。

プログラムを始めたばかりでは、局所的変数にたいして大局的変数をいつ使うかを決めるのは難しいことです。一般的に、情報がリンクされている、あるいは現在のウィンドウなどの他のものの一部であるときには局所的変数を使います。例えば、ゲームにおいては、ユーザが新しくゲームを始めたときに開くウィンドウがあるでしょう。そのゲームのスコアはそのウィンドウに局所的でしょう。しかし、高得点のリストはそのウィンドウが閉じられたときに消えてしまっては困るでしょう。そのような場合に、高得点のリストは大局的変数に記憶されなければなりません。

しばしば、われわれは経験から学習します。誤った方法をとって、あとで間違いが解ります。ある習い始めたばかりのプログラマは、それが容易なので、全てを大局的変数にしてしまいます。しかし、大局的変数は多くのメモリーを消費するということを憶えておいて下さい:それらはいつもどこかに存在し、メモリーを無駄に使っています。小さなプログラムでは、このことは問題にならないでしょう、しかし、複雑なプログラムでは、問題になることもあります。

最後に、私もカードゲームとアーケードゲームの両方ともが今後のコラムに適切だと思っているプロジェクトでしたので、あなたがその両者に言及されたのは興味深いことです。実際のところ、私は ほとんど出来上がったPyramidの変形版を持っていて、それをGenderChangerが終わった後に取り上げようと思っています。

これで今週は終わりです。 お便り をどしどしお寄せ下さい!

INDEXに戻る