RealBasic University

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

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

buildMenuメソッド

先週から Window1 のコーディングを始めました。今日はそれを完成します。まず、 Window1 のコードエディタを開きましょう(プロジェクトウィンドウで Window1 が選択されている状態で、Option-Tab を押します)。そして、Open イベントに行きます。

"buildMenu" と入力すれば、それでお終いです。それは我々が今から作ろうとしているメソッドの名前です。BuildMenu は保存されているファイルタイプの名前を PopupMenu1 に設定します。

Edit メニューに行って、 "New Method" を選択します。そして、buildMenu と名前を付けてリターンを押します。

このメソッドのコードは本当に基本的なものです:データ配列の全てのレコードを数え上げ、それぞれのレコードの名前を PopupMenu1 に追加するだけです。

Window1.buildMenuのコード

  dim i, n as integer
  
  popupMenu1.deleteAllRows
  n = uBound(gTheFileList)
  for i = 1 to n
    popupMenu1.addRow gTheFileList(i).name
  next

このルーチンの2つの重要な点に注意しましょう。先ず最初は、 deleteAllRows メソッドを最初に呼んでいることです。これは指定されたポップアップメニューのすべての存在する行を削除します。なぜこれが重要なのでしょうか?それは、もし buildMenu が繰返し呼ばれたときには、それぞれの呼び出しが、項目を置換るのではなく、それらを追加するからです。

2つ目の重要な点は、みなさんへの質問の形で示します:なぜ我々は PopupMenu1 を満たすためにメソッドを使うのでしょうか?なぜ、これを PopupMenu1の open イベントの中に置かないのでしょうか?それは、ユーザがそれらの項目を追加したり変更する可能性があるからです。もし、我々がこれを行なわなかったら、我々は個々の項目を更新されたリストと比較して、ユーザが名前を変更したか、あるいは新しいものを追加したかを調べなければならないでしょう。リストを最初から作り直したほうがよほど簡単です。buildMenu をメソッドにすることによって、いつでも必要なときに1つのコマンドによってメニューを再構成することが可能になります。

returnItemNumberメソッド

今度は別のもう少し複雑なメソッドを作ります。ユーザが PopupMenu1 からある項目を選んだ時に、REALbasic では選択されたメニューのテキストを知ることができます。すなわち、レコードの name を見つけることが可能です。しかし、REALbasicはデータ配列内のそのレコードの指数を知らせてはくれません。

このルーチンはデータリストを調べて、我々の探しているレコードの指数を返すものです。

もう一つの新しいメソッドを作って、それを returnItemNumber としましょう。今回はさらに追加しなければなならないものがありますので、まだリターンを押さないで下さい。引数(パラメータ)の行に"name as string"とタイプし、"Return Type" の行に integer と入力します。これは我々が returnItemNumber に name を送って、そして数値を受け取ることを意味しています。先に進むために、ここでリターンを押しましょう。

我々の returnItemNumber のコードは全体のデータベース(ファイルタイプの配列)をスキャンして、それぞれのレコードの名前とメソッドに送られた名前を比較します。もし一致したら、その時の指数を返します。(return コマンドはループとメソッドを終了させることに注意しましょう。)

Window1.returnItemNumberのコード

  dim i, n as integer
  
  n = uBound(gTheFileList)
  for i = 1 to n
    if gTheFileList(i).name = name then
      return i
    end if
  next

いいですか。では、実際にタイプとクリエータを変更するGenderChangerの中心となるのコードを書くことにしましょう。

PushButtonConvertのコード

PushButtonConvertの Action イベントのコード編集領域を開きましょう。ここにはボタンがクリックされたときに実行されるコードを書きます。

ここで我々のすることは複雑なように見えますが、実際には単純です。いつものように、最初に変数を定義します。この場合には、folderItem の変数とループのための2つの整数変数が必要になります。

