RealBasic University

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

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

2つの個人用プログラム例

先週、私が個人用に作成した幾つかのREALbasicのプログラムを紹介しました。それらの幾つかはかなり複雑なものでした -- それらがどのように動作するのかを短い文章で説明するにはあまりにも複雑です(私はそれらの小さなプログラムに時間を費やすのではなく、RBの可能性についての感触を得てもらいたかったのです。)

私はREALbasicの力と便利さを証明すると思われる非常に簡単な2つのプログラムをここに用意しました。今週のコラムではそれらを詳しく見てゆきます。

Fast Finger

一年くらい前、私はABC放送の大富豪になりたいを見つけ出し、そして、しばらくの間それを定期的に見ていました。(時間がなかったので最終的には諦めましたが、私は今でもこの番組が好きです。)私は競技者として申し込んだこともことさえありました。不幸にも、私の腕前は並以上ではありますが、速さに関しては人並み以下です。私に四つのありきたりの家庭用電気器具をアルファベット順に10秒で並べようとさせても、答えは白紙のままだと思います。

私は家で番組を一緒にするのが好きでしたが、"Fastest Finger" コンテストはいつも私を悩ませました:それはあまりにも速いので時間を測るのも困難なほどでした。そして、私は自分の答えの3もしくは4番目の答えを時間をかけて見つけたときには、1番初めの部分で何を選んだかを忘れていました。

もちろん、それは不公平です:競技者達は彼らの答えの順序をセットするために押すことができるボタンを持っていましたが、私はストップウォッチを見続けながら全てのことを覚えなければなりませんでした。

それで、ある夜の番組の間に、私は開いたREALbasicを鞭打って、Fast Fingerを作りました。これは、ただ1つのことをするためだけにデザインされた洗練されていない単純なプログラムです:あなたが四つのボタンをどの位速く押したかを記録するだけです。ただそれだけです。もし、あなたが番組を見ているときにこれを走らせれば、あなたは番組の"Fastest Finger"の部分で他の競技者と競争することが出来ます。

それは凝ったものではありませんし、ほとんど何の役に立たないものです。しかし、それはコマーシャルの間にすることを私に与えてくれました。それはまたREALbasicの幾つかの素晴らしいことを証明しています。そして、もし、あなたに運があれば、それはあなたのゲーム番組の上達を助けてくれさえもするでしょう。

Fast Fingerのユーザーインターフェイスは少し複雑ですので、私はそれを全てが完成した形で示そうと思います。このようにすれば、あなたがすべき事は数行のコード(私が説明する)を追加するだけで、あなたの指のスピードをテストする準備がすべて完了するでしょう。

まず次のREALbasicプロジェクトをダウンロードして下さい(あなたはそれを解凍するためにStuffit Expanderが必要になるでしょう。):

fastfinger.hqx

プロジェクトをREALbasicで開きます (これは RB 2.1フォーマットなのでREALbasicの2.1 もしくは 3.xで動くでしょう)。IDEでは Window1は次のようになるでしょう。

このプロジェクトはこの時点では何もしません:それはコードのないただのインターフェイスです。始めに、メインのウィンドウであるWindow1に、重要な属性を付け加えましょう。我々はこの属性を Window1に付け加えます。なぜならば、我々は Window1の全てのルーチンがこの属性にアクセスする(それを見る、または変更する)ことを可能にしたいからです。

Editメニューに行き、"New Property"を選び、そして 現れたダイアログボックスに"startTime as double"と入力します(引用符なしで)。それからOkayをクリックする、もしくはreturnを押します。

我々は最初のコードを Timer1のオブジェクトに付け加えます。タイマー はある時間が経過した後に実行される特別なREALbasicのプロジェクトです。あなたはタイマーの period 属性に時間をミリ秒でセットします。この場合、私は Timer1 をあらかじめ10 ミリ秒にセットしました:これはTimer1のAction ハンドラの中のどのようなコードでも1秒あたり100回実行されることを意味します。

