要求做个多媒体定时器的简单例子
我在网上看了些关于这方面的例子
可是我发现一个问题,在timeSetEvent中用到 addressof的时候
总是提示说 Invalid use of AddressOf operator 的错误
我也看了下,addressof的用法,但是我总找不到可行的解决方案,希望高手们能够帮我下
网上有个倒计时的例子,我看过,但是也会报这个错误的
求帮忙~!最好能够给我个可以运行的例子~!
我在网上看了些关于这方面的例子
可是我发现一个问题,在timeSetEvent中用到 addressof的时候
总是提示说 Invalid use of AddressOf operator 的错误
我也看了下,addressof的用法,但是我总找不到可行的解决方案,希望高手们能够帮我下
网上有个倒计时的例子,我看过,但是也会报这个错误的
求帮忙~!最好能够给我个可以运行的例子~!
解决方案 »
- 请教,如何在串口通讯编程中如何加入CRC检验程序
- 简单得像送分一样的数据库问题(回答任何一个问题都有分,up者亦有)
- 请问这种功能的程序怎么做
- 如何读取外部MSFlexGrid里的内容?
- vb中如何将unicode的字符串转换为一般的非unicode(如ansi)字符串
- 关于打好包的程序不能在win98下成功安装的问题
- 问一个很菜的问题,OCX怎么注册是不是用REGISTER,在网上的路径怎么写
- 怎么显示当前存储过程执行的进度
- VB中如何获得相对路径?
- 急需DirectX5.tlb文件,或者有没有谁知道怎么解决缺少这个文件的办法?
- vb调用不同动态库的同名函数问题,谢谢!
- adodc的字段中是否包括特定字符
把 addressof 后面跟着的函数(比如 TimerSetEventCallBack)放到标准模块中去module1:
function TimerSetEventCallBack(byval a as long ,) as long我记得这个回调函数应该有4个参数,你自己补齐
这个函数如果想在工程内任意位置下用 addressof 或调用,那就不要用 private 来修饰声明范围
就象上面的例子一样就可以了如果加了 private ,则只能是在那个函数所在的模块内使用
form1:
timeSetEvent addressof TimerSetEventCallBack
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
利用多媒体定时器设置时间而删除最后一个添加进来的数字,主要就是这样的功能
可是我改来改去还是出错~!
帮帮忙吧
不是说了吗
新建一个模块把这个代码放到模块中去就行了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这代码放进去了,一运行肯定就挂....
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
这句话应该放在哪里呢?
(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完毕......
但是有个问题
对于多媒体定时器,启动后
就必须要关闭,否则程序会死掉
我现在遇到这样的问题
不知道该如何关闭定时器
因为回调函数写在模块中后
timeKillEvent TimerID
这个代码不知道该如何添加了
希望大侠们帮忙看看
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
就像13楼的朋友说的那样
LZ,的提问水平有待于提高,,都问半句话问题,,你准备什么时候关闭,点了command1后,定时器就会打开,那么你准备什么
时候关
就是说,我点了Command1按钮后,执行完 Form1.List1.RemoveItem (i - 1)
后,能够关闭多媒体定时器
问题就是这样的~!
'窗体代码
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
Form1.List1.RemoveItem (i - 1)
End Function
写在模块中的回调函数
窗体代码如下:'窗体代码
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