この場合のループはデータ配列ではなく、ユーザが listBox1 にドロップしたファイルを巡回します。ですから、n をリストの項目数に設定します、そして各項目をループします。

(ここでは returnItemNumber 関数を使います。我々はそれに PopupMenu1 のテキストを渡して、theItem に結果を設定します。)

Window1.PushButtonConvert.Actionのコードの一部

  dim i, n, theItem, theCount as integer
  dim f as folderItem
  
  theCount = 0
  theItem = returnItemNumber(popupMenu1.text)
  n = listBox1.listCount
  for i = 1 to n
    f = getFolderItem(listBox1.cell(i - 1, 0))
    if f <> nil then

    end if // f = nil
  next

リストのそれぞれの項目に対して、保存されているファイルのパスをもとに folderItem の作成を試みます。(我々はファイルのパスをそれぞれの行の最初の欄に保存したことを思い出して下さい。)リストボックスの項目はゼロから始まりますので、cell メソッドのでは行番号として i - 1、列(コラム)番号としてゼロを指定しています。 我々は folderItem オブジェクトを返す getFolderItem 関数にそのパスを渡しています。folderItem オブジェクトを正常に返せない(パスが正しくない)場合には、fnil に設定されますので、先に進む前に結果をチェックします。

正しいファイルであれば、それが存在するか確かめます。それから...一寸待って。folderItem が正しければ、それはファイルが存在することを意味しないのですか?答えは断固としてノーです。新規のファイルを作成するのに folderItem は使われますので、folderItem が実際に存在しないファイルを指し示すことが起りえます。そして、存在しないファイルを変更しようとすると、プログラムはクラッシュするでしょう。ですから、f が単に nil でないというのは、folderItem が有効であることを意味しません:我々はそれを使う前にファイルが存在することをチェックしなければなりません

存在するファイルを指し示す有効な folderItem が得られれば、ファイルのクリエータとタイプのコードを変更することが可能になります。我々の変数 theItem はユーザが選択したレコードに一致する指数に設定されていますので、theItem をデータ配列の指数として使用して、対応するタイプとクリエータを求めることができます。

(次のコードを"if f <> nil then"行の後に挿入します。)

Window1.PushButtonConvert.Actionのコードの一部

    if f.exists and theItem > 0 then
      f.macCreator = gTheFileList(theItem).macCreator
      f.macType = gTheFileList(theItem).macType
      theCount = theCount + 1
    end if

いいですね。それぞれの変換するファイルに対して、変数 theCount を加算します、そして我々の最後の短いコードはユーザにドロップされたファイルの変換が終了したことを知らせます。(次のコードを next コマンドの後に追加します。)

  msgBox "Changed " + str(theCount) + " files!"

ここでは str 関数を使って整数 theCount を文字列にして、ユーザに幾つのファイルが変換されたかをユーザに知らせています。

いいでしょうか?まだ完成はしていませんが、GenderChangerはもう使えます。我々はメニューに対するコードを追加していませんし、またダイアログボックスはまだ機能しませんが、プログラムの基本部分は現時点で動くはずです。もしテストをしたければ、やってみて下さい。

プログラムを起動(Debug メニューから "Run" を選択します)すれば、リストボックスにファイルをドラッグできるはずです。(Edit Types ダイアログボックスを完成するまではファイルタイプを追加できませんので、この時点ではファイルを変換することはできません。)

もし、あなたのプログラムが何かの理由で動かない場合には、楽しいデバッグの仕事が待っています。あなたのコードを注意深く調べて、前回と今回のコラムの私のコードと較べて下さい。すべての細かい点まで確認して下さい -- プログラミングは残念ながら些細なことが重要なのです。

Menusを有効にする

REALbasic でメニューを機能させるためには3つのことを行なう必要があります。まず最初に、メニューエディタでメニューを追加して、名前を付けなければなりません。(我々はこのことを第7講で行ないました。)2番目に、ウィンドウの enableMenuItems イベントでメニューを有効(enable)にする必要があります。3番目に、メニューハンドラを追加して、メニューが計画されていることを実行するためのコードを追加しなければなりません。

