要求做个多媒体定时器的简单例子
我在网上看了些关于这方面的例子
可是我发现一个问题,在timeSetEvent中用到 addressof的时候
总是提示说 Invalid use of AddressOf operator 的错误
我也看了下,addressof的用法,但是我总找不到可行的解决方案,希望高手们能够帮我下
网上有个倒计时的例子,我看过,但是也会报这个错误的
求帮忙~!最好能够给我个可以运行的例子~!

解决方案 »

  1.   


    把 addressof 后面跟着的函数(比如 TimerSetEventCallBack)放到标准模块中去module1:
    function TimerSetEventCallBack(byval a as long ,) as long我记得这个回调函数应该有4个参数,你自己补齐
    这个函数如果想在工程内任意位置下用 addressof 或调用,那就不要用 private 来修饰声明范围
    就象上面的例子一样就可以了如果加了 private ,则只能是在那个函数所在的模块内使用
    form1:
    timeSetEvent addressof TimerSetEventCallBack
      

  2.   

    addressof必须放到公共模块中使用!!!!!就这个问题
      

  3.   

    用这个吧:http://www.m5home.com/blog/article.asp?id=22
      

  4.   

    只要你那个的话,那么2,3楼已经说得很明白了呀.addressof后的过程必须放在公共模块里,且为public.具体直接按F1不就有答案了.别告诉我你没装MSDN.
      

  5.   

    我用了public了,可是还是有那个错的啊~!我把代码贴出来吧,你帮我看看,到底问题在哪?
      

  6.   

    Option ExplicitPrivate i As Integer
    Private TimerID As LongPrivate Declare Function timeSetEvent Lib "winmm.dll" _
           (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As LongPrivate Declare Function timeKillEvent Lib "winmm.dll" (ByVal TimerID As Long) As LongPrivate Sub Command1_Click()    Timer1.Enabled = False
        
        If Command1.Caption = "Start" Then        TimerID = timeSetEvent(2000, 0, AddressOf ABC, 0, IME_PERIODIC Or TIME_CALLBACK_FUNCTION)    Else
            timeKillEvent TimerID
        End IfEnd SubPrivate Sub Command2_Click()
        
        Timer1.Enabled = True
        List1.AddItem (i)
        
    End SubPrivate Sub Form_Load()
        
        On Error Resume Next
        Timer1.Interval = 500
        
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        
        Command1.Caption = "Start"    
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        
        On Error Resume Next
        timeKillEvent TimerID
         
        If (mlngTimerID) Then
            Call MMTimeKill(mlngTimerID)
            mlngTimerID = 0&
        End If
        
    End SubPrivate Sub Timer1_Timer()    i = i + 1
        List1.AddItem (i)
        
    End SubPublic Function ABC(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)    List1.RemoveItem (i - 1)End Function
      

  7.   

    这段代码主要是这样的,先利用的Timer控件按照一定的时间在Listbox中添加数字,然后断掉Timer同时
    利用多媒体定时器设置时间而删除最后一个添加进来的数字,主要就是这样的功能
    可是我改来改去还是出错~!
    帮帮忙吧
      

  8.   


    不是说了吗
    新建一个模块把这个代码放到模块中去就行了Public Function ABC(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)    List1.RemoveItem (i - 1)End Function 
    .不过 lz这代码放进去了,一运行肯定就挂....
      

  9.   

    '窗体代码
    Option Explicit
    Private i As Integer
    Private TimerID As Long
    Private Declare Function timeSetEvent Lib "winmm.dll" _
          (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
    Private Declare Function timeKillEvent Lib "winmm.dll" (ByVal TimerID As Long) As Long
    Private Const TIME_PERIODIC = 1  '  program for continuous periodic event
    Private Const TIME_CALLBACK_FUNCTION = 2Private Sub Command1_Click()
    Timer1.Enabled = False
        If Command1.Caption = "Start" Then
      TimerID = timeSetEvent(2000, 0, AddressOf ABC, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
    Else
    timeKillEvent TimerID
    End If
    End Sub
    Private Sub Command2_Click()
        Timer1.Enabled = True
        List1.AddItem (i)
        End Sub
    Private Sub Form_Load()
        On Error Resume Next
        Timer1.Interval = 500
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        Command1.Caption = "Start"
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        On Error Resume Next
        timeKillEvent TimerID
        
        'If (mlngTimerID) Then
           ' Call MMTimeKill(mlngTimerID)
           ' mlngTimerID = 0&
        'End If
        
    End SubPrivate Sub Timer1_Timer()
    i = i + 1
        List1.AddItem (i)
    End Sub'模块代码Public Function ABC(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
    Form1.List1.RemoveItem (i - 1)
    End Function
      

  10.   

    运行起来,程序会死掉呢,timeKillEvent TimerID
    这句话应该放在哪里呢?
      

  11.   

    首先新建一个模块把下面代码贴进去Public Declare Function timeSetEvent Lib "winmm.dll" _
          (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
    Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal TimerID As Long) As LongPublic Const TIME_PERIODIC = 1  '  program for continuous periodic event
    Public Const TIME_CALLBACK_FUNCTION = 2Public TimerID As LongPublic Function ABC(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
    Form1.List1.RemoveItem (i - 1)
    End Function再把下面代码放到form里面'窗体代码
    Option Explicit
    Private i As IntegerPrivate Sub Command1_Click()
    Timer1.Enabled = False
        If Command1.Caption = "Start" Then
        TimerID = timeSetEvent(2000, 0, AddressOf ABC, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
    Else
    timeKillEvent TimerID
    End If
    End Sub
    Private Sub Command2_Click()
        Timer1.Enabled = True
        List1.AddItem (i)
        End Sub
    Private Sub Form_Load()
        On Error Resume Next
        Timer1.Interval = 500
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        Command1.Caption = "Start"
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        On Error Resume Next
        timeKillEvent TimerID
        
        'If (mlngTimerID) Then
           ' Call MMTimeKill(mlngTimerID)
           ' mlngTimerID = 0&
        'End If
        
    End SubPrivate Sub Timer1_Timer()
    i = i + 1
        List1.AddItem (i)
    End Sub完毕......
      

  12.   

    模块中我加进代码了
    但是有个问题
    对于多媒体定时器,启动后
    就必须要关闭,否则程序会死掉
    我现在遇到这样的问题
    不知道该如何关闭定时器
    因为回调函数写在模块中后
    timeKillEvent TimerID 
    这个代码不知道该如何添加了
    希望大侠们帮忙看看
      

  13.   

    在form启动的时候,关闭Timer1吗>?如果是则Private Sub Form_Load()
        On Error Resume Next
        timer1.Enabled=false 
        Timer1.Interval = 500
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        Command1.Caption = "Start"
    End Sub
      

  14.   

    不是关闭Timer,而是多媒体定时器打开之后,不是要关闭的么,现在怎样关闭呢,否则程序会死掉的~!
    就像13楼的朋友说的那样
      

  15.   


    LZ,的提问水平有待于提高,,都问半句话问题,,你准备什么时候关闭,点了command1后,定时器就会打开,那么你准备什么
    时候关
      

  16.   

    唉,不好意思啊~!
    就是说,我点了Command1按钮后,执行完  Form1.List1.RemoveItem (i - 1)
    后,能够关闭多媒体定时器
    问题就是这样的~!
      

  17.   


    '窗体代码
    Option Explicit
    Private i As IntegerPrivate Sub Command1_Click()
    Timer1.Enabled = False
        If Command1.Caption = "Start" Then
        TimerID = timeSetEvent(2000, 0, AddressOf ABC, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
        timeKillEvent TimerID      '关掉
    Else
    timeKillEvent TimerID
    End If
    End Sub
    Private Sub Command2_Click()
        Timer1.Enabled = True
        List1.AddItem (i)
        End Sub
    Private Sub Form_Load()
        On Error Resume Next
        Timer1.Interval = 500
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        Command1.Caption = "Start"
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        On Error Resume Next
        timeKillEvent TimerID
        
        'If (mlngTimerID) Then
           ' Call MMTimeKill(mlngTimerID)
           ' mlngTimerID = 0&
        'End If
        
    End SubPrivate Sub Timer1_Timer()
    i = i + 1
        List1.AddItem (i)
    End Sub
      

  18.   

    Public Function ABC(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
    Form1.List1.RemoveItem (i - 1)
    End Function
    写在模块中的回调函数
      

  19.   

    我就没在你的代码里看到,哪里用到了这个函数,除了传了一个地址给timeSetEvent你回调啥???
      

  20.   

    模块代码不变!!!
    窗体代码如下:'窗体代码
    Option Explicit
    Private i As IntegerPrivate Sub Command1_Click()
        Timer1.Enabled = False
        If Command1.Caption = "Start" Then
            '设置开始时间
            tmrStartTimer = Time
            TimerID = timeSetEvent(2000, 0, AddressOf ABC, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
            '启动计时器
            tmrJudgeTime.Enabled = True
        Else
            timeKillEvent TimerID
        End If
    End Sub
    Private Sub Command2_Click()
        Timer1.Enabled = True
        List1.AddItem (i)
        End Sub
    Private Sub Form_Load()
        On Error Resume Next
        Timer1.Interval = 500
        If TimerID <> 0 Then
            timeKillEvent (TimerID)
            TimerID = 0
        End If
        Command1.Caption = "Start"
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        On Error Resume Next
        timeKillEvent TimerID
        
        'If (mlngTimerID) Then
           ' Call MMTimeKill(mlngTimerID)
           ' mlngTimerID = 0&
        'End If
        
    End SubPrivate Sub Timer1_Timer()
    i = i + 1
        List1.AddItem (i)
    End SubPrivate Sub tmrJudgeTime_Timer()
        '每次进来都设置最新时间
        tmrEndTimer = Time
        '说明现在的时间已与多媒体的时差=0,如果你还需要延时,则可以用sleep之类的函数,进行延时操作
        '在这里需要说明一下,时间对比只能以秒为单位,你如果需要精确到毫秒或更小的时间单位,则自己再操作一下。
        If (tmrEndTimer - tmrStartTimer) = TimerID Then
            Form1.List1.RemoveItem (i - 1)
        End If
    End Sub
      

  21.   

    看看这个吧,也许对你有用.http://my.net-soho.cn/C5/42223.aspx
      

  22.   

    看看这个吧,也许对你有用.http://my.net-soho.cn/C5/42223.aspx