RealBasic University

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

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

カスタムクラスの作成 II

先週、複数のプログラムで簡単に再利用できるユーザー定義クラスの作り方を学びました。その用途を証明するのに適した二つの例示クラスをつくりましたが、それらは、特に有用なものでは有りませんでした。今週は非常に有用な文字入力欄EditFieldクラスを作ります。それは自動的に(透過的に)無制限のアンドゥを可能にするものです!

いつものように、ここで完成したプロジェクトをダウンロードするか、あるいはコラムに従って一歩一歩作ることもできます。(この例は先週のクラスも含んでいます。)

UndoEditFieldClass

あなたは文字入力欄のあるダイアログボックスがあって、それがアンドゥをサポートしていたら良いだろうと思ったことは有りませんか? もちろん、アンドゥ機能を追加するのは簡単ではありません。そして、だれも、そんなことで煩わされたくありません。

もし、文字入力欄にアンドゥを追加するのが、クラスをドラッグしてプロジェクトに追加して、文字入力欄のsuperをUndoEditFieldClassにただ置き換えるだけできれば、あなたのダイアログボックスはすべてすぐにアンドゥ能力を持つようになるでしょう。

良いニュースは本当にそれ程簡単なのです。

我々は新しいクラスを作ることから初めましょう(Editメニューから"New Class"を選択して下さい)。それをundoEditFieldClassと命名し、そのsuperを"EditField"(文字入力欄)とします。

次に、クラスに属性を追加します(ダブルクリックしてEditメニューからより "New Property" を選択して下さい)。そして、undoString(0) as stringを追加します。

この変数は取り消しのテキストを保存する文字列の配列となります -- これにより無制限のアンドゥが可能になります。

アンドゥの基本的なシステムについて考えましょう:まず、ユーザーの記述を記録し、過去の内容を保存し、ユーザがアンドゥコマンドを選択した時には過去の内容を復元します。そこで、この最初の部分 -- ユーザーがタイプするものを監視する -- はKeyDownイベントで行います。

KeyDownイベントに移動し、以下のコードを追加して下さい:

   undoString.append me.text 

これの行なっていることは、テキスト欄の内容をundoString配列に保存しているだけです。appendメソッドは自動的に配列のメモリーを追加し、最後の要素に渡されたテキストを追加します。

次に、アンドゥのためのメニューが必要になります。REALbasicが自動的にアンドゥコマンドに対するメニューを作成するため、我々はそれを作る必要はありませんが、我々がここにいる間に、便利な "Select All" コマンドをクラスに追加しましょう。

プロジェクトのメニューを開いてEditメニューをクリックします。ドロップダウンするメニューの一番下は空白の四角のはずです。それクリックしてハイフォン("-")を入力してリターンを押して下さい。これでメニューに分割線を追加できます。もう一度空白の四角をクリックして、"Select All" と入力してリターンを押します。今回は"Select All" がまだ選択されている間に、属性パレットに行きCommandKey欄に"A"と討ちこみます。

これによってメニューはこのようになっている筈です:

良くできました。次に、メニューアイテムを選択可能にしましょう。undoEditFieldClassEnableMenuItemsイベントに以下を入力しましょう:

   if uBound(undoString) > 0 then 
editUndo.text = "Undo Typing " + str(uBound(undoString))
editUndo.enabled = true
else
editUndo.text = "No Undo"
end if

if me.selLength <> len(me.text) then
editSelectAll.enabled = true
end if

ここでは、なにをしているのでしょう? まず、アンドゥメニューコマンドを適切に選択可能にします:もし、undoの内容が空であれば(undoStringの中に何も入っていなければ)このコマンドを選択可能にしません。次に、アンドゥメニューの名前をアンドゥの状態と元に戻せる回数を反映したものに変化させます。

最後に、フィールド内のテキスト全てが既に選択されているかを調べます。もしそうでなければ、"Select All" を選択可能にします。

簡単でしょう? これらのメニューハンドラーを追加しましょう。Editメニューの"New Menu Handler" を選択して、ポップアップメニューからEditSelectAllを選択します。同じようにして、EditUndoのハンドラを追加します。