Window1上の Timer1を選び(もしウィンドウが閉じていたら開いて)、そして Option-Tab(Optionキーを押しながらTabキーを押します)を押します。これによりTimer1の Action イベントに対応するところでコードエディタが開くでしょう。

では、次のものを入力します(もし望むならば、それをコピーしてペーストしても結構です):

Window1.Timer1.Actionのコード

 dim theTime, secs, huns as double 
theTime = microseconds
secs = (theTime - startTime) \ 1000000
huns = (((theTime - startTime) - (secs*1000000)) \ 10000)
Label.text = "00:" + format(secs, "00") + ":" + format(huns, "00")

上のコードがしていることは現在の時間を示す時計を表示するのことです。我々は現在の時間の1000分の1秒を得るためにREALbasicの microseconds 関数を使っています。そして、その情報を秒読みがスタート (startTime) してからの秒数と百分の1秒の秒数の2つの部分に分けています。そして、最後にテキストオブジェクトに時間を表示しています。

では、プッシュボタンを考察しましょう。あなたは Window1に4つの目に見えるボタンがある一方で、コードエディタのコントロールリストには1つのボタンしかないことに気が付いたでしょう:

4つのボタンがリストされるべきではないのでしょうか?

いいえ、そうではありません。なぜならば、私は コントロール配列という特別なREALbasicの機能を使用したからです。GenderChangerを作っていたときに、配列について学んた時のことについて覚えていますか。そう、コントロール配列はコントロールを含む配列なのです。この場合は、pushButtonです。普通の配列と同じように、配列内の個々のオブジェクトには指数を使ってアクセスします。(コントロールリストの中の Button()は最後には括弧があることに気付きましたかく:その括弧はそれがコントロール配列であるという事を思い出させるためものです。)

Button()のコントロール配列の指数はゼロから始まるということに注意して下さい、そしてボタンは1-4ではなくてで0-3になります。)

コントロール配列の利点は膨大です:それぞれが同じコードをもつ別々の4つのボタンを用意する代わりに、1つのコードの1つのボタンを使うことが出来ます!我々はREALbasicが全てのイベントに対して設定する Index をチェックすることによって、ユーザーがどのボタンをクリックしたかをいつでも知ることができます。

追記

コントロール配列はどのようにして作るのでしょうか?それは簡単です。二通りの方法があります。コントロールがIDEで選択されている状態で、属性パレットに行き、 Index 欄に数値をいれます。 Index 欄は普通は空白ですが、そこに数値を入力すれば、REALbasicはあなたがコントロール配列を作ろうとしていると考えます。

その後、コントロールを複製すれば、REALbasicは自動的に新しいコントロールのための指数を増やすでしょう。

コントロールの配列を作るための他の方法は同じコントロールのいくつかの名前を一致させることです。REALbasicはあなたがコントロール配列を作りたいかどうかをたずねるでしょう。もし、イエスと答えれば、RBはあなたのためにコントロールに番号を付けるでしょう。

この場合には、我々はボタンを処理するためのメソッド(この後すぐに作ります)に押されたボタンを渡そうとしています。我々がボタンの Action ハンドラに書くことは以下のとおりです(もちろん、太字のタイトルは含みません):

Window1.Button.Actionのためのコード

 doButton(index) 

次に、Window1の Open メソッドへ行きましょう。ここで我々がすることの全ては、プログラムが起動されたときに、4つのすべてのpushButtonが選択不能であるようにすることです。我々のボタンはコントロール配列ですので、これは簡単です。

Window1. Openのためのコード:

   dim i as integer 
for i = 0 to 3
button(i).enabled = false
next

では、Window1のKeydownイベントへ行きましょう。このメソッドはユーザーがキーを押すときにはいつも呼ばれます。我々がここでしたいことは、キーを押すことでボタンが押されたことを模倣することです。言い換えれば、ユーザーはボタン"A"をクリックする、"A"をタイプする、もしくは"1"をタイプすることが出来ます。そして、それら全ての動作は同じ結果をもたらします。