GenderChanger に対してメニューを有効にすることからこの処理を始めましょう。Window1 のコードエディタ内で、Events の三角形を切換えてその内容が見えるようにして、enableMenuItems イベントを見つけて下さい。そこに次のコードを書き入れます。

Window1.EnableMenuItemsのコード

  appleAbout.enabled = true
  fileEdit.enabled = true

ここでは名前のついたメニューオブジェクトの enabled 属性を true にしています。それらの既定値(デフォルト)は false (disabled) ですので、アクティブにする必要のあるメニューだけを有効(enable)にすればいいのです。

Note:Edit メニューの copy, paste, および cut コマンドについては心配する必要はありません。REALbasic がそれらのメニューの有効化、無効化、および action イベントさえも処理してくれています。もし必要であれば、それらを書換えることができますが、通常はそれらは自動的に機能しています。

我々が GenderChanger に必要とする単純なメニューでは必要ではありませんが、メニューを有効にする前に、特別な条件をチェックするためのコードをここに置くことができます。例えば、ワープロでは、選択部分を大文字に変更するメニューを有効にするまえに、テキストが選択されていることを確認することが可能です。これは enableMenuItems イベントがユーザがメニューバーをクリックする度に(すなわち、メニューが現れる前に)呼ばれるからです。ここはまた、もし必要であれば、チェックマークをメニュー項目の横につけるところです。

Tip:REALbasic は時々混乱して、ダイアログボックスが閉じられた後にメニューを適切に更新しないことがあります。この問題は enableMenuItems をあなた自身で呼びだす(あなたのコードに enableMenuItems への呼び出しを含める)ことによってメニューを強制的に更新することにより解決することが可能です。例えば、ダイアログボックスを閉じた後に、メニューバーを更新するために enableMenuItems コマンドを置きます。

次に進んで、2つのメニューハンドラを追加しましょう。Edit メニューに行き、"New Menu Handler" を選択します。表示されたポップアップメニューで "appleAbout" を選んで、そしてOKをクリックしてそのハンドラを追加します。この"New Menu Handler" コマンドを繰返して、今度はポップアップから "fileEdit" を選択します。それからリターンを押します。

Window1 の Menu Handlers の欄には2つの新しいメニューハンドラがあるはずです。最初の1つ、appleAbout をクリックしましょう。そして、次のコードを書入れます。

  dim s as string
  
  s = "GenderChanger 1.0" + chr(13) + "Copyright 2001 by REALbasic University"
  msgBox s

これは示されたテキストの非常に簡単なダイアログボックスを表示します。
クイズchr(13) は何をしているか判りますか?

次に、fileEdit メニューハンドラに移りましょう。ここでは2つのことを行なおうとしています:Edit Types のダイアログボックスを表示する、そしてユーザが記憶されているファイルタイプのリストに追加したり変更をした場合のために、buildMenu ルーチンをコールして、PopupMenu1 を再構築する。

  editDialog.showModal
  buildMenu

これで、我々のメニューはアクティブになり、GenderChangerを起動したときに動作するようにさえなったでしょう。しかし、我々はまだダイアログボックスにコードを全く追加していませんので、それらはまだ十分ではありません。事実、まだキャンセルボタンが動作するためのコードを追加していませんので、ダイアログボックスが一度開かれれば、それを閉じることさえできません!

次週

我々はファイルタイプの名称変更と編集のためのダイアログボックスのコードを追加し、GenderChangerを完成します。

Letters

今週は批判的な手紙を J. Russell さんから頂きました。次のようなものです:

Z.様:

