ActiveXの強化

ActiveXの強化

発生したActiveXイベントをREGISTEREVENT によって操作されます。 外部からActiveXイベントを発生されるとREGISTEREVENTはSPL関数に実効命令を出します。

以下のSPLイベントハンドラを考えます。

/* 簡単なイベントハンドラ */
MyEvent(argv)
{
local i, str = "";
loop (i = 1..argc)
{
str += sprintf("arg%d: %s ", i,
caststring(getargv(i)));
}
message("MyEvent", str); }

ハンドラはInternet Explorerからイベントを処理するために使用できます。

/* Internet Explorerへの接続 */
ie = createobject("internetexplorer.application");
/* ホームページへの移動 */
ie.navigate("www.dadisp.com");
/* 表示 */
ie.visible = 1; /* イベントハンドラの設定*/
registerevent(ie, "TitleChange", "MyEvent");

Internet Explorerでの変更によりタイトルが表示されるたびにMyEventが呼び出され、メッセージボックスが表示されます。

イベントは以下のように整数のイベントIDで指定することもできます。

registerevent(ie, 0x71, "MyEvent");

UNREGISTEREVENTでSPLイベントハンドラを外す(無効にする)ことができます。

FIREEVENT とRAISEEVENTによって外部へActiveXイベントを発生することができます。

FIREEVENTイベントID1〜8までのActiveXイベントを発生します。イベントハンドラにゼロまたは複数の引数を渡すことができます。引数はオプションとなります。標準的なオートメーションバリアント配列として渡された引数はほとんどのオートメーション言語との互換性を持ちます。

以下はVBAイベントハンドラの場合の例となります。

Public WithEvents DSP As DADiSPApp

#サーバーの初期化
Sub InitDSP()
Set DSP = New DADiSPApp
DSP.Visible = True
End Sub

#イベント3へのハンドラ
Sub DSP_Event03(ParamArray args() As Variant)
Dim i As Integer
Dim s As String
s = ""
For i = 0 To UBound(args)
s = s + CStr(args(i))
Next i
MsgBox s, vbOKOnly, "Event 3 Fired"
End Sub

イベントハンドラを適切に設定するにはDSDiSPタイプライブラリへ参照を追加します。DADiSPで以下を実行します。

fireevent(3)

以下ではDSP_Event03 VBA コードの実行を命令し、メッセージボックスを表示さます。

fireevent(3, "test", 2.5)

以下ではDSP_Event03 VBA コードの実行を命令し、テキストを表示させます。

test 2.5

RAISEEVENTはID番号9〜16を用いて.NET言語に適したバリアントのSafeArrayをオプション引数として与えます。

GETCONTROLは現在のActiveXオブジェクトを返します。

GETCONTROLによってSPLイベントハンドラに現在のActiveXコントローラまたはサーバーへハンドルを返しことができます。

以下のSPL関数を考えます

/* 簡単なイベントハンドラ */
MyEvent(argv)
{
local i, str = "", ctrl;
loop (i = 1..argc)
{
str += sprintf("arg%d: %s ", i,
caststring(getargv(i)));
}

/* ActiveX オブジェクトを呼び出し*/
ctrl = getcontrol();

/* ステータステキストのタイトルを表示 */
message(ctrl.StatusText, str);
}

ハンドラはInternet Explorerからイベントを処理するのに使用できます。

/* Internet Explorerへの接続 */
ie = createobject("internetexplorer.application");

/* ホームページへの移動 */
ie.navigate("www.dadisp.com");

/* 表示 */
ie.visible = 1;

/* イベントハンドラの設定*/
registerevent(ie, "TitleChange", "MyEvent");

Internet Explorerでの変更によりタイトルが表示されるたびにMyEventが呼び出され、メッセージボックスが表示されます。メッセージボックスに該当のWEBページのステータスラインテキストと現在のタイトルが表示されます。

Calculate手法

CalculateはActiveXクライアントから変数を受け取ることができます。

以下はVisual Basicの場合の例となります。

例1
Dim DADiSP as Object
Dim val as Variant

#DADiSPへの接続します
Set DADiSP = CreateObject("dadisp.application")

#表示なしで2つのワークシートウィンドウを作成します
Call DADiSP.Execute("Newworksheet(2, 0)")

# 10x3 のランダム配列を生成するし型を変形した値を返します
val = DADiSP.Calculate("rand", 10, 3)

ActiveXオートメーションサーバーとしてDADiSP を起動させ、2つのワークシートウィンドウを作成します。そして、入力引数にしたがって処理した10×3のランダム配列を返します。引数は$記号で指定します。

例2

Dim DADiSP as Object
#DADiSPへの接続します
Set DADiSP = CreateObject("dadisp.application")

#表示なしで2つのワークシートウィンドウを作成します
Call DADiSP.Execute("Newworksheet(2, 0)")

# 式に従いスケール付き100点のランダムシリーズを生成します
Call DADiSP.Calculate("W1 := gnorm($1, 1)*$2", 100, 10)

ActiveXオートメーションサーバーとしてDADiSP を起動させ、2つのワークシートウィンドウを作成します。そして、式に従い、10の間隔のスケールで100点のランダムシリーズをW1に配置します。入力引数の値はプレースホルダ変数$1と$2で指定します。