このことをおこなうために、我々はselect case文を単純に使います(詳しくRBのヘルプを見て下さい)。そして、もしユーザーが適切な文字や数値を打ったときには、我々は"doButton"ルーチンへコマンドを送ります。

Window1.KeyDownのためのコード:

   select case uppercase(key) 
case chr(13) // return key
if startButton.enabled then
startEverything
end if
case "1"
doButton(0)
case "2"
doButton(1)
case "3"
doButton(2)
case "4"
doButton(3)
case "A"
doButton(0)
case "B"
doButton(1)
case "C"
doButton(2)
case "D"
doButton(3)
end select

この魔法のような"doButton"ルーチンは何をするのでしょう。さあ、一緒に考えましょう!Editメニューへ行き"New Method"を選んで新しいメソッド Methodを作りましょう。メソッドの名前には"doButton"(引用符無し)を使います。メソッドのパラメーターには、"index as integer"と書きます(これによりこのルーチンはボタンの番号を受け取ることができるようになります)。返り値は空にしておきます、そしてOkayををクリックします。

メソッドのコードエリアで、以下のコードをタイプ(あるいはペースト)します:

Window1.doButtonのためのコード:

   if button(index).enabled then 
button(index).value = true // make it look pushed
button(index).enabled = false // disable it

// Displays the buttons in the order you pressed them
answers.text = answers.text + button(index).caption + chr(13)

// Check to see if all four buttons have been pressed;
// if so, we stop the clock and enable the Start button.
if not (button(0).enabled or button(1).enabled or button(2).enabled or button(3).enabled) then
timer1.mode = 0
startButton.enabled = true
end if
end if

では、startButtonのActionメソッドへ行き、"startEverything"(引用符無し)をタイプします。これはプログラムを初期化する(時計のゼロにセットしたり、全てのボタンをオンにするなど)ための別のルーチンとなるでしょう。

パラメーターや返り値のない"startEverything"と呼ばれる新しいメソッドを作りましょう。ここにstartEverythingのコードを示します:

Window1.startEverythingのためのコード

   dim i as integer 
startButton.enabled = false

for i = 0 to 3
button(i).enabled = true
button(i).value = false
next

answers.text = ""
startTime = microseconds
timer1.mode = 2

見てお判りのように、これは簡単です。

いいですか?これで終わりです!それは全てのプログラムなのです。それを走らせれば、あなたはタイマーをスタートし、ボタンをクリックすることができるでしょう。そして、ちょうどテレビのように、あなたがそれらをクリックした順番や所要時間がわかります。以下はプログラムが動いているときの様子です:。

もし、あなたがこの全てのコードをタイプするが嫌ならば、そのままコンパイルして実行できる出来上がったプロジェクトが以下にあります。

fastfingerfull.hqx

Count Emails

私が示したい第二のプログラムは、ある日、私のStone Table Softwareの顧客リストを調べている時に書いたものです。私は全てのemail -- 多くは外国から来ていました -- を見ていました、そして私の顧客の国別の比率がどのようになっているかと思い始めました。Emailアドレスとドメイン名は人々の国籍を決定ずける確実な方法ではありませんが、それらから少しは解ります。

だから、私は座って、emailのテキストファイル(一つのラインにつき一つのemail)を受け入れ、拡張子(.com, .netなど)によって分類し、計数するこの短いプログラムを書きました。

最初に、REALbasicの新しいプロジェクトを作ります。デフォルトでつくられるWindow1をもとに、その中に リストボックスをドラッグします。そしてリストボックスをWindow1一杯になるように広げます。

ListBox1の属性で、HasHeadingのオプションをチェックし、コラムの数として"3"を入力します。columnWidthsに対しては、"50%, 25%, 25%"を入力します。(それはListBox1を3つのコラム(始めは50%の幅で、残り2つは25%)に分割するでしょう)そして、属性ウィンドウは以下のようになるでしょう:

ListBox1が選択された状態で、Option-Tabでコードエディタを開きましょう。ListBox1の Open イベントへ行きます。ここで、以下のコードを入力します:

Window1.ListBox1.Openのためのコード:

 me.acceptFileDrop("text") 
me.heading(0) = "Domain"
me.heading(1) = "Quantity"
me.heading(2) = "Percentage"

上のコードは2つのことを行います:1つ目は、テキストファイルがドロップできるようにListBox1を設定することで、2つ目は、リストボックスのヘッダに名前を付けることです。

この間に、我々のプロジェクトに"text"のファイルのタイプがあるかを確かめましょう。Editメニューへ行き、"File Types"を選びます。もし、"text"と名付けられた項目があれば、それで完了です。もし、そうでないならば、あなたはそれを付け足す必要があります。(定義づけられたファイルタイプが無ければ、REALbasiclはユーザにどの種類のファイルをリストボックスにドロップする許可を与えるのかを知ることができないでしょう。)

"Add"ボタンをクリックし、それを"text"と名付け、クリエーターに"ttxt"、Typeに"TEXT"を指定します。Okayを二回クリックをすれば、それで終わりです。

では次に、DropObjectイベントへ行きましょう。これはプログラムの中心部分です。ここではユーザーがコントロールにテキストファイルをドロップします。だから、我々はまずユーザがファイルをドロップしたことを確かめ、それからそのファイルを開きます。我々はテキストファイルのそれぞれの行を配列theListにロードしてから、それを閉じます。我々は幾つかの他のルーチン--stripList, sortIt, countDuplicates やupdateList --を呼びます。

Window1.ListBox1.DropObjectのためのコード

  dim in as textInputStream 

if obj.folderItemAvailable then
if obj.folderItem <> nil then
in = obj.folderItem.openAsTextFile
if in <> nil then
// Erase the arrays
redim theList(0)
redim itemCount(0)

do
theList.append lowercase(in.readLine)
loop until in.EOF
in.close
stripList
countDuplicates
updateList
me.headingIndex = 1 // sorts by quantity
end if
end if
end if

それら全てのメソッドをこれから作ることになります。では、始めましょう。どのメソッドもパラメーターや返り値を一つも持っていませんので、それらは簡単です。私は全てのものを最初につくって、それからコードを作る方が容易であると思います。では、Editメニューへ行き、"New Method"を繰り返し選び、以下の名前をメソッドに使用します:

stripList
countDuplicates
updateList

全ての三つのメソッドの準備ができれば、stripListからとコードを書込みましょう。これはemail アドレスからemailの拡張子以外を削除するルーチンです。使用しているアルゴリズム algorithmは単純です:それはピリオドによって区切られた最後の節を単に捜しています。全てのemailアドレスはピリオド-何がしで終わっていますので、ピリオドの右側のテキストは保存され、その他全てのものは捨てられ(取り除かれ)ます。このようにして、emailのリストは単純な"com"や"net"、その他の拡張子に分けられます。

例えば、つぎのものは

idiot@whatever.co.uk
yahoo@yahoo.com
guy@thisplace.ch
moron@aol.com

以下のようになります:

uk
com
ch
com

Window1.stripListのためのコード

   dim n, i as integer 

n = uBound(theList)
for i = 1 to n
theList(i) = nthField(theList(i), ".", countFields(theList(i), "."))
next

追記

以上のコードはどのように働くのでしょうか。そうですね、重要な部分はfor-next ループの間のコードでしょう。そのことをより理解するために、サンプルのアドレスを使いながら、コンピューターが行うように頭の中でそれを実行してみましょう。

例えば、"moron@earthlink.net"というアドレスの行があったとしましょう(theList(i)は"moron@earthlink.net"となります)。これは、上の重要な行は実際には以下の通りであるということを意味しています:

 theList(i) = nthField("moron@earthlink.net", ".", countFields("moron@earthlink.net", "."))

