この文書は Runtime社のホームページにある、http://www.runrev.com/revolution/developers/articles/tipoftheweek/5.html を邦訳したものです。この文書の文責はUDIにあり、またUDIはこの文書についての一切の債務を負いません。 間違いがありましたら eudio@chabashira.co.jp までお知らせ下さい。この文書は必要と思われる時に適宜アップデートされます。 原文には図版が添えられていますが、ここではそのURLだけを記しておきます。

Developers> Articles> Tip of the Week!


Tip of the Week! 5
グループとバックグラウンド

 この Tip of the Week は Sarah Reichelt の提供による。ありがとう。

 この記事は主に HyperCard(やその仲間)からやって来た人向けに書かれているが、新規の開発者にも役立つだろう。ここでは HyperCard のバックグラウンドと Revolution のグループとの違いを明らかにする。

 Revolution では、background と group は同義語である。(後述するひとつの大きな違いを除いて) 私はみんなに "background" を使わずに "group" という単語を使用するよう勧めている。何故なら、その方が実際の動作に沿ったものであるからである。

 HyperCard では、カード層の下にバックグラウンド層が見えている。ユーザーがその違いを意識することは無いが、プログラマからは全く違うものに見える。全てのカードはひとつのバックグラウンドを持っており、カードにもバックグラウンドにもオブジェクトがある。スタックは複数のバックグラウンドを持つことが出来、バックグラウンドは複数のカードを持つことが出来る。バックグラウンドのオブジェクトは、そのバックグラウンド上の全てのカードから利用することが出来る。

 Revolution のグループは、簡単に言うと、ひとつの名前なりIDを使って、ひと塊のオブジェクトを指定できるもの、である。これは、hide、show、enable、disable、move などの操作を信じられないくらい容易にする。これを使えばユーザーインターフェースをセクションごとに分けることが出来、それらに簡単にアクセスすることが出来る。またグループは垂直/水平スクロールバーを使うことが出来、これはウィンドウ内でのレイアウトの自由を増す。

図:http://www.runrev.com/revolution/developers/articles/tipoftheweek/images/5/scrollbars.gif
 "themes" グループは group より大きなオブジェクト集団を含んでいおり、グループの lockLocation(座標とサイズのロック)と hScrollbar(水平スクロールバー)プロパティは true にセットされている。

 Revolution は、HyperCard の2層システムを使わない。全てのオブジェクトは単一のレイヤーに置かれ、オブジェクトタイプと名前だけで指定することが出来る。各カードはオブジェクトと同じように複数のグループを持つことが出来、またグループの中に他のグループを置くことも出来る。

 グループとその部品を編集するには2通りの方法がある。1つは、ツールバーにある SGC をオンにして、グループ内の個々のアイテムを選択/編集する方法である。 SGC がオンの状態では、グループ化されたコントロールはそれぞれ個別に選択することが出来る。このオンオフは Edit メニューの Select Grouped Controls からも操作出来る。このメニューアイテムにチェックマークを付ければ、SGC をオンにしたのと同じモードになる。

 もうひとつは、SGC をオンにせずに、グループを選択してツールバーの Edit Group をクリックするか、Object メニューの Edit Group メニューを選ぶ方法である。これは丁度 HyperCard のバックグラウンドモードに似て、グループに含まれないオブジェクトを隠すようになっている。グループに新しいオブジェクトを追加したい場合はこのモードが便利だろう。ここで新しいオブジェクトを作れば、自動的にグループに追加される。

 既にあるオブジェクトをグループに追加したい場合は、まずオブジェクトをカットしてから、グループ編集モードでペーストすれば良い。或いはオブジェクトをカットしたあと、ペーストしたいグループを右クリック(マックでは controlキー+クリック)して、ポップアップしたメニューの Paste into Group を実行しても良い。

図: http://www.runrev.com/revolution/developers/articles/tipoftheweek/images/5/paste.gif
 SGC (selectGroupedControls) グローバルプロパティは false になっているので、右クリック( Mac では controlキー+クリック)によってオブジェクトをペーストしても、グループ編集モードには移行しない。

 グループには2つの特別な機能がある: background behavior (これはグループをバックグラウンドのように動作させる)と、radio behavior である。

 グループ作ったあとで新しいカードを作っても、グループは新しいカードに反映されない。しかしグループプロパティの "Background Behavior" をチェックすれば、全ての新しいカード上にそのグループが現れるようになる。この方法によって、グループを HyperCard のバックグラウンドのように扱うことが出来る。必要ならグループだけでなく、オブジェクトひとつでも同じようなことが可能である。

 既にあるグループを後から他のカードに追加するには、Application Overview が便利である。 overview でスタック(訳注:トップに見えている「スタックファイル」ではなく、トライアングルを開いた中身の「スタック」)を選択してウィンドウを広げる(訳注:右上のトライアングルを開く)と、右側のセクションの上にタブセットが見える。2番目の Groups タブをクリックすると、スタック中の全グループのリストが現れる。下にあるスライダーボタンをクリックすればグループを構成する部品も見える。グループを選択した状態で Place ボタンや Remove ボタンを使えば、グループを適用するカードを決めることが出来る。 Object メニューの place groups や remove groups も同じような機能があるが、一度に全てのカードにグループを置くことは出来ず、またグループ内にあるグループを操作することも出来ない。

 更に、ラジオボタンには特別な機能がある。グループ内のラジオボタンが、一度にひとつしかハイライト状態にならない機能である。もちろん同じ事をスクリプトで行うことも出来るが、Revolution はこれを自動で行う。ラジオボタンを含むグループに対し、自動的に radioBehavior というグループプロパティをセットする。これはプロパティウィンドウでは "Allow Hiliting Only One Radio Button At A Time" として扱われる。

