VB6で関数ポインタっぽいもの
MSDNのコード見てたら面白いコードがあったのでメモっとく
API関数呼び出すときとか、そのコールバック関数のアドレスをAddressOf演算子つかってAPI関数に渡したりできるが、VBのコードではそういうことができない。
VB6でも関数ポインタっぽいものが使えたらなーとか思ってて、今日ぜんぜん関数ポインタじゃないけど、それに近い使い方ができそうなコードをMSDNで見つけた。
以下のようなクラスを作る(Procedureクラス)
Private method As String Private is_instatiated As Boolean Private Sub Class_Initialize() is_instatiated = False End Sub Public Sub setProcedure(obj_ As Object, method_ As String) Set obj = obj_ method = method_ is_instatiated = True End Sub Public Function invoke() If is_instatiated Then invoke = CallByName(obj, method, VbMethod) End If End Function
ユーティリティとして以下のようなグローバル関数作っとく(クラスProcedureのクラスメソッド的なもの)
public function newProcedure(obj as object, method as string) as Procedure set newProcedure = new Procedure newProcedure.setMethod obj, method end function
たとえば、以下のようなクラス(ClassA)があるとする。
public sub hoge() MsgBox "hoge" end sub public sub fuga() MsgBox "fuga" end sub public sub moge() MsbBox "moge" end sub
これを
public sub test() set obj = new ClassA procs = Array( newProcedure(obj, "hoge"), _ newProcedure(obj, "fuga"), _ newProcedure(obj, "moge")) for i = 0 to 2 procs(i).invoke next end sub
という感じでつかえたりする。
#あまりいい例がかけない ... orz