その最後からまず調べましょう。countFields("moron@earthlink.net", "."))のコードはピリオドで区切られた文節のフィールドの数を返します。文節の中にはひとつのピリオドだけがあるので、ここには二つのフィールドがあります("moron@earthlink" と"net"で、ピリオドの右、左の部分です。)それで、countFieldsを数値2(結果)に置き替えましょう。。

 theList(i) = nthField("moron@earthlink.net", ".", 2)

我々のコードは事実上「'moron@earthlink.net'の2番目のフィールド(最後のもの)をtheList(i)の中に入れよ」と言っていることになります。2番目のフィールドは"net"ですので、我々は"moron@earthlink.net"を"net"に変えたのです。

CountDuplicatesはもう少し複雑です。それは全てのリストをループして、それぞれの拡張子の数を数えす。それが同じものを見つけたとすると、それは2つのことをします:それはtheListからその同じものを削除します、そして、その項目のカウントに保存されている数値を増加させます。(その項目のカウントはitemCountの配列に保存されています。)

最も外側のループにforループを使っていないことに気が付きましたか;私は、その代わりとしてwhileループを使いました。私がこれを使ったのはループの大きさが変わるからです:同じ項目を見つけたときには、我々はそれを削除し、リストの中の項目数を減少させます。whileループを使うことは、コンピュータが最後のユニークな項目に達するまでリストをループし続けるということを意味します。

Window1.countDuplicatesのためのコード

   dim total, n, i, j, found as integer 

i = 1
while i < uBound(theList)
redim itemCount(uBound(theList))
found = 0

n = uBound(theList)
for j = 1 to n
// Check through
if theList(i) = theList(j) and i <> j then
found = j
end if
next // j

if found > 0 then
itemCount(i) = itemCount(i) + 1
theList.remove found
else
i = i + 1
end if
wend

// Figure out percentages
n = uBound(itemCount)
total = 0
for i = 1 to n
total = total + itemCount(i) + 1
next // i

redim percentList(n)
for i = 1 to n
percentList(i) = ((itemCount(i) + 1) / total)
next // i

CountDuplicatesの最後の部分はそれぞれのemailの拡張子の比率を見積もることです。そのためには我々は始めに総数が必要です:リストの中の要素の数ではなくて、emailの全総数です。ですから、我々はitemCount配列をループして計数し、それぞれの項目を足しあわせます。itemCountの要素はその項目がたった一つであるならば、ゼロになっていますので、実際ののカウントを得るためにそれに1を足しています。

我々はpercentList配列を自分たちのリストの大きさに初期化して、それから配列のそれぞれの要素に対応するパーセンテージをセットします。itemCount値に1を再び足していることに注意して下さい。

プログラムの最後のメソッドはupdateListです。これはlistBox1に情報を表示するのに使われます。それは最初にlistBox1の中に存在しているすべての行を削除します(もしあなたがそれをしなかったならば、既存のlistboxの中に別のファイルをドロップすれば間違った内容を表示するでしょう)、そして項目のリストをループして計数します。

それはリストの中のそれぞれの項目に対して、リストボックスの対応するコラムに内容を設定します。まず初めの項目はaddRowコマンドで設定します:それは".com"もしくはemailアドレスの一部です。行を一度付け加えたならば、別のものを付け加えないで、今追加した行を続けて処理したいと思います。ですから、我々は今追加した最後の行の指数を保持しているlastIndex属性を使います。我々は実際の項目のカウント(ここでも、それに1を加えています)とパーセンテージを対応するコラムに設定するをためにcellメソッドを使っています。

Window1.updateListのためのコード

   dim n, i as integer 

listBox1.deleteAllRows
n = uBound(theList)
for i = 1 to n
listBox1.addRow theList(i)
listBox1.cell(listBox1.lastIndex, 1) = format(itemCount(i) + 1, "000")
listBox1.cell(listBox1.lastIndex, 2) = format(percentList(i), "00.#%")
next

