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

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

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

  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
        )
    )
)

構造体またはプラグイン内のロールアウトが、この構造体またはプラグインの他のメンバーまたは関数にアクセスするように定義するには、このロールアウトがこの構造体またはプラグインのメンバーであることも必要です。ロールアウトは構造体やプラグインの他のメンバーまたは関数を正しく参照しないため、構造体やプラグインの関数内で定義できません。

たとえば、ロールアウトは createRollout() 関数内で定義されているため、次の設定は有効ではありません。

weaponDataCA1 = attributes weaponData
(
    local lpp = undefined
    fn createRollout = 
    (
        rollout ShipRollout "weaponDataCA1" height:200
        (
            spinner s_lpp     "Ship length:"
            on s_lpp changed val do
                lpp = val
        )
        createDialog ShipRollout modal:false
    )
)
weaponDataCA1Dlg1 = createInstance weaponDataCA1
weaponDataCA1Dlg1.createRollout()

ただし、ロールアウトは最初に定義された後、 createRollout() 関数で参照されるため、次の設定は有効です。

weaponDataCA2 = attributes weaponData
(
    local lpp = undefined
    rollout ShipRollout "weaponDataCA2" height:200
    (
        spinner s_lpp     "Ship length:"
        on s_lpp changed val do
            lpp = val
    )
    fn createRollout = 
    (
        createDialog ShipRollout modal:false
    )
)
weaponDataCADlg2 = createInstance weaponDataCA2
weaponDataCADlg2.createRollout()