我想写一个其功能类似于数组的Timer控件的类,定时执行任务;我这里摘抄了部分代码
请教怎么写才能实现类似于ListView那样的集合类。
子集里面给出地址就变成成员,不给地址就是方法这样的语句:
如:
ListView1.ListItems.Add().... 子集不赋值给出Add /Clear/Remove等方法
ListView1.ListItems(1).Text = " " 子集赋值后可以更新属性。
我目前的代码
'窗体:frmMain--------------------
Option Explicit
Private WithEvents Tsk As clsTask
Private Sub cmdClose_Click()
Tsk.TaskItem.Remove (1)
End Sub
Private Sub cmdStar_Click()
Tsk.TaskItem.Add 1, 1, , True
End Sub
Private Sub Tsk_RunTime(TaskId As Integer)
Select Case TaskId
Case 1
Me.Caption = Now
End Select
End Sub
Private Sub frmMain_Activate()
Set Tsk = New clsTask
Tsk.Enabled = True
End Sub
Private Sub frmMain_QueryClose(Cancel As Integer, CloseMode As Integer)
Tsk.Enabled = False
Set Tsk = Nothing
End Sub
'----------------------
'模块:mdlTask--------------------
Option Explicit
Public Tasks(2000, 4) '支持同时运行2000个任务
Public Type TaskProperty
TaskId As Integer
RunTimer As Single
TaskName As String
Repetitive As Boolean
End Type
'----------------------
'类模块:clsTask--------------------
Option Explicit
Private iEnabled As Boolean
Private iTimeValue As Single
Private Items As clsTaskItem
Public Event RunTime(ByRef TaskId As Integer) '对应任务计时器到达后时间返回任务ID
Private Sub Enableds()
Dim i As Integer, m As Integer
While iEnabled
iTimeValue = Timer
For i = 0 To 2000
If Tasks(i, 0) And iTimeValue - Tasks(i, 1) >= Tasks(i, 2) Then
If Tasks(i, 3) Then
Tasks(i, 0) = True
Tasks(i, 1) = Timer
Tasks(i, 3) = True
Else
Tasks(i, 0) = False
Tasks(i, 3) = False
End If
RaiseEvent RunTime(i)
End If
DoEvents
Next i
DoEvents
Wend
End Sub
Public Property Get Enabled() As Boolean
Enabled = iEnabled
End Property
Public Property Let Enabled(vEnabled As Boolean)
iEnabled = vEnabled
If iEnabled Then Enableds
End Property
Public Property Get TimeValue() As Single
TimeValue = iTimeValue
End Property
Public Property Get TaskItem() As clsTaskItem
Set Items = New clsTaskItem
Set TaskItem = Items
End Property
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
iEnabled = False
End Sub
'----------------------
'类模块:clsTaskItem--------------------
Option Explicit
Public Sub Add(ByVal TaskId As Integer, ByVal RunTimer As Single, Optional ByVal TaskName As String = "", Optional ByVal Repetitive As Boolean = False)
Dim i As Integer, m As Integer
If Tasks(TaskId, 0) And Tasks(TaskId, 3) = False Then
MsgBox "指定的任务ID已存在,请重新指定!", 16, "错误"
Exit Sub
End If
Tasks(TaskId, 0) = True
Tasks(TaskId, 1) = Timer
Tasks(TaskId, 2) = RunTimer
Tasks(TaskId, 3) = Repetitive
Tasks(TaskId, 4) = TaskName
End Sub
Public Sub Remove(ByVal TaskId As Integer)
If Tasks(TaskId, 0) = False Then
Exit Sub
End If
Tasks(TaskId, 0) = False
End Sub
Public Property Get Count() As Integer
Dim i As Integer, m As Integer
For i = 0 To 2000
If Tasks(i, 0) Then m = m + 1
Next i
Count = m
End Property
Public Property Get Items(ByVal TaskId As Integer) As TaskProperty
With Items
.Repetitive = Tasks(TaskId, 3)
.RunTimer = Tasks(TaskId, 2)
.TaskId = TaskId
.TaskName = Tasks(TaskId, 4)
End With
End Property
'----------------------
请教怎么写才能实现类似于ListView那样的集合类。
子集里面给出地址就变成成员,不给地址就是方法这样的语句:
如:
ListView1.ListItems.Add().... 子集不赋值给出Add /Clear/Remove等方法
ListView1.ListItems(1).Text = " " 子集赋值后可以更新属性。
我目前的代码
'窗体:frmMain--------------------
Option Explicit
Private WithEvents Tsk As clsTask
Private Sub cmdClose_Click()
Tsk.TaskItem.Remove (1)
End Sub
Private Sub cmdStar_Click()
Tsk.TaskItem.Add 1, 1, , True
End Sub
Private Sub Tsk_RunTime(TaskId As Integer)
Select Case TaskId
Case 1
Me.Caption = Now
End Select
End Sub
Private Sub frmMain_Activate()
Set Tsk = New clsTask
Tsk.Enabled = True
End Sub
Private Sub frmMain_QueryClose(Cancel As Integer, CloseMode As Integer)
Tsk.Enabled = False
Set Tsk = Nothing
End Sub
'----------------------
'模块:mdlTask--------------------
Option Explicit
Public Tasks(2000, 4) '支持同时运行2000个任务
Public Type TaskProperty
TaskId As Integer
RunTimer As Single
TaskName As String
Repetitive As Boolean
End Type
'----------------------
'类模块:clsTask--------------------
Option Explicit
Private iEnabled As Boolean
Private iTimeValue As Single
Private Items As clsTaskItem
Public Event RunTime(ByRef TaskId As Integer) '对应任务计时器到达后时间返回任务ID
Private Sub Enableds()
Dim i As Integer, m As Integer
While iEnabled
iTimeValue = Timer
For i = 0 To 2000
If Tasks(i, 0) And iTimeValue - Tasks(i, 1) >= Tasks(i, 2) Then
If Tasks(i, 3) Then
Tasks(i, 0) = True
Tasks(i, 1) = Timer
Tasks(i, 3) = True
Else
Tasks(i, 0) = False
Tasks(i, 3) = False
End If
RaiseEvent RunTime(i)
End If
DoEvents
Next i
DoEvents
Wend
End Sub
Public Property Get Enabled() As Boolean
Enabled = iEnabled
End Property
Public Property Let Enabled(vEnabled As Boolean)
iEnabled = vEnabled
If iEnabled Then Enableds
End Property
Public Property Get TimeValue() As Single
TimeValue = iTimeValue
End Property
Public Property Get TaskItem() As clsTaskItem
Set Items = New clsTaskItem
Set TaskItem = Items
End Property
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
iEnabled = False
End Sub
'----------------------
'类模块:clsTaskItem--------------------
Option Explicit
Public Sub Add(ByVal TaskId As Integer, ByVal RunTimer As Single, Optional ByVal TaskName As String = "", Optional ByVal Repetitive As Boolean = False)
Dim i As Integer, m As Integer
If Tasks(TaskId, 0) And Tasks(TaskId, 3) = False Then
MsgBox "指定的任务ID已存在,请重新指定!", 16, "错误"
Exit Sub
End If
Tasks(TaskId, 0) = True
Tasks(TaskId, 1) = Timer
Tasks(TaskId, 2) = RunTimer
Tasks(TaskId, 3) = Repetitive
Tasks(TaskId, 4) = TaskName
End Sub
Public Sub Remove(ByVal TaskId As Integer)
If Tasks(TaskId, 0) = False Then
Exit Sub
End If
Tasks(TaskId, 0) = False
End Sub
Public Property Get Count() As Integer
Dim i As Integer, m As Integer
For i = 0 To 2000
If Tasks(i, 0) Then m = m + 1
Next i
Count = m
End Property
Public Property Get Items(ByVal TaskId As Integer) As TaskProperty
With Items
.Repetitive = Tasks(TaskId, 3)
.RunTimer = Tasks(TaskId, 2)
.TaskId = TaskId
.TaskName = Tasks(TaskId, 4)
End With
End Property
'----------------------