ロールアウト コード内のローカル、関数、構造体、ユーザ インタフェース項目の可視性

 

   

ユーザ インタフェースの作成 - クイック ナビゲーション

ハンドラやローカル関数コード内のその他の項目やロールアウトを参照するには、ユーティリティ内の他のユーザ インタフェース項目、関数、またはサブ ロールアウトに順番を付けることが重要です。特に、ハンドラやその他の関数内のユーザ インタフェース項目、ロールアウト、および関数は、ユーティリティ内であらかじめ定義されていた場合に限り参照できます。

このようにするには、次の順番をお勧めします。

  1. ローカル変数
  2. 構造体
  3. ユーザ インタフェース項目
  4. ネストされたロールアウト
  5. 関数
  6. イベント ハンドラ

場合によっては、相互参照は定義を順番付けする方法やすべてを事前に定義する方法がないことを意味します。この問題を回避するために、MAXScript ではローカル ロールアウトや関数を事前に宣言できます。これにより、関数やロールアウト定義の前に来るコードでも、正しいオブジェクトを参照できます。これは、ロールアウトや関数を未初期化ローカルとして宣言して行います。次の例では、 ro1 および ro2 という 2 つのロールアウトがあり、それぞれが他方のロールアウトの項目を参照しようとします。メイン ユーティリティでローカルとしてこれらを事前に宣言することにより、この相互参照が可能となります。

例:

(
local ro1, ro2 -- pre-declare local rollouts
rollout ro1 "Rollout 01"
(
checkbox chk_checkbox "Check The Box In Rollout 02" enabled:false
on chk_checkbox changed state do ro2.chk_checkbox.checked = state
)
rollout ro2 "Rollout 02"
(
checkbox chk_checkbox "Enable The Checkbox In Rollout 01"
on chk_checkbox changed state do ro1.chk_checkbox.enabled = state
)
theFloater = newRolloutFloater "Test Local Visibility" 250 110
addRollout ro1 theFloater
addRollout ro2 theFloater
) --end script

一般に、すべてのローカル変数名は、ローカル変数自身の最も外側のスコープでローカルとして明示的に宣言することをお勧めします。これは、他のスクリプトで同じ変数名をグローバル変数として宣言した場合に衝突が発生しないようにするためです。関数、構造体の定義、およびロールアウトは、(同じ名前のグローバル変数がある場合でも)常にそれが定義されているユーティリティに対してローカルですが、これらをローカルとして宣言しておくと、定義する順番が変わっても変数は確実に定義されます。これらの宣言の例を次に示します。

例:

utility foo "Object Frabulator"
(
-- local variables
local target_obj
-- local functions
local prop_name
-- local rollouts
local setup
fn prop_name obj name =
for c in obj.children do c.name = name + "_" + c.name
checkbutton setup_btn "Setup"
edittext name_box "New name:"
-- use a checkbutton to dynamically control presence of panels
on setup_btn changed state do
if state then addRollout setup else removeRollout setup
on foo close do
removeRollout setup -- always close rollouts
rollout setup "Setup fraber" -- local panel
(
label hello
pickbutton pick_tgt "Pick object"
on pick_tgt picked obj do
(
target_obj = obj -- access utility local
name_box.text = obj.name -- access utility item
prop_name obj obj.name -- call utility local fn
)
)
)