UWSCでオブジェクトを扱う
やったー!!!
ついに閃いた!
ちょっと、不完全だけど。
追記 20121012
入れ子は、オブジェクトをjavascript内で設定すればOK
UWSC側にしか参照がない場合は、AddObjectで逆輸入という手も
こんなことができる。
DIM pt = Object.Create("Point") pt.x = 110; pt.y = 15 pt = pt.Move(-15, 25) MSGBOX("(" + pt.x + ", " + pt.y + ")")
種明かし
javascriptのオブジェクトです。
スクリプトは以下の通り。
Object.uws
OPTION EXPLICIT IFB GET_UWSC_NAME = "Object.uws" THEN DIM pt = Object.Create("Point") pt.x = 110; pt.y = 15 pt = pt.Move(-15, 25) MSGBOX("(" + pt.x + ", " + pt.y + ")") //オブジェクトの定義は、prototypeを使った簡略表記も可 Object.Define("var Rect = function(){}; Rect.prototype = { x:0, y:0, w:0, h:0 }") DIM rect = Object.Create("Rect") WITH rect .x = 100; .y = 50; .w = 30; .h = 20 ENDWITH MSGBOX("面積=" + (rect.w * rect.h)) Object.Dispose() ENDIF MODULE Object DIM _sct TEXTBLOCK _JS_SRC // よく使うオブジェクトを事前定義する var Point = function(x, y) { this.x = x this.y = y this.Move = function(dx, dy) { return new Point(this.x + dx, this.y + dy) } } ENDTEXTBLOCK PROCEDURE Object _sct = CREATEOLEOBJ("ScriptControl") _sct.Language = "JScript" this.Define(_JS_SRC) FEND PROCEDURE Dispose() _sct.Reset() _sct = Nothing FEND PROCEDURE Define(src) _sct.ExecuteStatement(src) FEND FUNCTION Create(name) RESULT = _sct.Eval("new " + name) FEND ENDMODULE
不完全なところ
プロパティにオブジェクトを入れると、.参照できません。
「obj.paraobj.para1」とかができません。
「pt.Move(10).x」とかはできるんですが、、、。
ま、入れ子になってない構造体ならできるということです!
一応解消。
経緯
経緯と言っても、javascriptのオブジェクト使えるんじゃ?
ってまさしく閃いただけ。
前に、
UWSCで可変配列 - じゅんじゅんのきまぐれ
というのを書いて、オブジェクトっぽいことをしましたが、やっぱり.参照じゃないと、、、
とずーっと気になってたのです。
で、今日閃いた。
閃いたので、試しにPowershell使ってScriptControlを調査したら、EvalとかExecuteStatementとか、面白そうなメソッドがあるある!
で、スクリプトを書いた次第。
newはどうなんだ、という意見もありますが、所詮ScriptControl内なので。
Powershellだと、System.__ComObjectを使ってReflectionになるので、書くのが面倒ですが、UWSCなら.参照するだけ。
ま、Powershellだと、そんなことしなくてもオブジェクトは使えるわけですが。
なんにしても、うれしー!!!