netice 2006-10-21 22:27
关于滚动条控制控件位置问题
偶放了i个单选控件
但窗体很小,想用滚动条控制他们的位置
。。因为已经事先加载好了。。
只是想让它们机器向上移动,向下移动
。。。可是。。偶下向下后就剩一行了。。剩下的估计都被第一行覆盖
点向上。。就是不能恢复。。郁闷。。代码就是整体移动了。。。
Private Sub VScroll1_Change()
For i = 1 To ImgListHeard.ListImages.Count
OptHeard(i).Top = -VScroll1.Value
Next i
End Sub
。。怎么回事呢?
弄了半天百思不得其解。。。。
Nothing 2006-10-21 23:25
算法问题
你应当计算一个有多少个控件,每个控件有多高。
Vscroll1.max=ImgListHeard.ListImages.Count
Private Sub VScroll1_Change()
For i = 1 To ImgListHeard.ListImages.Count
OptHeard(i).Top = -VScroll1.Value+i*控件的高
Next i
End Sub
netice 2006-10-21 23:37
好象不对啊。。。
OptHeard(i).Top = -VScroll1.Value+i*控件的高
的后果的从第2个就开始变位置。。
依次向下了。。像楼梯。。。
Nothing 2006-10-21 23:49
这是一个方法,你仔细研究一下
OptHeard(i).Top和高和下面的这几个参数相关,你仔细研究一下算法
OptHeard(i).Top = -VScroll1.Value+i*控件的高
netice 2006-10-22 00:03
..呵呵。。谢谢。。偶换了个方法。。直接把控件放在Picture控件里了。。直接对Picture控件移动
就可以了。。呵呵。。
不过。。OptHeard(i).Top = -VScroll1.Value+i*控件的高 这个不太理解。。
按道理直接OptHeard(i).Top = -VScroll1.Value就可以。。。呵呵
Nothing 2006-10-22 13:02
OptHeard(i).Top = -VScroll1.Value
晕
你不是有很多OptHeard控件吗?每个控件的高都是一样的,肯定叠在一块,你需要一个一个的向下放。
netice 2006-10-22 14:08
对啊。。
主要是我先加载好。。
也分过行的。。。
但是窗体很小显示不开而已。。。
用滚动条来让它向上向下移动显示出来。。。
。。本来能显示一半的。移动一下后就变成一行了。。。
Option Explicit
Private Sub Form_Load()
Dim i As Integer
OptHeard(1).Picture = ImgListHeard.ListImages(1).Picture
OptHeard(1).Value = False
OptHeard(1).Caption = ""
For i = 2 To ImgListHeard.ListImages.Count
Load OptHeard(i)
OptHeard(i).Visible = True
OptHeard(i).Value = False
OptHeard(i).Caption = ""
OptHeard(i).Left = OptHeard(i - 1).Left + OptHeard(i).Width + 100
OptHeard(i).Top = OptHeard(i - 1).Top
If FrmHeard.Width - OptHeard(i).Left <= 800 Then
OptHeard(i).Left = OptHeard(1).Left
OptHeard(i).Top = OptHeard(i - 1).Top + OptHeard(i).Height + 100
End If
OptHeard(i).Picture = ImgListHeard.ListImages(i).Picture
Next i
VScroll1.Max = Picture1.Height - FrmHeard.Height
VScroll1.LargeChange = 100
VScroll1.SmallChange = 20
VScroll1.Value = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
FrmGetnum.Enabled = True
End Sub
Private Sub OptHeard_Click(Index As Integer)
ChangeHeard = OptHeard(Index).Index
FrmGetnum.PicHeard.Picture = ImgListHeard.ListImages(ChangeHeard).Picture
Unload Me
End Sub
[color=red]Private Sub VScroll1_Change()
Picture1.Top = -VScroll1.Value'修改前就是楼顶的形式。。不行的
End Sub[/color]
Private Sub VScroll1_Scroll()
Call VScroll1_Change
End Sub
这是修改后的。。。
[[i] 本帖最后由 netice 于 2006-10-22 14:10 编辑 [/i]]
Nothing 2006-10-22 17:10
我觉得可以不用Picture,你仔细想想我给你的代码,肯定可以的
注意:
VScroll1.Max = ImgListHeard.ListImages.Count
VScroll1.LargeChange = 1
VScroll1.SmallChange = 1
VScroll1.Value = 0
其实你已经在Load事件中计算了每个控件的高了,你需要当滚动条发生变化时再计算一次,你只需改变最上面的控件,其他的都按这个控件的相对位置进行计算就可以了。