Private Sub Timer2_Timer() Static i As Long Dim j As Long Dim C As Integer
For j = Picture6.lbound To Picture6.UBound Picture6(j).Visible = (i = j) Next
i = i + 1
If i > Picture6.UBound Or Picture6(i).Picture.Handle = 0 Then i = Picture6.lbound End If End Sub
经测试不行,这种更改跟if Picture6(i).Picture.Handle = 0 Then i=0 是一样的效果,图像停止在第一副图不动。
关键是如何检测 PictureBox 是空的。是 Picture6(i).Picture.Handle = 0 吗?你可以试试在立即窗口中使用 i 为一个空图片框的 Index 来测试: ?Picture6(i).Picture.Handle另外,可以试试 Picture6(i).Picture = Nothing Private Sub Form_Load() Dim i As Long For i = Picture6.lbound To Picture6.UBound Picture6(i).Visible = False Next i '...... End SubPrivate Sub Timer2_Timer() Static i As Long Static j As Long If i = 0 Then Picture6(Picture6.UBound).Visible = False Picture6(j).Visible = False Else Picture6(i - 1).Visible = False End If Picture6(i).Visible = True If i = Picture6.UBound Then i = 0 Else If Picture6(i + 1).Picture = Nothing Then j = i i = 0 Else i = i + 1 End If End If End Sub
Picture6(i).Picture is nothing => If Picture6(i + 1).Picture is Nothing Then
Picture6(i).Picture is nothing => If Picture6(i).Picture is Nothing Then
让图片框缺省不可见:Private Sub Timer2_Timer() Static i As Long, j As Long Picture1(j).Visible = False If Picture1(i).Picture.Handle Then Picture1(i).Visible = True j = i End If Do i = (i + 1) Mod Picture1.Count Loop Until Picture1(i).Picture.Handle End Sub
控件数组可以动态加载的,有几幅图就加载几个,就没有判断的需要了。 '设计时只保留一个 Picture6(0) '加载前 Timer2.Enabled = FalsePrivate Sub Form_Load() Dim lCount As Long Dim W As Single Dim H As Single Dim i As Long '卸载 For i = Picture6.UBound To 1 Step -1 Unload Picture6(i) Next
'模拟图片数量和大小 lCount = 1 + Int(Rnd() * 20) W = 1200 H = 600
'加载 Picture6(0).Move 0, 0, W, H Picture6(0).Picture = 图片(0) For i = 1 To lCount - 1 Load Picture6(i) Picture6(i).Move 0, 0, W, H Picture6(i).Picture = 图片(i) Next
Timer2.Enabled = True End Sub
本帖最后由 bcrun 于 2013-04-28 12:45:22 编辑
本来看了楼主的贴子,我想说的也跟1F是一样的。 但看了楼主在2F的回复,似乎察觉到了点什么苗头。楼主试下这个代码,应该符合你的想法了: Private Sub Timer2_Timer() Static i As Long Dim j As Long Dim C As Integer For j = Picture6.lbound To Picture6.UBound Picture6(j).Visible = False Next j Picture6(i).Visible = True i = i + 1 'If Picture6(i).Picture.Handle = 0 Then Exit Sub 'If i = j Then i = 0 '这句不要 '添加下面的代码: For j = i To Picture1.UBound If (Picture6(j).Picture.Handle) Then i = j: Exit Sub Next If (j > Picture1.UBound) Then i = 0 End Sub
22F的代码中,Picture1改成Picture6
22楼的代码真的很好. 我想了一个,本来以为很难做.其实方法很多的. 假如有100张图片,就不需要经常循环了,下面的代码只要稍许改造,把循环和判断放在加载中和以及arr()数组放在公用即可,那么在Timer事件中甚至不需要循环都可以做到的.昨天喝多了,早睡了, 难得今天早起,呵呵.Private Sub Timer2_Timer() Static i As Long, j As Long, k As Long, arr() For j = Picture6.lbound To Picture6.UBound Picture6(j).Visible = False If Picture6(j).Picture.Handle Then k = k + 1 ReDim Preserve arr(1 To k) arr(k) = j End If Next j i = i + 1 Picture6(arr(i)).Visible = True If i > k Then i = 1
End Sub
接上楼, 也就是这样Dim k As Long Dim arr()Private Sub Form_Load() Dim j As Long ReDim arr(1 To Picture6.UBound + 1) For j = Picture6.lbound To Picture6.UBound Picture6(j).Visible = False If Picture6(j).Picture.Handle Then k = k + 1 arr(k) = j End If Next j End SubPrivate Sub Timer2_Timer() Static i As Long i = i + 1 Picture6(arr(i)).Visible = True If i > 1 Then Picture6(arr(i - 1)).Visible = False If i > k Then i = 1
Static i As Long
Dim j As Long
Dim C As Integer
For j = Picture6.lbound To Picture6.UBound
Picture6(j).Visible = (i = j)
Next
i = i + 1
If i > Picture6.UBound Or Picture6(i).Picture.Handle = 0 Then
i = Picture6.lbound
End If
End Sub
?Picture6(i).Picture.Handle另外,可以试试 Picture6(i).Picture = Nothing
Private Sub Form_Load()
Dim i As Long For i = Picture6.lbound To Picture6.UBound
Picture6(i).Visible = False
Next i
'......
End SubPrivate Sub Timer2_Timer()
Static i As Long
Static j As Long If i = 0 Then
Picture6(Picture6.UBound).Visible = False
Picture6(j).Visible = False
Else
Picture6(i - 1).Visible = False
End If
Picture6(i).Visible = True If i = Picture6.UBound Then
i = 0
Else
If Picture6(i + 1).Picture = Nothing Then
j = i
i = 0
Else
i = i + 1
End If
End If
End Sub
If Picture6(i + 1).Picture is Nothing Then
If Picture6(i).Picture is Nothing Then
Static i As Long, j As Long Picture1(j).Visible = False
If Picture1(i).Picture.Handle Then
Picture1(i).Visible = True
j = i
End If
Do
i = (i + 1) Mod Picture1.Count
Loop Until Picture1(i).Picture.Handle
End Sub
'设计时只保留一个 Picture6(0)
'加载前 Timer2.Enabled = FalsePrivate Sub Form_Load()
Dim lCount As Long
Dim W As Single
Dim H As Single
Dim i As Long
'卸载
For i = Picture6.UBound To 1 Step -1
Unload Picture6(i)
Next
'模拟图片数量和大小
lCount = 1 + Int(Rnd() * 20)
W = 1200
H = 600
'加载
Picture6(0).Move 0, 0, W, H
Picture6(0).Picture = 图片(0)
For i = 1 To lCount - 1
Load Picture6(i)
Picture6(i).Move 0, 0, W, H
Picture6(i).Picture = 图片(i)
Next
Timer2.Enabled = True
End Sub
但看了楼主在2F的回复,似乎察觉到了点什么苗头。楼主试下这个代码,应该符合你的想法了:
Private Sub Timer2_Timer()
Static i As Long
Dim j As Long
Dim C As Integer For j = Picture6.lbound To Picture6.UBound
Picture6(j).Visible = False
Next j
Picture6(i).Visible = True
i = i + 1
'If Picture6(i).Picture.Handle = 0 Then Exit Sub
'If i = j Then i = 0 '这句不要
'添加下面的代码:
For j = i To Picture1.UBound
If (Picture6(j).Picture.Handle) Then i = j: Exit Sub
Next
If (j > Picture1.UBound) Then i = 0
End Sub
Static i As Long, j As Long, k As Long, arr()
For j = Picture6.lbound To Picture6.UBound
Picture6(j).Visible = False
If Picture6(j).Picture.Handle Then
k = k + 1
ReDim Preserve arr(1 To k)
arr(k) = j
End If
Next j
i = i + 1
Picture6(arr(i)).Visible = True
If i > k Then i = 1
End Sub
接上楼, 也就是这样Dim k As Long
Dim arr()Private Sub Form_Load()
Dim j As Long
ReDim arr(1 To Picture6.UBound + 1)
For j = Picture6.lbound To Picture6.UBound
Picture6(j).Visible = False
If Picture6(j).Picture.Handle Then
k = k + 1
arr(k) = j
End If
Next j
End SubPrivate Sub Timer2_Timer()
Static i As Long
i = i + 1
Picture6(arr(i)).Visible = True
If i > 1 Then Picture6(arr(i - 1)).Visible = False
If i > k Then i = 1
End Sub