日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年12月15日火曜日

ウインドウの作成(2): ボタン

前回のエントリ「ウインドウの作成」ではウインドウを作成し、表示するところまでを学んだ。

しかしウインドウを表示するだけでは、何の役にも立たない。

「ウインドウ」はソフトウエアとユーザーとの接点であり、ユーザーの意思決定をソフトウエアの次の動作に反映させるためにインターフェイスである。
(@IT: Webアプリケーションのユーザーインターフェイス[2] :GUIの特徴

ウインドウの存在目的は、なんらかの入力をできるようなしくみがあってこそ達成できる。


前回はウインドウを作るだけだったが、もう一つの不可欠な要素がこの「ユーザーの意思決定を入力できるしくみ」である。


それらは「コントロール」と呼ばれる。
これはMelに限った用語ではなく、Excelのマクロなどでも使われるほど、コンピュータ界では一般的な用語である。


「コントロール」と言う言葉自体には
制御すること。統制すること。管理。goo辞書)という意味がある

語源には、
「コントロール」とは「ある一定の枠を設けて、この枠からはみ出ないように(または、はみ出たとしても元の枠内に戻せるように)管理する」という意味がある。
(NEWOTON CONSULTING: 「コントロール(Control)」の意味とその語源


実際には、
ボタン 入力フィールド チェックボックス ラジオボタン スライダ タブ テキスト リストボックス プルダウンメニュー
と言うように、それぞれ特定の役割を持つウインドウ内の部品のことをさす。
各部品は、特定の役割をするように決められており、そこからはみ出た動作は起きえないと言うことからも上記のコントロールの意味が正しく反映されていることがわかる。

個人的には、コントロールはその性質から分けると3種類あるように思う。
1)ウインドウ内のレイアウトをコントロールする(タブ、テキストなど) 2)そのソフトが処理すべき動作をコントロールする(ボタン、スライダなど) 3)上記の両方の性質を持ったもの。(プルダウンメニューなど)


「コントロールとは(ASCII.jpデジタル用語辞典)
Windowsのようなウィンドウシステムでは、ボタンやスクロールバー、リストボックス、メニュー(プルダウンメニュー/ポップアップメニュー)など、画面を構成するGUIの部品がシステムで標準的に用意されている。ウィンドウシステムでは、これらのGUI部品を総称してコントロールと呼ぶ。

アプリケーションでは、独自にこれらの部品を作成することなく、システムが提供するこれらのコントロールを使用可能で、かつこれにより、同一の部品が使用されることによるGUIの一貫性が確立できる。


----------------------------------------
では、さっそくMelのコントロールを使ってみることにする。
Tutrialで例として、最初に出てくるものに「ボタン」がある。

「OK」とか「キャンセル」とか「実行」とか、そういう意思決定をしたときに次の処理へ進むためにクリックする部分である。
それによりソフトウエア(スクリプト)は、そのボタンに関連づけられた処理を開始する。

button」コマンドはその性質から単体では実行できないことはわかる。
ウインドウの中に存在するので、前回使用した「window」コマンドをはじめ関連コマンドとすべて一組で使われる。

{
if(`window -exists name`)
deleteUI name;
window name;

button;

showWindow;
}



これを実行するとエラーになる。

// Error: Controls must have a layout. No layout found in window : name //
(コントロールは一つのレイアウトを持っていなくてはなりません。ウインドウ「name」内にレイアウトを見つけることができませんでした。)

コントロールを使うには「レイアウト」が不可欠だということだ。

(2009/12/22追記: 本「learningMaya MELfundamental p69」によると、このエラーが表示されるとき、「showWindowコマンドは一度ウインドウを表示するが、すぐに閉じてしまっているらしい。)

前回のように一つのwindowを作るだけでも、不可欠なコマンドがいくつかあり、それらはいつも組となって使われる。
その組み合わせは、前回の場合「window」,「showWindow」があった。

たったひとつのこと(ウインドウを使う)をするだけでも複数のコマンドを覚える必要があるのは、初心者には負荷が高い。



個人的に一番疑問に思うのが、この「レイアウト」系のコマンド。

慣れてくると便利で使いやすいのかもしれないが、今の自分の段階では面倒くさいことこの上ない。


GUIを避けていた理由の一つが、このレイアウトだった。
ウインドウ上にボタンなどを配置したいと思っても、「レイアウト」抜きにダイレクトに置くことは出来ない。

それに、BasicのGosub-return文を連想させるような使い方や、入れ子構造をしっかりと把握しておかないといけない。
そういったことをずっと頭の片隅に置いて作業をするというのが非常に煩わしい。
小さな脳みそを圧迫して、思考を妨げられてしまう。
しかも、スクリプトの本筋とは違い、単に見た目の問題にそこまで注意を払わなくてはいけないと言うことはキャパシティーを超えている。w



さてレイアウトのコマンドはいくつかあり、そのどれかを使うことでこのエラーは解消し、ボタンを配置することができる。

そのうちの一つが「columnLayout」である。

通常の意味では、カラムとは表形式のデータで縦列のこと。goo辞書

名前が示すとおり、これを使用すると、すべてのコントロールは縦に並ぶ。
言い換えれば、横に並べるには他のレイアウトを使う必要がある。
シンプルだが、限定されたレイアウト機能しかもっていない。

利点としては、このコマンドに必要なものはコマンド自体意外には無いので、レイアウト系では、一番簡単に使える。

見た目が美しい、もしくは機能的なウインドウを作るには、いろいろな他のレイアウトを使う必要がある。不親切この上ない。


{
if(`window -exists name`)
deleteUI name;
window name;

columnLayout;
button;

showWindow;
}

これでやっとボタン付きのwindowが表示される。

ボタンの名称を指定していないので、デフォルトではコントロール名称「button」が使用され「button3」となっている。

ボタンに名称をつけるには、
-label」フラグを使う。
(例:button -label "buttonName";)


{
if(`window -exists name`)
deleteUI name;
window name;

columnLayout;
button -label "Cancel";

showWindow;
}


----------------------------------------
ここまででボタンを表示することは出来たが、このままではまだ何の役にも立たない。

このボタンを押したときに何らかの処理が行われてはじめてこのウインドウの存在意義が認められる。

そのためには
-command」フラグを使う。ヘルプによると「-command」で使用する内容はスクリプトとなっている。
実はその意味があまりよくわかっていない。(^^;)
わかっているのは、ここにコマンド(例:sphere)を使うこともできるし、プロシージャを指定することも出来るということ。

いろいろなでみると、ここの、コマンド(文字列)が” ”で囲まれているのだが。
(例:button -label "makeSphere" -command "sphere"; 

この決まり事の意味がどうしてもわからない。
Digital Matrixでの説明ではコマンドは” ”内にいれて使うように説明されている。


しかし、下記のように” ”なしでもちゃんと機能する。
button -label "makeSphere" -command sphere;

なぜあえて、” ”を使うのか?

” ”は、変数においてそれを文字列として扱うという決まりがあったはず。
文字列として扱われたら、コマンドとして機能しないのではないのか?


{
if(`window -exists name`)
deleteUI name;
window name;

columnLayout;
button -label "makeSphere" -command "sphere";

showWindow;
}

この疑問が解決できる人がいたら是非、おしえてください。
 

0 件のコメント:

コメントを投稿