ハンドラやローカル関数コード内のその他の項目やロールアウトを参照するには、ユーティリティ内の他のユーザ インタフェース項目、関数、またはサブ ロールアウトに順番を付けることが重要です。特に、ハンドラやその他の関数内のユーザ インタフェース項目、ロールアウト、および関数は、ユーティリティ内であらかじめ定義されていた場合に限り参照できます。
このようにするには、次の順番をお勧めします。
場合によっては、相互参照は定義を順番付けする方法やすべてを事前に定義する方法がないことを意味します。この問題を回避するために、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 ) ) )