あなたは既に私を迷子にしようとしています。あなたは立派な考えを持ち、そしてあなたのコラムは本当に私が REALbasic をマスターするのを助けてくれると期待していました。しかし、あなたは REAL basic がそのチュートリアルで、なにが進行しているのかを説明することなく、ウィンドウに入力するものをただ示しているのと同じことをやろうとしています。多分、私は大多数の人よりももっと取っ掛かりを必要とする人間の一人でしょうが、そうとも思えません。あなたのコラムの質問欄はこの点を明らかに証明しています。質問はあなたがその時に扱っている話題についてではなく、あなたが説明した事柄よりもずっと高度な事項を扱っています。

私は本当に REALbasic の使い方を勉強したいのですが、あなたのコラムは初心者の範囲をすぐに越えてしまい、REALbasic の中・上級のユーザに移ってしまいました。あなたのコラムを受講申請した人を調査すれば、50%以上の初心者が、私のように迷子になって受講を取りやめていることに気付くと思います。

謹啓

J. Russell

以下は私の返事です:

Hi John!

このコラムがあなたを置き去りにしたということをお聞きして申し訳なく思います。あなたもお判りのように、REALbasic は中級と初級のプログラマ、すなわちプログラムの経験の全く無い人々と古典的な方法を知っているが REALbasic がどのように機能するのかを理解したいと思っている人々の両方引きつけています。それらの多様なグループを満足させようとすることは微妙なバランスを必要とします。

私が REALbasic University で行なおうとしていることについて少し説明させて下さい。先ず最初に、プログラミングは少々複雑であるということを理解して下さい:それを避けて通る方法はありません。プログラミングが何かということの多くを吸収するには時間がかかります。あなたの今までのプログラミングでは誤りや、試行および苦難で一杯だったでしょう。 それが現実です。しかし、RBU はあなたのリソースです:私は導入の手引きをし、あなたに正しい方向を指し示し、あなたの質問に答え、くぼみや落とし穴に注意し、また学習ができるだけいらだたしくならないようにしようとしています。それは一晩や、一回の講義ではだめですが、あなたは徐々に学習していくと思います。

私が REALbasic University でとっているアプローチは2つあります。1つはゲームやユーティリティのような実際的なプログラムを2ヶ月ごとに一歩づつあなたとともに作る予定です。それらは徐々に複雑になっていくでしょう。しかしながら、一方、プログラミングの間には、REALbasic の他の側面について書く予定です。プログラミングのテクニックや概念について議論したり、種々の RB のリソースについて評論したり、特殊な問題(グラフィック関連のプログラムやMac OS Xでプログラムを動かす方法など)を説明したり、また REALbasic に関連したその他のアルゴリズムについて議論をするでしょう。

それらの2種類のコラムの間の重要な違い:一般的なコラムは多くは基本的なことを説明していて、より初心者に向けられています、一方、プログラムのプロジェクトのコラムはプロジェクトを完成することに重点が置かれています。私はそれぞれのステップで何が進行中かを説明しようと努めますが、時々、あなたを混乱させたり、プログラムを完成するという本題からそれたりしたくないので、問題点を省略したり、幾分込み入ったことを言い紛らすこともあるでしょう。

(この良い例は第8講での配列の議論です。私はゼロの指数から配列が始まるというゼロ基底の配列の考えを省略しました。しかし、私が間違いを犯しているという手紙に対する解答として第9講でそのことを説明しました。実際のところ、私は平均的な読者にとって物事があまりにも複雑になることをただ避けたかったのです。私はまだそれらを十分には説明したとは思っていませんので、今後のコラムでさらに説明するつもりです。)

我々が実際のプログラミングを全く行なわず、色々のプログラムの考え方を説明することによって RBU を進めることも可能でしょう。しかし、理論をただ議論するかわりに、何かを行なうプログラムを実際に書くことの方がすごく面白いと思っています。