これで我々のプログラムはほとんど完成しました:Window1に我々の配列を属性として付け足す必要があるだけです。だから、Window1のコードエディタのウィンドウが見える状態で、Editメニューへ行き、"New Property"を選びましょう。これを3回繰り返して、次の属性を追加します:

itemCount(0) as integer
percentList(0) as double
theList(0) as string

プログラムを保存し、それを実行してみましょう。それはその中のリストボックスを持つも簡単なウィンドウを表示するはずです。

あー、しまった!これをテストするためにはいくつかのemailアドレスが必要ですよね、そう思いませんか。では、私が作った多分架空のアドレスのリストを以下に示します。(私は多くの拡張子を使うようにしてみました。)それらをテストファイルに保存しましょう。そうすれば、あなたはそのテキストファイルをリストボックスにドラッグすることができるでしょう。(あなたのハードディスクにテキストファイルを保存するために、このlinkをOption-clickします。)

idiot@whatever.co.uk
yahoo@yahoo.com
guy@thisplace.ch
moron@aol.com
yes@no.no
idiot@earthlink.net
moron@earthlink.net
someaddress@dingo.au
moron@sympatico.ca
italianguy@h.it
frenchguy@paris12.fr
idiot@aol.com
waffle@panda.be
noone@columbiau.edu
sg@interkom.de
school@drakey.edu
barf@is.is
ziggy@ipalot.net
teacher@mail.k12.md.us
moron@yahoo.com
jondough@unisono.net.mx
babes@blondes.se
apple@mac.com
none@all.nl

リストボックスにファイルをドラッグすれば、あなたのウィンドウは以下のようになるはずです:

いつものように、その全てのコードを入力するのが嫌いな人々のために、ここにすぐにコンパイルして実行できる完全なプロジェクトを置いておきます。

countemails.hqx

素晴らしい。これで今週は終わりです。私はこれらの短いプログラムが有益で、あなたは何かを学んだと思います。それらはREALbasicの真の力を表わしています:お金をほとんど使わずに小さな問題への解決策を素早く創りだす能力です。

次週

我々はスプライトを使って簡単な2次元ゲームをつくって小さなアニメーションに挑戦しましょう。

Letters

REALbasicでしたいこと、という先週の調査に答えてくれたあなた方、ありがとう!私は沢山のお返事を頂きました。そして私は今後のコラムの中で要約を公表していきたいと思います。もし、あなたがまだ回答を送っていない場合には、直ぐにここまで 送って下さい。

今週の最初の質問はTim と Sarah Reicheltさんから送られてきたものです:

こんにちは。

簡単な答えがあるとは思いますが、。リストボックスのテキストの色はどのようにしたら変えることができるのでしょうか。私は全てのリストの色を変えることでさえできません。私は異なった行で違う色を指定したいのです。

興味ある質問です!私はこのようなことを一度も思ったことはないとは奇妙です。しかし、あなたがしたいことを行う方法はないようです。REALbasicは個々の行あるいはリストボックス全体の内容の色を設定するメソッドを提供していません。もしこれが、あなたが本当に必要とするものならば、REAL Software社にバグの報告をし、その機能を追加するように要求するべきです。

その機能が追加されるまでは、2つの可能な回避策があります。しかし、全ての回避策と同様に、それらには制約と欠点があります。最初の方法は、もし誰かがテキストの色を変えることのできるリストボックスの代替え品を作っているかウェブをチックすることです。もっと巧妙なコントロールをつくるこののできるREALbasic のためのplug-insがあります、また基本的なコントロールに似せたRBで作られたクラスもあります。(このページの先頭にリンクされているRB web-ringから検索を始めるといいでしょう。)

