当窗体缩小后想要用滚动条滚动来显示其它控件,查到可以用这样的语句:Private Sub VScroll1_Change()
For Each c In Form1.Controls
    If c.Name <> "VScroll1" And c.Name <> "HScroll1" Then c.Top = c.Top - VScroll1.Value
Next
End Sub
但是运行后提示错误:'top'属性在运行时不可读,请问这个该怎么改了?

解决方案 »

  1.   

    If c.Name <> "VScroll1" And c.Name <> "HScroll1" Then c.Top = c.Top - VScroll1.Value 
    这句出的问题在哪里?为什么不能遍历所有控件?
      

  2.   

    直接打印没问题,但是用上
    If c.Name <> "VScroll1" And c.Name <> "HScroll1" Then c.Top = c.Top - VScroll1.Value 
    这句就不能遍历全部控件了,没搞清楚这句出的问题在哪里.求教.
      

  3.   

    你用了一些没有top属性的控件,比如timer,比如菜单,你判断下,不要操作那些运行时不可见的控件的top属性
    If c.Name <> "VScroll1" And c.Name <> "HScroll1" c.Name <> "Timer1" Then c.Top = c.Top - VScroll1.Value 
      

  4.   

    是操作了不可见的控件造成的.
    追问一句,我向上移动了控件,怎么才能将控件移动下来呢?For Each c In Form1.Controls  
      If TypeOf c Is Frame Then
          c.Top = c.Top - VScroll1.Value
      End If
    Next
    将max设为500将min设为-500后要点两次控件才会下移,对这个不熟很迷惑.
      

  5.   

    卷动客户区域即可,scrollwindow
      

  6.   

    搞复杂了。简单的方法是用一个 PictureBox 作滚动的容器:
    在窗体上新增一个 PictureBox(假定命名为 Picture1)。
    将 VScroll1 以外的需要被滚动的控件全都移入 Picture1 内(框选,Ctrl+X,选中 Picture1,Ctrl+V)。
    调整控件布局。
    Picture1 调整大小,设置 BorderStyle = 0 - None
    Option ExplicitPrivate Sub Form_Load()
        Picture1.Move 0, 0
        With VScroll1
            .Min = 0
            .SmallChange = 120
        End With
    End SubPrivate Sub Form_Resize()
        If Me.WindowState = vbMinimized Then Exit Sub
        
        On Error Resume Next
        With VScroll1
            .Move ScaleWidth - .Width, 0, .Width, ScaleHeight
            
            If ScaleHeight >= Picture1.Height Then
                .Max = 0
                .Value = 0
            Else
                .Max = Picture1.Height - ScaleHeight
                .SmallChange = 120
                .LargeChange = ScaleHeight
            End If
        End With
        On Error GoTo 0
    End SubPrivate Sub VScroll1_Change()
        Picture1.Top = -VScroll1.Value
    End Sub
      

  7.   

    这样好象差个change的数,我试的结果例假如change为50,那么第一次0-50是移动了,但反方向的时候value先为了0,那么50-0的时候由于value先到0,就少了50.
      

  8.   

    我用水平滚动是按Value =10+10+10+10这样滚动的,怎么我用垂直滚动条就按成了Value=10+20+30+40 这样滚动的,垂直滚动越往后的步距越大,请问下大家的也是这样吗?
      

  9.   

    莫名其妙!
    没看懂你在说什么?
    Private Sub VScroll1_Change()
        Picture1.Top = -VScroll1.Value
    End Sub
    假如 VScroll1 的范围是 0~100
    那么 Picture1.Top 的范围就是 0~-100
      

  10.   

    支持老虎的方案,控件都放一个图片框中即可,判断一下图片框与窗体客户区的大小,如果客户区小于图片框,那就显示滚动条控制图片框的top与left
      

  11.   

    我是将控件放在Frame里,改变VScroll后通过改变Frame的位置属性来改变实现,我对VScroll的设置是:
    VScroll1.LargeChange = 10
    VScroll1.Max=100
    按Max来计算,VScroll1查看Frame.Top的值分别是:
      4800  4700   4500   4200    3800    3300           
    相差值:  100     200    300     400     500 总差值=500+400+300+200+100=1500
    我的理解它应按   4600  4500  4400  4300  4200  4100 也就是总差值应该是
    总次数*Max=100+100+100+100+100=500,但显然不是这样的,我的理解哪里错了吗?
    按LargeChange来计算,VScroll1查看Frame.Top的值分别是:
        4910  4890  4860  4820  4770
    相差值:      20    30    40    50    总差值=20+30+40+50=140
    这样越往后移动的距离越大,怎么才能实习均匀移动相同数值呢?
      

  12.   

    本帖最后由 bcrun 于 2013-02-22 13:55:34 编辑