首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

在VB的类模块中使用计时器

2012-01-15 
【分享】在VB的类模块中使用计时器在CSDN的VB论坛里呆了一年,交了不少朋友,受到了不少启发,非常感谢大家,同

【分享】在VB的类模块中使用计时器
在CSDN的VB论坛里呆了一年,交了不少朋友,受到了不少启发,非常感谢大家,同时也为自己在答问时错误的解答而向大家致歉。俺原本想在VB版里混上两颗星就算了,现在看来离目标不远了,所以散分,并把自己写的一个在VB的类模块中使用计时器的代码贴出来,谈不上分享,只供大家指正:

一、类模块代码如下:

VB code
Option Explicit'* ******************************************** *'*  模块名称:Timer.cls'*  功能:在VB类模块中使用计时器'*  作者:lyserver'* ******************************************** *Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _    Source As Any, ByVal Length As Long)Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, _    ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPrivate Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongDim m_idTimer As LongDim m_Enabled As BooleanDim m_Interval As LongPrivate Sub Class_Initialize()    m_Interval = 0End SubPrivate Sub Class_Terminate()    If m_idTimer <> 0 Then KillTimer 0, m_idTimerEnd SubPublic Property Get Interval() As Long    Interval = m_IntervalEnd PropertyPublic Property Let Interval(ByVal New_Value As Long)    If New_Value >= 0 Then m_Interval = New_ValueEnd PropertyPublic Property Get Enabled() As Boolean    Enabled = m_EnabledEnd PropertyPublic Property Let Enabled(ByVal New_Value As Boolean)    m_Enabled = New_Value    If m_idTimer <> 0 Then KillTimer 0, m_idTimer    If New_Value And m_Interval > 0 Then        m_idTimer = SetTimer(0, 0, m_Interval, GetFuncAddr(8))    End IfEnd PropertyPrivate Function GetFuncAddr(ByVal IndexOfFunc As Long) As Long    Static AsmCode(33) As Byte    Dim pThis As Long, pVtbl As Long, pFunc As Long        pThis = ObjPtr(Me)    CopyMemory pVtbl, ByVal pThis, 4    CopyMemory pFunc, ByVal pVtbl + (6 + IndexOfFunc) * 4, 4    AsmCode(0) = &H55    AsmCode(1) = &H8B: AsmCode(2) = &HEC    CopyMemory AsmCode(3), &H1475FF, 3    CopyMemory AsmCode(6), &H1075FF, 3    CopyMemory AsmCode(9), &HC75FF, 3    CopyMemory AsmCode(12), &H875FF, 3    AsmCode(15) = &HB9    CopyMemory AsmCode(16), pThis, 4    AsmCode(20) = &H51    AsmCode(21) = &HE8    CopyMemory AsmCode(22), pFunc - VarPtr(AsmCode(21)) - 5, 4    AsmCode(26) = &H8B: AsmCode(27) = &HE5    AsmCode(28) = &H5D    AsmCode(29) = &HC2    CopyMemory AsmCode(30), 16, 4    GetFuncAddr = VarPtr(AsmCode(0))End FunctionPrivate Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)    Debug.Print "类模板中的计时器:", uMsg, idEvent, dwTimeEnd Sub

二、调用代码如下:
VB code
Dim m_tm As TimerPrivate Sub Form_Load()    Set m_tm = New TimerEnd SubPrivate Sub Form_Unload(Cancel As Integer)    Set m_tm = NothingEnd SubPrivate Sub Command1_Click()    m_tm.Interval = 1000    m_tm.Enabled = TrueEnd SubPrivate Sub Command2_Click()    m_tm.Enabled = FalseEnd Sub


[解决办法]
顶起了
[解决办法]
呵呵,类的AddressOf啊,顶
[解决办法]
make!!!
[解决办法]
感谢楼主分享
[解决办法]
学习了!

[解决办法]
顶...
[解决办法]
顶起~ 不错,高手,佩服学习呀


------解决方案--------------------


比较有创意,希望楼主多多分享。
[解决办法]
收藏
[解决办法]
支持……
[解决办法]
学习~~~~~~~~

[解决办法]
收藏了,与我网上见到的有些不一样,但API是一样的
[解决办法]
这是一个高手,顶
[解决办法]
顶起.

我来转一下PctGL的另一种取类函数地址的方法:

http://www.cnblogs.com/pctgl/articles/1352916.html
[解决办法]
mark
[解决办法]
路过,顶一下
[解决办法]
mark
[解决办法]
顶起
[解决办法]
顶起!
[解决办法]
学习了

热点排行