Dude with ScrollBar

前端 未结 1 906
终归单人心
终归单人心 2020-12-22 12:22

i\'ve a problem with de ScrollBar in VB6. Watch de next gif:

How can I solve that?

相关标签:
1条回答
  • 2020-12-22 12:38

    Since this is your third question on this topic, I will present a complete and much simpler solution. The first step is to create a UserControl visually using the Designer. The result should look like this:

    You then start building your main form. You can use the UserControl for both the top section and any additional instances you require. The form ends up looking like this:

    The red circle shows a UserControl named uc1 with an Index of 0. The blue circle shows a VScrollBar control inside a PictureBox named Picture1. All additional UserControl's will also be placed inside the PictureBox. Now on to the code:

    Option Explicit
    
    Private index As Integer
    Private oldPos As Integer
    
    Private Sub Form_Load()
       scrollAdd.Min = 0
       scrollAdd.Max = 3000
       scrollAdd.SmallChange = Screen.TwipsPerPixelX * 10
       scrollAdd.LargeChange = scrollAdd.SmallChange
    
       Picture1.Visible = False
    End Sub
    
    Private Sub scrollAdd_Change()
       ScrollControls
    End Sub
    
    Private Sub scrollAdd_Scroll()
       ScrollControls
    End Sub
    
    Private Sub btnAdd_Click()
       index = index + 1
    
       Load uc1(index)
       Set uc1(index).Container = Picture1  'place the control inside the PictureBox
       uc1(index).Visible = True
       uc1(index).Top = IIf(index = 1, 0, uc1(index - 1).Top + uc1(index - 1).Height + 20)
    
       Picture1.Visible = True
    End Sub
    
    Private Sub ScrollControls()
       Dim c As Control
    
       For Each c In Me.Controls
          If c.Container.Name = "Picture1" And Not TypeOf c Is VScrollBar Then
             c.Top = c.Top + (oldPos - scrollAdd.Value)
          End If
       Next
    
       oldPos = scrollAdd.Value
    End Sub
    

    Notice how simple the code has become, in particular the Add event handler. It also works the way you need. At some point you will need to gain access to the state of a UserControl. What I typically do is define properties for the UserControl:

    Option Explicit
    
    Public Property Get AddType() As String
       AddType = cmbAddType.Text
    End Property
    
    Public Property Let AddType(ByVal Value As String)
       cmbAddType.Text = Value
    End Property
    
    Public Property Get AddPrefix() As String
       AddPrefix = txtAddPrefix.Text
    End Property
    
    Public Property Let AddPrefix(ByVal Value As String)
       txtAddPrefix.Text = Value
    End Property
    
    Public Property Get AddNumber() As String
       AddNumber = txtAddNumber.Text
    End Property
    
    Public Property Let AddNumber(ByVal Value As String)
       txtAddNumber.Text = Value
    End Property
    
    Public Property Get AddPrincipal() As Integer
       AddPrincipal = chkAddPrincipal.Value
    End Property
    
    Public Property Let AddPrincipal(ByVal Value As Integer)
       chkAddPrincipal.Value = Value
    End Property
    
    Public Property Get AddLink() As String
       AddLink = cmbAddLink.Text
    End Property
    
    Public Property Let AddLink(ByVal Value As String)
       cmbAddLink.Text = Value
    End Property
    

    With the properties in place, you can now set and get the state of a UserControl using any valid index:

    Private Sub TestTheScreen()
       'you can initialize the controls as needed
       uc1(0).AddPrefix = "My Prefix"
       uc1(0).AddPrincipal = vbChecked
    
       'and at some point retrieve the state
       Dim ap As Integer
       ap = uc1(0).AddPrincipal
    End Sub
    
    0 讨论(0)
提交回复
热议问题