<Tips>
同じ種類の構造体を複数回使用する場合、以下の例のように始めに作成した構造体をコピーすることで、新たな構造体の宣言なしに同じ種類の構造体を何回でも設定することが可能です。
VBscript
VBscript
Set OPENFILENAME=CreateObject("SfcMini.Structure")
OPENFILENAME _
"lStructSize","Long", _
"hwndOwner","Long", _
--(略)--
"lpTemplateName","String"
Set ofn1=CreateObject("SfcMini.Structure")
Set ofn2=CreateObject("SfcMini.Structure")
Set ofn3=CreateObject("SfcMini.Structure")
ofn1()=OPENFILENAME
ofn2()=OPENFILENAME
ofn3()=OPENFILENAME
OPENFILENAME _
"lStructSize","Long", _
"hwndOwner","Long", _
--(略)--
"lpTemplateName","String"
Set ofn1=CreateObject("SfcMini.Structure")
Set ofn2=CreateObject("SfcMini.Structure")
Set ofn3=CreateObject("SfcMini.Structure")
ofn1()=OPENFILENAME
ofn2()=OPENFILENAME
ofn3()=OPENFILENAME
入れ子の構造体は次の例のように宣言できます。
VBScript
あるいは、次の例のように宣言することも可能です。
VBScript
このように宣言した場合、MSG.pt.xおよびMSG.pt.yの各プロパティにアクセスすることが可能になります。
VBScript
set POINTAPI=CreateObject("SfcMini.Structure")
set MSG=CreateObject("SfcMini.Structure")
POINTAPI _
"x", "Long", _
"y", "Long"
MSG _
"hwnd", "Long", _
"message", "Long", _
"wParam", "Long", _
"lParam", "Long", _
"time", "Long", _
"pt", POINTAPI
set MSG=CreateObject("SfcMini.Structure")
POINTAPI _
"x", "Long", _
"y", "Long"
MSG _
"hwnd", "Long", _
"message", "Long", _
"wParam", "Long", _
"lParam", "Long", _
"time", "Long", _
"pt", POINTAPI
あるいは、次の例のように宣言することも可能です。
VBScript
set MSG=CreateObject("SfcMini.Structure")
MSG _
"hwnd", "Long", _
"message", "Long", _
"wParam", "Long", _
"lParam", "Long", _
"time", "Long", _
"pt", CreateObject("SfcMini.Structure")("x","Long","y","Long")
MSG _
"hwnd", "Long", _
"message", "Long", _
"wParam", "Long", _
"lParam", "Long", _
"time", "Long", _
"pt", CreateObject("SfcMini.Structure")("x","Long","y","Long")
このように宣言した場合、MSG.pt.xおよびMSG.pt.yの各プロパティにアクセスすることが可能になります。
JScriptでは、COMオブジェクトの呼び出しに参照渡しが出来ません。GetWindowTextなど、文字列の参照渡しが必要なAPIを使用する場合は、固定長文字列を含む構造体を使用してください。例えば、
として構造体を構築すれば、wNameを引数としてAPIに与えると参照渡しされます。この方法を用いたサンプルプログラムとしては、こちらを参考にしてください。
また、VBScript/JScriptに共通なことですが、Long型を含む構造体を引数としてAPIに渡すことで、32ビット整数型の変数が参照渡しできます。
var wName=WScript.CreateObject("SfcMini.Structure");
wName("str","String*256");
wName("str","String*256");
として構造体を構築すれば、wNameを引数としてAPIに与えると参照渡しされます。この方法を用いたサンプルプログラムとしては、こちらを参考にしてください。
また、VBScript/JScriptに共通なことですが、Long型を含む構造体を引数としてAPIに渡すことで、32ビット整数型の変数が参照渡しできます。
VBScriptにおけるクラスの疑似継承機能を使用するには、SfcMini.ClassEx オブジェクトを利用します。添付のサンプルスクリプト『ClassEx.vbs』を例にとって説明します。
擬似継承機能を利用するためには、クラスにパブリックプロパティ『this』を実装してください。基底になるクラス(ここの例では、GrandParentClass)では、クラスのコンストラクタで
と指定します。このクラスを継承するためには(例:ParentClass)、やはり『this』を実装しこれに、SfcMini.ClassExオブジェクトを当てはめます。さらに、継承する元になるGrandParentClassクラスのインスタンスを一つ作成し、継承元の this プロパティと、Me プロパティの両方を SfcMini.ClassExオブジェクトに対して指定してください。
これで、ParentClass の this にアクセスすることで、ParentClass 内、GrandParentClass 内のどちらのパブリックプロパティ・パブリック関数にアクセスすることが出来ます。さらに継承を行って、例のように ChildClass を作成することが出来ます。
擬似継承機能を利用するためには、クラスにパブリックプロパティ『this』を実装してください。基底になるクラス(ここの例では、GrandParentClass)では、クラスのコンストラクタで
Set this=Me
と指定します。このクラスを継承するためには(例:ParentClass)、やはり『this』を実装しこれに、SfcMini.ClassExオブジェクトを当てはめます。さらに、継承する元になるGrandParentClassクラスのインスタンスを一つ作成し、継承元の this プロパティと、Me プロパティの両方を SfcMini.ClassExオブジェクトに対して指定してください。
Set Parent=New ParentClass
Set this=CreateObject("SfcMini.ClassEx")
Call this(Me,Parent.this)
Set this=CreateObject("SfcMini.ClassEx")
Call this(Me,Parent.this)
これで、ParentClass の this にアクセスすることで、ParentClass 内、GrandParentClass 内のどちらのパブリックプロパティ・パブリック関数にアクセスすることが出来ます。さらに継承を行って、例のように ChildClass を作成することが出来ます。
» サンプルコード
COM(ActiveX)は、作成されたオブジェクトをダイナミックに破棄するメカニズムがないので、SFC miniでも一度作成したオブジェクトは破棄できません。SFC miniオブジェクトの取得とリリースを、メモリーリークを起こすことなく繰り返し行ないたい場合は、少し工夫が必要です。要らなくなったオブジェクトはリセットを行ない、もう一度使うようにします。具体的な方法は、サンプルコードを参照して下さい。
» サンプルコード