Section 4.8 マクロを作る(その1)

今までは、eval タグを使ってこんなふうに DatePlugin クラスのメソッドを直接呼び出してたわけだけど…

; 表画面に06/30と表示します
[eval exp="date.drawDate(6, 30)"]

うん?
これだと TJS スクリプトの書き方を知らないとプラグインが使えないよね。
えっと、確か §4.1 で、 TJS スクリプトの書き方を知らなくてもプラグインを使えるようにするためにマクロを作るって言ってたよね?
うん。
というワケで、今回はプラグイン用のマクロを作ってみるね。
プラグイン用のマクロってどうやって作るの?
作り方は普通のマクロと同じだよ。
例えばこんな感じ。

<マクロを使ったプラグインの例>

[iscript]

// メッセージを表示するプラグイン
class InformPlugin extends KAGPlugin
{
    // コンストラクタ
    function InformPlugin()
    {
        super.KAGPlugin();
    }

    // デストラクタ
    function finalize()
    {
        super.finalize();
    }

    // マクロから呼び出すメソッド
    function showMessage(elm)
    {
        // message 属性と caption 属性を System クラスの inform メソッドの引数に指定します
        System.inform(elm.message, elm.caption);
    }
}

// プラグインオブジェクトを作って登録します
kag.addPlugin(global.inform_plugin = new InformPlugin());

[endscript]

; messagebox マクロを定義します
[macro name=messagebox]
; マクロに指定された属性の値が格納されている辞書配列(mp)を引数に指定して inform メソッドを呼び出します
[eval exp="inform_plugin.showMessage(mp)"]
[endmacro]

InformPlugin クラス がどんなクラスかは解るよね?
えっと、showMessage っていうメソッドがあって、 呼び出されると inform メソッドを使ってメッセージを表示するんだよね?
そ。この InformPlugin クラスはメッセージを表示するだけのプラグイン。
だったら…
あ〜、『だったら [eval exp="System.inform('メッセージ')"] とかでいいじゃん』っていうツッコミはなしね。
このプラグインはあくまで説明用だから。
う、うん…わかった。
えっと、じゃあ、なんで showMessage メソッドの引数をわざわざ辞書配列にしてるの?
messagecaption しか使ってないんだから、引数を2つにすればいいんじゃない?
それは messagebox マクロを定義してる部分を見ればわかると思うよ。
showMessage メソッドの引数が mp になってるけど…この変数ってどこにも宣言されてないよね?
この mp ってなんなの?
mp っていうのは、マクロに指定されてる属性が記録されてる辞書配列なんだ。
つまり…

messagebox マクロの使用例>

; messagebox マクロの使用例
[messagebox message="マクロを使おう!" caption="messageboxマクロ"]

こんなふうに messagebox マクロを実行すると、 mp.message の値が "マクロを使おう!" になって、 mp.caption の値が "messageboxマクロ" になるんだ。
ちなみにこれを実行するとこうなるよ。

<実行結果>

表示されたメッセージ

ってことは、mp を引数に指定しとけば、 呼び出されたメソッドの中でマクロに指定されてる属性の値が全部参照できるってこと?
ん、そういうこと。
あ、属性が指定されてない時はどうなるの?
例えば…

[messagebox message="マクロを使おう!"]

こんなふうに、caption 属性が指定されてない時とか。
その時は mp.captionvoid になるんだ。
つまり、showMessage メソッドの中で System.inform("マクロを使おう!"); が実行されるから、こうなるよ。

<実行結果>

表示されたメッセージ

ふぅん、そうなんだ。
じゃあ、message 属性を省略したりとか、 message 属性と caption 属性を両方省略したりもできるってこと?
ん〜、できなくはないけど、inform メソッドの第1引数はデフォルト値が決められてないから、 少なくとも message 属性は指定するようにした方がいいと思うよ。
あ、そういえば §1.5§1.17inform メソッドは第2引数だけデフォルト引数が決めてあるから省略できるって言ってたよね。
うん。
今回の場合は属性を省略してもまぁ大丈夫なんだけど、 デフォルトの値が決められてない属性を省略すると、もしかしたら動作がヘンになっちゃうかもしれないから、 省略できない属性はちゃんと指定されてるかどうかチェックしといた方がいいかもね。
指定されてなかったら警告のメッセージを出すとか?
ん、そんな感じだね。
そっか。わかった。
それじゃ、今回はここまでね。
今回は短かったね。
でも、プラグイン用のマクロの基本はだいたい解ったでしょ?
うん、まぁね。
次回は DatePlugin クラスのメソッドをマクロから呼び出してみるね。
それじゃ、また次回!


前へ | TOP | 次へ