eventListenerのハンドラに関するbug

先日のeventListenerに関連する情報です。メニュー項目のinvokeを捉えてデフォルトをキャンセル出来ると言う事はメニュー項目に対して独自の機能を追加出来ると言う事ですからUIを組み込む事も多々ある訳です。
わたしは最近あまり使わないのですが、Indesignには独自のユーザーインターフェスが実装されています。たまたま過去に組んだスクリプトをメニューに当てる処理をしていて引っかかったのが今回のbugです。

まずは下をご覧下さい。

#targetengine ‘session’

var m = app.menuActions.item(“$ID/Cut”);
var myEv = m.eventListeners.add(“beforeInvoke”, evTweak);
myEv.name = “testEvent”;

function evTweak(ev){
    var dlg = app.dialogs.add({name:”test dialog”});
    dlg.show();
    dlg.destroy();
    ev.preventDefault();
    }

かなり単純化したモデルですが、このスクリプトではdlg.destroy()でIndesignがクラッシュします。おそらくCS5のバグです。
現状で回避方法はありません。割り切ってdestroy()せずに処理をする(まあ、結構メモリありますからUIで蓄積されるメモリってのも通常は大勢に影響を及ぼす事は無いような気もしますしね)かUIをIndesignオリジナルからScriptUIに変更するしかないようです。
もちろんお勧めするのはScriptUIです。

#targetengine ‘session’

var m = app.menuActions.item(“$ID/Cut”);
var myEv = m.eventListeners.add(“beforeInvoke”, evTweak);
myEv.name = “testEvent”;

function evTweak(ev){
    var w=new Window (“dialog”, “test dialog”);
    var txbx = w.add (“edittext”, undefined, “test”);
    btn = w.add (“button”, undefined, “close”, {name: “ok”});
    w.show ();
    ev.preventDefault();
    }

こ〜んな感じで処理するとよろしいかと思います。

ten_a

Graphic Designer, Scripter and Coder. Adobe Community Professional.

シェアする