プログラムのプロジェクトのコラムでの説明に関するかぎり、私は物事を説明しすぎて進行が遅くなることと、初心者にとって速くなりすぎることとの間で悩んでいます。このことにどれ程成功しているか、あるいは失敗しているかについては、皆さんにお聞きしなければなりません。あなたのような手紙は大歓迎です。しかし、本当に有益であるには、あなたは何が理解できなかったかを具体的に知らせて下さい。あなたは私があなたを迷子にしたと言われましたが、あなたはどこで、あるいは何が判らなかったのかを述べられていません。

1つ覚えておかなければならないのは、プログラムの途中では「全体像」を見失いやすいということです。1つのルーチンに集中すると、全体の目的を忘れてしまいます。私はこのことが少し GenderChanger で起ったのだと思います。我々がそれぞれのステップに集中したときに、我々が何をしているかという全体的な視野(そして、最も重要な、その理由)が見失われてしまいました。しかし、心配することはありません:私はGenderChanger を振り返り、そしてその動作を説明する要約のコラムを用意しています。

高度な問題を議論する手紙(Letters)のセクションに関しては、私は送られてきた手紙に解答しています。もし、あなたが理解できないことがあれば、私に知らせて下さい。それが手紙のセクションの目的です。手紙をくれたある読者がより高度な疑問点を質問してきたので、私はそれらに答えました。初歩的な質問を送って下さい、そうすれば私はそれらに解答します。手紙のセクションは REALbasic のどのような問題をも取り扱う全般的な場所です -- 現在のプロジェクトに関連している必要はありません。

私が「あることをウィンドウに入力するように指示しているだけ」というあなたのコメントに関して最後にひと言述べさせて下さい。ある程度、私はそのことに同意します。それは私の特に望むところではありませんが、なぜ2行のコードを入力するのかについて、2ページの説明を書くのもまた好みません。ときどき、あなたは私をただ信じてコードを入力し、そしてその後のコラムでそれをやがて説明すると言うことを納得して頂く必要があるでしょう。(これは我々の最初のプログラムのプロジェクトであるということに注意して下さい。幾つかのプロジェクトを完成して、あなたの理解が深まるにつれて、ある面はより明瞭になるでしょう。)

私のプログラミングの経験は BASICを使って1980年代に始まりました。私は多くの時間を Compute! や他の雑誌からプログラムコードを何ページにもわたって入力したことを憶えています。何度も1つのタイプミスが、何が間違っているかを見つけるための骨の折れる長時間のデバッグを必要とし、その私の努力を無にしてしまいました。何のよりどころもありませんでした:私はまったくの独力でした。そのコードが何をするのかという説明はありませんでした:私は自分自身でそれを理解しなければなりませんでした。私はそれらの初期の暗黒の数年を非常に鮮明に覚えています:すべては霧の中でした。私は自分が何をしているのかが解らず、それはとてもいらだたしいものでした。しかし、時々はうまくいきました。それは手品のようでした。短いティックタックツゥーゲームは私を参らせました。また、私の見つけた新しいコマンドは非常にクールに私の想像した通りに動きました。私のプログラムに対する野心は私に自信が付けばつくほど大きくなりました。当時は何百ものプログラムを書かねばなりませんでした、そしてほんの数個が実際に動いたか、あるいは使い物になりました。しかし、それも勉強で、また楽しいものでした。

REALbasic はそれらの時代からは全く信じられないほどの大きな飛躍です。しかしながら、私が重要と思う疑う余地の無い類似点があります。例えば、私は完成した GenderChanger プロジェクトを示すこともできるでしょう。あなたは、 中身を詮索して変更するぐらいで、何もする必要はなく、それをただ実行するだけです。しかし、あなたにそれを入力(あるいはコピー、ペースト)してもらうことによって、あなたは少し考えたり、決断をしたり、何が進行中かを -- 少しとは言え -- 理解しなければならないでしょう。それは混乱させ、怖がらせ、また挫折感を抱かせるようなことがあることを理解していますが、それは学習過程の一部なのです。学習はいつも少しは苦痛なものです。もし、それが余りにも容易であれば、それをすぐに忘れてしまうでしょう。この意味において、私はあなたに挫折感をもって欲しいのです、私はあなたに少しの苦痛を味わって欲しいのです。私はあなたに「何故、わたしはこれを行なっているのか?何故、これはここにあるのか?何故、こうすると上手く動かないのか?」などと考えて欲しいのです。我慢して下さい -- そのうちに明らかになります。最初から、即座に、何の努力もなく、すべてのものが上手くゆくとは思わないで下さい。プログラミングはものすごくいらだたしいことがあります。プログラムの1つの機能を正しく動作させるために、私は何時間もの苦痛で、ぞっとするような努力をしたことがあります。それはそれほど困難であったので、それがついに動いたときには、私は勝ち誇ったような素晴らしい気持ちになりました。

