Option Explicit
'号码抽奖机制作
'百度Hi - pivotstar 原创代码,尚未修饰,请指教。
Dim A() As String, n As Integer '全程 n 值不要有其他再归零的赋值(公平值)
Private Sub Command1_Click()
Dim i As Integer, j As Integer, tmp As String
'建立人数范围
'只需要运行一次,直到抽奖过程全部完毕,所以不再给点击。
Command1.Enabled = False
Erase A
ReDim A(Int(Val(Text1.Text) - 1))
For i = LBound(A) To UBound(A)
A(i) = Right(String(Len(Text1.Text), "0") & CStr(i + 1), Len(CStr(Val(Text1.Text))))
Next i
'打乱排序
For i = LBound(A) To UBound(A)
j = (UBound(A) - i) * Rnd + i
If i <> j Then
tmp = A(i)
A(i) = A(j)
A(j) = tmp
End If
Next i
'填入List1(因为一般抽奖不能重复得奖,已得奖者从List1列表移除)
For i = LBound(A) To UBound(A)
List1.AddItem A(i)
Next i
Label1.Caption = String(Len(Text1.Text), "0")
' 给 n 一个随机值
n = Int(Rnd * (List1.ListCount)) '随机取值0至(人数减1)
'开始等候启动【开始抽奖】按钮
End Sub
Private Sub Command2_Click()
'开始计时抽奖
If List1.ListCount = 0 Then Exit Sub
Timer2.Interval = 10 '计数300次为3秒(3秒有点少,刺激度不够)
'这里也可以给 n 指定一个随机值
Timer1.Interval = Int((111 - 82 + 1) * Rnd + 82) '随机取值82毫秒至111毫秒
Timer1.Enabled = True
Timer2.Enabled = True
Command2.Enabled = False
Command3.Enabled = True
End Sub
Private Sub Command3_Click()
'奖号已经开出,领奖动作。
' n 值是停留在 n
Command3.Enabled = False
MsgBox "核对领奖者是不是 " & List1.List(n)
'把该领奖者从列表中移除或另外保存文件
List1.RemoveItem (n)
If List1.ListCount = 0 Then
MsgBox "抽奖完毕"
'这里把窗口重新整理为启动初始值,或关闭程序。
Exit Sub
End If
'接着启动下一次【开始抽奖】按钮
Command2.Enabled = True
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
'假设有1200人
Text1.Text = "1200"
Label1.Caption = String(Len(Text1.Text), "0")
ReDim A(0) '便于Erase指令不出错
End Sub
Private Sub Text1_Change()
Label1.Caption = String(Len(CStr(Val(Text1.Text))), "0")
End Sub
Private Sub Timer1_Timer()
n = n + 1
If n >= List1.ListCount Then n = 0
Label1.Caption = List1.List(n)
Label1.Refresh
End Sub
Private Sub Timer2_Timer()
Static k As Integer
k = k + 1
If k >= 300 Then '3秒自动停止
Timer1.Enabled = False
Timer2.Enabled = False
k = 0
End If
End Sub
'附注:
'使用2个Timer不使用Do...Doevents .3000ms..Loop 循环计时三秒(避免窗口卡卡)
'经CPU资源测试,采用2个Timer模式。占用CPU资源比Do...Doevents...Loop 少。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)