次は、テキスト全体を選択する簡単なコードです(これをEditSelectAllハンドラに追加して下さい):

   me.selStart = 0 
me.selLength = len(me.text)

これは選択の開始を文字入力欄の先頭にし、選択の長さを文字入力欄のテキストの長さに設定しているだけです。これにより、文字入力欄は全て選択されることになります。(我々は文字入力欄クラスの変型の中で作業をしていることを忘れないで下さい:meは現在のオブジェクト、すなわち文字入力欄を意味しています。)

続いて、EditUndoハンドラに行き、以下を入力します:

   // Undo to saved values 
me.text = undoString(uBound(undoString))
redim undoString(uBound(undoString) - 1)

// Move cursor to end
me.selStart = len(me.text)

これは、3つのことを行います。1つ目は、undo 用配列の最後に保存されているテキストを文字入力欄に入力します。つまり、最後に保存されたデータに戻すのです。次に、undo 用配列(undoString)の大きさを1一つ減らして最後の項目を消去します。そして最後に、カーソルを文字入力欄の最後に移動させます。

次は何でしょうか? これで終わりです。我々のundoEditFieldClassは完成したのです!

試しに、文字入力欄をウィンドウに追加し、そのsuperをundoEditFieldClassにしましょう。(もし、別なプロジェクトであれば、undoEditFieldClassをドラッグしてプロジェクトにコピーする必要があります。)

プログラムを実行すれば、文字入力欄に入力されたものは全て記録されます。それで、あなたは最初の1文字に至るまで容易に元に戻すことができます。

このクラスは効率が悪いことに気をつけて下さい:ユーザーがタイプするたびに全てのテキストを保存しています。これは、ユーザが長い文章を入力したとすると、我々はその文章の数百のコピーをメモリー上に持つことになります。もちろん、ダイアログボックス内の少ない文字を入力する単純な文字入力欄では、このことは問題ではないでしょう:しかし、あなたはワープロの場合にこれを使いたくないでしょう(もしくは、アンドゥの回数を10回や20回程度にしたいと思うでしょう)。

次にすることは?

これで、例題のプロジェクトは完成しました、クラスをデスクトップにドラッグしてモジュール作り、それをドラッグしてこれからのプロジェクトに追加することができます。これにより、あなたのプログラムの全ての文字入力欄に簡単なアンドゥ機能を即座に追加することができます。

そのためには、undoEditFieldClassをプロジェクトにドラッグして、それからアンドゥ機能を追加したい全ての文字入力欄のsuperをundoEditFieldClassにセット -- これを忘れないで下さい -- するだけです。

これと同じことを、boxClassonOffClass(先週の例題)にも行うことができます。ただし、それらはあまり実用的では有りません(しかし、それらも便利な変型をつくる元となり得ます)。

次週

我々は大きなプロジェクトRBU Pyramid(典型的なソリテリア(トランプゲーム)の一種)始めます。

News

REAL Software社は最新のREALbasic、RB 3.5を先週リリースしました(訳注:現時点ではRB 4.0が出ています)。このバージョンはいくつかの興味深い機能が追加されています。

RBUの評価

私は通常RBのベータ版は使いませんので、これらの新しい機能を十分に検証する時間がありませんでした(デモ用プロジェクトをREAL Software社のサイトからダウンロードして、それらの新しい機能を確かめることができます)。表面的にはそれらの機能は素晴らしいでしょうが、実際的にはそれらがどれほど使用されるか疑問に思います。

Office の自動化機能はMicrosoft Officeを持っていることを前提としますし、それについて読んだところでは多くの制約があるようです(何れ修正されるでしょうが)。私にはそれを何に使うのか理解できません -- 私はMicrosoft製品にさらに依存するのではなく、自分のシステムからそれらを一掃しようとしているところです。

正規化表現は多くの要望があったものです。しかし、わたしはそれがスタイルを含むテキストでうまく動くのか疑問に思います(あなたにとってはそうでは無いかも知れませんが、私にはその魅力は半減します、)。

これに対して、RBScriptは興味深いものです。理論的にはそれをプラグインのような機能をプログラムに追加するのに使用できます(AppleScriptsをプログラムに追加する代わりに、プラグインをREALbasicの構文で書くことができます)。