最後に、私はお手伝いをするためにいつもここにいますということを繰返し言わせて下さい。何について説明が不十分であるかを知らせて下さい、そうすれば更に説明をするでしょう。あなたの顔を見ることのでき、そして私の説明がいいのか悪いのかを知ることのできる双方向の教室とは違い、ここでは私はあなたが私に知らせてくれることでしか判断ができません。

-- Marc

ですから、ほかの方はどのように思われていますか?私は速すぎますか、遅すぎますか、あるいは丁度いい速さですか?私は行なっていることを十分に説明していますか、あるいはもっと詳しい説明が必要ですか。他の人も迷子になりましたか?コラムは長すぎるでしょうか、短すぎる、あるいは適当な長さでしょうか?何か忘れていないでしょうか?もっと多くのスクリーンショットが必要でしょうか、あるいは多すぎるでしょうか?あなたの考えを知らせて下さい! あなたのフィードバック無しには、このコラムが成功しているのか、あるいは失敗しているのかを知ることはできません。

私はユーザを「初心者、上級者、中級者」などという言葉で考えたくないということを付け加えさせて下さい。プログラミングはおかしな学問です:1つのタイプのプログラムの熟練者は他のプログラムの全くの未熟者であり得ます。私の長年のプログラミングの経験で、何も知らなかった私よりももっと知識の少ない「専門家」や、特に、 私の知識が6ビットの容量しかない数学に関しては、私の知りえることよりも多くのことを知っている「素人」に会ったことがあります ;-) 。個人の専門知識を分類しようとするのは殆ど不可能です。「上級者」や「初心者」という言葉はそれぞれの人にとって異なる意味合いを持ちますので、私のコラムを「上級者」や「初心者」向けと分類することはほとんど無意味でしょう。私が上級的だと思うものをあなたは初級的、あるいはその逆、だと思うかも知れません。それは主観的なもので、そしてあなたの経験に依存します。

私はまたコラムにレッテルを貼ることは人々を威圧すると思います。「あー、あれは「中級者」用で、私はまだ白帯だ。このレッスンはスキップしよう。」そんなことはありません。全ての人に場所が与えられています。REALbasic University では、楽しいこと、簡単なもの、そして複雑で、難しいプロジェクトなどがあります。しかし、全てが終了するまでどれがどれであると言うことはないでしょう。ですから、飛び込んで、楽しんで下さい、そして少々複雑でも心配しないで下さい:そのうちに判るようになります。

あなたは folderitem オブジェクトで混乱しませんでしたか?私は先週のコラムで当惑した Dennis さんと短い手紙を交換しました:

私は今週の変更を完成した後で GenderChanger を実行しました。すると、私の初期設定フォルダに初期設定ファイルができていましたが、これはどうしてですか?それを作成するようなコードは見当たりません。ビープ音を鳴らし、既存の初期設定ファイルが無いときに苦情を言うためのコードがあるだけです。

アプリケーションが起動したときに saveFile ルーチンが呼ばれますという私の返事は Dennis さんにとって全てを説明するものではありませんでした。Dennis さんにとって saveFile のコードの中の何が実際にファイルを作成したのかがまだ理解できませんでした。