図 :http://www.runrev.com/revolution/developers/articles/tipoftheweek/images/5/radiobuttons.gif
 これらのラジオボタンはひとかたまりとして扱われ、グループの radioBehavior プロパティ("Allow hiliting only one radio button at a time")は true にセットされる。

 メニューは各 OS 上で異なった表示をされる特殊なグループであるが、この中にはプルダウンメニューボタンのグループが隠れされている。

 グループの素晴らしい機能を理解したところで、特殊な習性をいくつか紹介しよう。デフォルトでは、グループの中のフィールド間を移動するのに、タブキーを利用することが出来ない。最初にタブキーが押されるとグループの最初のフィールドに移動するが、次にタブキーを押すと、他のフィールドを無視してグループを抜けてしまう。この問題を解決するには、グループプロパティの "Don't Tab To Contained Objects" のチェックを外す。 注意:グループの中のフィールドでタブキーを入力出来るようにしたいのなら、このチェックは外さないように!

 それから、「消える挿入ポインタ」の問題がある。テキスト入力のためにフィールドをクリックすると、点滅する挿入ポインタが現れる。しかしそのフィールドがグループ内にあり、更にそのグループが他のグループに被われていると、ポインタが表示されないことがある。これを解決するには、グループが他のグループに被われないよう配置を変えるか、そのフィールドを含むグループがトップに来るようにする。

 最後はオブジェクトのレイヤーの問題である。タブキーによる移動順序を整えたり、オブジェクトの重なりを解決するために、レイヤーを移動したいことがある。普通のオブジェクトなら簡単で、オブジェクトを選択して Object メニューの Back や Forward を実行するか、アライメントパレット( Alignment Palette )の Relayer ボタンを使うか、プロパティパレットの Layer フィールドに番号を入力すれば良い。しかしこれらを使ってグループを丸ごと移動することは出来るが、デフォルトではグループ内のオブジェクトを移動することは出来ない。 タブ移動順を整えるには、アライメントパレットの Relayer ボタンが使える。いくつかのオブジェクトを選択して Relayer Down ボタンをクリックしてみなさい。最初に選択したオブジェクトがその中の一番下に移動し、最後に選択したオブジェクトが一番上に移動する。そして他のオブジェクトもあなたが選択した順に配置される。

 もうひとつの方法は、これらを Edit Group モード上で行うことである。このモード内では、通常のレイヤー移動方法をそのまま使うことが出来る。

図:http://www.runrev.com/revolution/developers/articles/tipoftheweek/images/5/relayer.gif
 Alignment Palette は選択されているオブジェクトの順番を変える機能がある。 Edit Group で編集しているオブジェクトは全てひとつのグループ内にある。マック以外のシステムでは、フォーカスリングを表示するのに "Update" ボタンを使う。

 グループ化されたオブジェクトのレイヤーをスクリプトから変えるには、ちょっとズルをしなければならない。 "relayerGroupedControls" というプロパティはデフォルトで false になっている。これを true にすると、スクリプトからレイヤーを変えられるようになる。しかし充分な注意が必要である。オブジェクトのレイヤーを変える時に、グループの外にまで出すことが出来てしまう。作業が終わったら "relayerGroupedControls" プロパティを false に戻しなさい。このプロパティは startup 時にリセットされるので、グループ化されたコントロールのレイヤーを変えるたびにスクリプトでオンオフする必要がある。

 恐らく安全な方法は、スクリプトから "start editing background" を実行し、レイヤーの変更を行って、"stop editing background" する方法である。これならレイヤー移動でオブジェクトがグループの外に出てしまうことはない。この時スクリーンをロックしておかないと、いきなり画面からオブジェクトが消えて、ユーザーを脅かすことになる。

 私は "background" ではなく "group" という単語を使うようにと言った。ここでは "background" を使った方がいいケースを教えよう。スタック内の全てのグループを指す時は backgrounds という単語を使い、カレントカードにあるグループだけを指すには groups を使う。 "the number of groups" と "the number of backgrounds" でこの様子を見ることが出来る。( または groupNames プロパティと backgroundNames プロパティの値を調べてもいい) background 1 はスタック中の1番目のグループのことであるが、group 1 はカレントカード中の1番目のグループのことであり、それは background 1 と同じとは限らない。

 私と同じ新しい Revolution 開発者が、この記事によって理解を深め、強力な Revolutionプログラマとなることを望む。


Sarah Reichelt ( mailto:sarahr@genesearch.com.au )


図 :http://www.runrev.com/revolution/developers/articles/tipoftheweek/images/5/built.gif
 "FTP" と "Preferences" を切り替えるタブボタンは、"FTP" カードと "Preferences" カードの両方に置かれたバックグラウンドにある。ユーザーがタブをクリックすると、タブボタンにある menuPick ハンドラがカードを切り替える。



邦訳/文責:UDI
2002.09.11
2002.10.27

inserted by FC2 system