热情软件屋

 

AddressOf操作符建立回调函数中出现子程序未定义错误


编号:QA001812
建立日期: 1999年10月3日 最后修改日期:1999年10月3日
所属类别:

enry Xiao:
    VB 5.0(enterprise version)
    Win98
    在这个程序中,我要使用 AddressOf 操作符建立回调函数用以接受计数器的通知。步骤为:
    (1)创建初始项目
     1、在窗体上放置 ProgressBar控件和一个命令按钮。
    (2)添加代码以启动计数器
     1、在模块Module1中添加SetTimer和KillTimer的声明。
     2、创建名为StartTimer的过程,添加到窗体。
     3、声明窗体级的整型变量以存放返回的计数器的ID值。
     4、调用SetTimer函数,参数的设置为:
     HWnd 0
     idEvent 0
     Interval 200
     callback AddressOf timerproc
     其中,timerproc为回调函数的地址。
     5、把ProgressBar的值设为0
     6、把命令按钮的标题设为Stop。
    (3)添加代码以结束并重置计数器
     1、创建名为EndTimer的Sub并添加到窗体。
     2、若计数器的ID不为0,则调用KillTimer函数。
     3、把计数器设为0
     4、把命令按钮的标题设为Start
    (4)给窗体控件添加代码
     1、在命令按钮的Click事件中,测试以下条件:
     a)若计时器的ID为0,调用StartTimer
     b)反之,调用EndTimer
     2、创建名为UpdateProgressBar的公共sub
     3、计算下一个ProgressBar的值,该值是在当前值的基础上加增量5而得
     4、测试以下条件:
     a)若下一值大于等于100,把ProgressBar的值设为100,并调用EndTimer
     b)反之,把ProgressBar的值设为计算出的值。
    程序代码为:
    Private idtimer As Integer
    Const cincrement As Integer = 5
    
    Private Sub cmdtimer_Click()
     If idtimer > 0 Then
     endtimer
     Else
     starttimer
     End If
    End Sub
    Public Sub updateprogressbar()
    Dim percentdone As Integer
    percentdone = ProgressBar1.Value + cincrement
    If percentdone >= 100 Then
     ProgressBar1.Value = 100
     endtimer
    Else
     ProgressBar1.Value = percentdone
    End If
    End Sub
    
    Private Sub starttimer()
    idtimer = SetTimer(0, 0, 200, AddressOf timerproc)
    ProgressBar1.Value = 0
    cmdtimer.Caption = "Stop"
    End Sub
    
    Private Sub endtimer()
    KillTimer 0, idtimer
    idtimer = 0
    cmdtimer.Caption = "Start"
    End Sub
    在模块Module1中,定义如下:
    Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
    Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Public Sub timerproc(ByVal hwnd As Long, ByVal msg As Long, ByVal idevent As Long, ByVal curtime As Long)
     updateprogressbar
    End Sub
    运行之,单击命令按钮,得到如下结果:
    Compiler Error:sub or functions not defied
    请专家不吝解惑,谢谢!

回答:

    修改timerproc如下:
    Public Sub timerproc(ByVal hwnd As Long, ByVal msg As Long, ByVal idevent As Long, ByVal curtime As Long)
     Form1.updateprogressbar
    End Sub

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio