1

まあ、タイトルはそれをすべて言います。VBS クラスを持つ HTA があり、その "関数" 引数として別のクラス サブルーチンを使用して setInterval を呼び出そうとしていますが、"型の不一致" エラーが発生します。これは、ストレートまたは回避策のハック形式で実行できますか? 私が考えることができる唯一のことは、「引数」機能をクラスの外に持つことですが、そのようなものはそもそもクラスの目的に勝っています...助けてください!

編集(コード例):

Class My_Class
    Private TimerID

    Public Sub Sub1(param)
        Dim x
        x = DoSomeCalculations(param)
        TimerID = window.setInterval("Sub2(x)", 1000, "VBScript")
    End Sub

    Private Sub Sub2(param)
        Dim y
        y = DoSomeMoreCalculations
        If param = y Then window.clearInterval(TimerID)
    End Sub
End Class
4

3 に答える 3

1

遅い答えですが...それはうまくいくはずです:

Class My_Class
    Private TimerID

    Public Sub Sub1(param)
        Dim x
        x = DoSomeCalculations(param)
        Dim cb
        Set cb = New MyCallback
        Set cb.Target = Me
        cb.ParamValue = x
        TimerID = window.setInterval(cb , 1000, "VBScript")
    End Sub

    ' must be Public
    Public Sub Sub2(param)
        Dim y
        y = DoSomeMoreCalculations
        If param = y Then window.clearInterval(TimerID)
    End Sub
End Class

Class MyCallback

    Public Target
    Public ParamValue

    ' must be Public and Default
    Public Default Sub DoCall

        Target.Sub2 ParamValue
    End Sub
End Class

window.setTimeout と window.setInterval は、Default Sub または Default Function を呼び出します。残念ながら、イベント ハンドラーでは使用できません。

于 2015-08-14T07:42:00.947 に答える
0

この記事に基づいて、setInterval は「関数」文字列を GetRef() に渡すと考えましたが、eval のように機能するようです。

<html>
 <head>
  <Title>SetIntervalDemo</Title>
  <hta:application id="SetIntervalDemo" scroll = "no">
  <script type="text/vbscript">
   Dim g_sp0
   Sub sp0()
     MsgBox "sp0 called"
     ClearInterval g_sp0
   End Sub
   Sub sisp0()
     g_sp0 = SetInterval(GetRef("sp0"), 1000)
'    g_sp0 = SetInterval("mp0", 1000) <---- Type Mismatch
   End Sub
   Dim g_sp1
   Sub sp1(x)
     MsgBox "sp1 called: " & x
     ClearInterval g_sp1
   End Sub
   Sub sisp1()
     g_sp1 = SetInterval("sp1(4711 + g_sp1)", 1000)
   End Sub
   Dim g_mp0_a
   Dim g_o_a
   Dim g_mp0_b
   Dim g_o_b
   Sub simp0()
     Set g_o_a = New cC : g_o_a.m_sName = "Alpha"
     Set g_o_b = New cC : g_o_b.m_sName = "Beta"
     g_mp0_a = SetInterval("g_o_a.mp0", 1000)
     g_mp0_b = SetInterval("g_o_b.mp0", 1000)
   End Sub
   Class cC
     Public m_sName
     Public Sub mp0()
       MsgBox m_sName & ".mp0 called"
       ClearInterval g_mp0_a
       ClearInterval g_mp0_b
     End Sub
   End Class
  </script>
 </head>
 <body>
  <input type="button" value="sp0" onclick="sisp0" />
  <input type="button" value="sp1" onclick="sisp1" />
  <input type="button" value="mp0" onclick="simp0" />
 </body>
</html>

したがって、Subs、いくつかのグローバル、およびメソッド呼び出し ( "g_o_a.mp0") を使用すると、メソッドを定期的に呼び出すことができます。(本番コードで使用する前に、慎重にテストしてください。)

于 2013-09-14T19:45:10.413 に答える