同じように、3D engineも素晴らしい機能追加です。しかし、私は複雑なグラフィックス(特に3D)に少し恐れをなしています:それがどれ程使いやすいかを確かめる必要があるでしょう。

もっと失望するのは長年のバグと制限がいまだに残っていることです;私はREAL Software社が頻繁にアップグレードすることを勧めはしますが、あまり使われない機能(Office Automationのようなもの)を新しく追加する前に、既知の問題が解決され、既存のツール(リストボックスや文字入力欄のような)が強化されることを希望します。

全体として、しかしながらこれは全体として素晴らしいアップグレートです。また更新費用もstandard versionが$29.95と適切です(しかし、professional版の更新には$89.95ともっと費用がかかります)。

Letters

今週はCapさんからで、REALbasicでのゲームの作り方に関する質問です。

Marcさん、今日は!

まず最初に、私は1日に10時間ほどもRealBasicでプログラムをしている人種では無いことを言っておかなければなりません。しかし、私は8ヶ月掛かって作った最初の「大きな」アプリケーションをあと1ヶ月ほどでリリースしようとしています。

さらに、私は談話室や他のウェブサイトを訪問したり、RBに関するニュースを見たり、他の人の開発したベータ版をテストしたりしています。

それで、判ったことは何か? RBのコミュニティ全体(そうですね、その大部分)はゲームを書く時にはC, Directorなどの他のツールを使っていることを知りました。そうですね、それはRBの3Dがまだ開発段階であるからかもしれませんが、私はそれ以外の原因があると思います。どのプログラム言語を使おうと、沢山のゲームの例があちこちにあります(例えば、mactechに)。しかしRBに関しては、Strout氏のSidescrolling Shootersと幾らか凝ったFirstPerson-Shootersのデモがあるのみです(PacManがその辺にあるかも知れません)。簡単でクールなゲームを作ることの可能なRealBasicでNetzee と Stratega (GameRangerでさえサポートしているゲーム)はどこかで開発されていないのでしょうか。我々は第二のTombRaiderを書こうとしたり、Diabloなどの作戦ゲームを作ろうというのではありません。もっと簡単なゲームにはなぜRealBasicの長所を利用しようとしないのでしょうか。NetFungus(IMROM ソフトウェア、GameRanger対応)やAirburst(Aaron&Adam Fothergil)を見てみましょう。これはRBで作ることができると思います。そして、初心者がそれをみたならば、ゲームを書く時にも他のツールを使うことはないでしょう。ですから、Marcさん、もしあなたがRB Universityのために何かを捜しているならば、Tetrisのような、あるいはボードあるいはトランプゲームの例題を考えてみて下さい。

頑張って下さい、 Capより

素晴らしいタイミングです、Capさん! 私はなぜ人々がゲームには他のツールを使う理由は良く判りません。正直なところ、REALbasicのアニメーション機能には問題があります、そしてスプライトには既知のバグがあります(特に、Mac OS Xでは)。しかし、3Dの射撃ゲームを作るので無い限り、それらのバグは致命的であるとは思いません。(そして、C++プログラマがゲームを数フレーム速くするのに行う低いレベルの最適化を考えた時には、RBで3Dゲームを作るということはばかげたことです。)

個人的には、私が書きたいゲームは簡単なサイコロやトランプゲーム、パズルなどです。それらはREALbasicにぴったりです。 事実、我々の次のプロジェクト(来週から始まる)はトランプゲームです。それはかなり凝ったPyramidゲームの一種で、多分一月か2ケ月掛かるでしょう(訳注:実際には5ヶ月ほど掛かっています)。しかし、それはゲーム、特に単純であって面白い代表的なゲームのプログラムにREALbasicを使ってみようという気にさせると思います。

このような手紙をお寄せ下さい。私はあなたの質問に直ぐには答えないかも知れませんが、たぶん今後のコラムで取り扱うでしょう。(もし、あなたの手紙が公表されるのを望まない場合には、その旨を明記して下さい。そうでなければ、公表してもいいものとして取り扱います。)


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

INDEXに戻る