もしあなたのリストボックスへの要求がそれほどでもなければ、別のアプローチはあなた自身のリストボックスのクラスをつくることでしょう。それは私がここで詳しく述べるよりも少し複雑です。しかし、もしあなたが複数のコラム(列)や編集可能なテキスト、フォルダーや絵のようなリストボックスの機能を必要としないならば、キャンバスやスクロールコントロールを使って自分用のリストボックスをつくるのはそれほど難しくはありません。キャンバスは単にグラフィックの領域です:そこにそれぞれの行を異なった色でテキストを書くことができます、そして、そのテキストをスクロールするのにスクロールバーコントロールが使えます。(あなたにとってそれがうまくいくようで、ネット上で解答を見つけられないならば、私に知らせて下さい:私はRBUのプロジェクトの例としてこれをつくるのも面白いと思っています。)

私はまた一つのパラグラフの中に多くの質問を含んでいるSteven卿からの手紙も受け取りました。

グローバル(大局的)変数をどのように作っていますか。あなたはかつてメソッドを使うことができるということについて言及されましたね?文字入力欄の全てをみたす必要はありますか?その値をどのように変えるのでしょうか?グローバル変数を使用する、もしくは作成する他の方法はありますか?追伸:val() や str()の接頭語はたくさんの問題を解決しました。私はどこにもその方法を見つけることはできませんでした。

Steven卿、リターンキーを使うことを学んでください!これは冗談です。わたしができる限りのあなたのへ質問に対する答えは以下の通りです。

グローバル変数の作り方 モジュールのなかに属性として変数を定義します。モジュールは本質的にグローバルで、モジュールの中に置かれたどのような属性でもあなたのプログラムの全ての部分で利用可能です。

メソッドの利用  REALbasicでの メソッドは別の言語でのプロセジュア/関数/サブルーチンに対応するものです。(ところで、もしあなたがモジュールの中にメソッドを置いたとすると、それはまたグローバルになります。)

全ての文字入力欄を満たす必要がありますか? 私はこの質問の意味がよく判りません;あなたは属性ウィンドウの入力欄のことを言っておられるのでしょうか?もしそうであれば、答えはノーです:あなたがそれらを置き換えなければREALbasic は規定(標準)値を使います、ですから必要なものだけを変更すればいいのです。

グローバル変数を作る他の方法はありますか。いいえ、ほとんどそれだけです。もしあなたがオブジェクト(ウィンドウなどの)の一部である属性を定義すれば、その変数はそのウィンドウのみで有効です。もちろん、あなたはそれを指名することによって別のオブジェクトからそれに直接アクセスすることができますの。ですから、面倒なだけで、それにアクセスできないと言う訳ではありません。例えば、もしWindow1myVarと呼ばれる属性を含んでいるとするならば、Window2の中のルーチンはWindow1.myVarとする事によってそれにアクセスすることができます。

グローバル(大局性)にも段階があることを心にとめておいて下さい:Window1にローカルな属性は本質的にWindow1に対してはグローバルです。(Window1の中の全てのルーチンはそれの変数にアクセスすることができます)。それはあなたが必要とする全てかもしれません。しかしながら、特別なメソッドの中で作られた変数はそのメソッドの中だけで使用できるだけです:他のルーチンはそれにアクセスすることはできません。ですから、真のグローバル変数は全てのルーチンはそれにアクセスすることができるようにモジュールの中で作られなければなりません。

これがお役に立つことを祈ります;もし私があなたの質問のどれかを誤解しいているならば、次回に改めたいと思いますので、お知らせ下さい。

RBU の新しい機能

このコラムとそして過去の全てのRBUコラムの上部に、特別な"Print this article"リンクがあるのに気が付きましたか。これは印刷用にフォーマットされたコラムへのリンクです。もし、あなたが自分のハードディスクに保存したければ、ウェブブラウザーの"Save as web archive"使うか、あるいはJim Walker氏のPrintToPDFを使い、PDFファイルとして印刷することが出来ます。


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

INDEXに戻る