でも、私はまだ少し混乱しています。私はどのように saveFile が、まだ初期設定ファイルが存在してもいないときに、それを作成できるのかが解りません。すなわち、その時に初期設定ファイルがすでに存在しないとすると、saveFile のコードで実行されるものは "if" 文の外にあるのものだけです、つまり:

  f = preferencesFolder.child(kPrefName)

  beep
  msgBox "Unknown error. Couldn't save the preferences file!"

私は何かを見落としているのでしょうか?"f= pre..." 文は実際にファイルを作成するのでしょうか?

私は次のようなさらに詳しい説明を書き送りました:

あー、あなたの混乱しているところが判りました。私はこのことをもっと説明すべきでした。Folderitems はそれを理解するまでは混乱しやすいものです(でも、その後は、簡単です ;-))。

folderitem はファイルではありません -- それはただ REALbasic 流のファイルの表現です。それはファイルを表す REALbasic のオブジェクトです。あなたが folderitem を作成するときは、あなたはファイルを作成しているのではなく、ファイル(あるいは、あなたがまだ作成していないので、潜在的なファイル)を指し示すオブジェクトを単に作成しているのです。

あなたが folderitem を取得してしまえば、REALbasic にそれが指し示すファイルに関する処理、例えば .createTextFile(新たなテキストファイルを作成する、あるいは既に存在する場合は古いものを消去する)の指示をすることが可能になります。

saveFile ルーチンでは、"f =" 行はファイルではなく、folderItem を作ります。それが nil ではないことを確かめることにより、我々はファイルが存在しているのかを調べているのではなく、 folderitem オブジェクトが存在すること(すなわち、正常に作成されたこと)を確認しているのです。正しい folderitem はファイルが存在することを意味してはいません -- それは、もし作成されれば、ファイルが存在することも<あり得る>ということを意味しているだけです。言い換えれば、もしあなたが望めば、REALbasic はファイルを取り扱うことができるということです。

例えば、次の行:

f = getFolderItem("Hard Disk:dgfgdsa.text")

はおそらく殆どのコンピュータでは失敗するでしょう。それは、コンピュータが"Hard Disk" というボリューム名を持っていないからです:それは正しくないパスであり、それで folderitem も正しくなくなり、結局 fnil に設定されるでしょう。

GenderChanger の場合には、f特異な状況でない限り妥当なものになるでしょう。そして、ルーチンはほとんどいつも if 文の内部のコードまで進むでしょう。そこで我々は "out = f.createTextFile" 行に出くわします:これが実際にファイルを作成する行です。事実、それはファイルの存在に無関係にファイルを作成します!もし、すでに存在していれば、それは新たに書かれます(古いものは削除されます)。

これで疑問が解決したでしょうか?重要なことは folderitem はファイルではないと言うことを理解することです。これは少々混乱する点です:私が最初に REALbasic を始めたときに、私もしばらくの間当惑していたことを憶えています。適当な類推としては、保護ガラスの後ろで放射性物質をロボットアームで操作している科学者を思い浮かべて下さい。ロボットアームは完全にユーザによって制御されていますが、ユーザは決して放射性物質には触れていません。folderitem はそれらのロボットアームのようなものです:ユーザであるあなたは決して直接にはファイルに触れません。あなたは folderitem の属性あるいはメソッドを通じて REALbasic に何かをするように指示します、すると REALbasic は実際のファイルに対してそれを実行します。folderitem を作成する過程は単純にロボットアーム(folderitem)に正しい放射性物質の固まり(ファイル)を対応づける手段です。このようにして、あなたがアーム(folderitem)を操作したときに、正しい物質(ファイル)が変更されます。もし、あなたがアーム(folderitem オブジェクト)を適切に作成しないと、アームは存在しません(nilの状態です)。

この類推がほんの少しでも物事をはっきりさせることを願っています。

RBUの通知への申し込み!

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

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

INDEXに戻る