मुझे VB6 में ScrollBar की समस्या है। अगला देखें gif:

enter image description here

मैं इसे कैसे हल कर सकता हूं?

यहां मेरा पूरा कोड है:

Option Explicit
    Private old Post As Integer
    
    Dim index As Integer
    Dim indicee As Integer
    
    Public Disclaimer
    
    Private Sub btnAdd_Click ()
    index = index + 1 'we increase the index
    indicee = indicee + 0 'we start it at 0
    pic1 (indicee) .Visible = True
    
    'Label and TextBox type
    lblType (indicee) .Visible = True
    cmbAddType (indicee) .Visible = True
    
    'Label and TextBox prefix
    lblAddPrefix (indicee) .Visible = True
    txtAddPrefix (indicee) .Visible = True
    
    'Number Label and TextBox
    lblAddNum (indicee) .Visible = True
    txtAddNumber (indicee) .Visible = True
    
    chkAddPrincipal (indicee) .Visible = True
    
    'Label and TextBox link
    lblAddVin (indicee) .Visible = True
    cmbAdd Link (indicee) .Visible = True
    
    'uc1
    Load pic1 (index) 'we create the control
    pic1 (index) .Visible = True 'we make it visible
    pic1 (index) .Top = pic1 (index - 1) .Top + pic1 (index - 1) .Height + 20
    
    'lblType
    Load lblType (index)
    Set lblType (index) .Container = pic1 (index)
    lblType (index) .Visible = True
    lblType (index) .Top = lblType (index - 1) .Top
    'cmbAddType
    Load cmbAddType (index)
    Set cmbAddType (index) .Container = pic1 (index)
    cmbAddType (index) .Visible = True
    cmbAddType (index) .Top = cmbAddTipo (index - 1) .Top
    
    'lblAddPrefix
    Load lblAddPrefix (index)
    Set lblAddPrefix (index) .Container = pic1 (index)
    lblAddPrefix (index) .Visible = True
    lblAddPrefix (index) .Top = lblAddPrefix (index - 1) .Top
    'txtAddPrefix
    Load txtAddPrefix (index)
    Set txtAddPrefix (index) .Container = pic1 (index)
    txtAddPrefix (index) .Visible = True
    txtAddPrefix (index) .Top = txtAddPrefix (index - 1) .Top
    
    'lblAddNum
    Load lblAddNum (index)
    Set lblAddNum (index) .Container = pic1 (index)
    lblAddNum (index) .Visible = True
    lblAddNum (index) .Top = lblAddNum (index - 1) .Top
    'txtAddNumber
    Load txtAddNumber (index)
    Set txtAddNumber (index) .Container = pic1 (index)
    txtAddNumber (index) .Visible = True
    txtAddNumber (index) .Top = txtAddNumber (index - 1) .Top
    
    'checkAddPrincipal
    Load chkAddPrincipal (index)
    Set chkAddPrincipal (index) .Container = pic1 (index)
    chkAddPrincipal (index) .Visible = True
    chkAddPrincipal (index) .Top = chkAddPrincipal (index - 1) .Top
    
    'lblAddVin
    Load lblAddVin (index)
    Set lblAddVin (index) .Container = pic1 (index)
    lblAddVin (index) .Visible = True
    lblAddVin (index) .Top = lblAddVin (index - 1) .Top
    'cmbAdd Link
    Load cmbAdd Link (index)
    Set cmbAdd Link (index) .Container = pic1 (index)
    cmbAdd Link (index) .Visible = True
    cmbAddLink (index) .Top = cmbAddLink (index - 1) .Top
    
    End Sub
    
    
    
    
    
    Private Sub Form_Load ()
       scrollAdd.Min = 0
       scrollAdd.Max = 1000
       scrollAdd.SmallChange = Screen.TwipsPerPixelX * 10
       scrollAdd.LargeChange = scrollAdd.SmallChange
    End Sub
    
    Private Sub scrollAdd_Change ()
    ScrollPictureBox
    End Sub
    
    Private Sub scrollAdd_Scroll ()
    ScrollPictureBox
    End Sub
    
    Private Sub ScrollPictureBox ()
       Dim c As Control
    
       For Each c In Me.Controls
          If c.Container.Name = "pic1" And Not TypeOf c Is VScrollBar Then
             c.Top = c.Top + (oldPos - scrollAdd.Value)
          End if
       Next
    
       oldPos = scrollAdd.Value
    End Sub

क्या कोई मेरी मदद कर सकता है? मुझे स्क्रॉलबार के साथ उस समस्या को हल करने की आवश्यकता है। मुझे इसे सही ढंग से स्थानांतरित करने की आवश्यकता है, मैं इसे कैसे कर सकता हूं?

~ मैंने आपके लिए जीआईएफ जोड़े हैं मेरी "बग/त्रुटि" समझ सकते हैं मेरी अंग्रेजी अच्छी नहीं है लेकिन मुझे आशा है कि आप समझ सकते हैं कि मैं स्क्रॉलबार को जीआईएफ में देखे गए फॉर्म को स्थानांतरित किए बिना सही ढंग से स्थानांतरित करना चाहता हूं। विचार यह है कि बटन दबाते समय, फ़ील्ड जोड़े जाते हैं और स्क्रॉलबार के साथ उन्हें देखा जा सकता है लेकिन जैसा कि आप स्क्रॉलबार सहित पूरे फॉर्म को देखेंगे ~

मुझे जो चाहिए वह यह है कि एक स्क्रॉलबार है जो स्क्रॉलिंग को उन सभी तत्वों को देखने की अनुमति देता है जो हर बार बटन दबाए जाने पर जोड़े जाते हैं।

0
Franqo Balsamo 19 पद 2019, 15:53

1 उत्तर

सबसे बढ़िया उत्तर

चूँकि इस विषय पर यह आपका तीसरा प्रश्न है, इसलिए मैं एक पूर्ण और अधिक सरल समाधान प्रस्तुत करूँगा। पहला कदम डिज़ाइनर का उपयोग करके उपयोगकर्ता नियंत्रण को दृष्टि से बनाना है। परिणाम इस तरह दिखना चाहिए:

enter image description here

फिर आप अपना मुख्य रूप बनाना शुरू करते हैं। आप UserControl का उपयोग शीर्ष अनुभाग और आपके लिए आवश्यक किसी भी अतिरिक्त उदाहरण दोनों के लिए कर सकते हैं। फॉर्म इस तरह दिखने समाप्त होता है:

enter image description here

लाल वृत्त uc1 नाम का UserControl दिखाता है जिसका Index 0 है। नीला वृत्त Picture1 नामक पिक्चरबॉक्स के अंदर VScrollBar नियंत्रण दिखाता है। सभी अतिरिक्त UserControl को भी PictureBox के अंदर रखा जाएगा। अब कोड पर:

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

ध्यान दें कि कोड कितना सरल हो गया है, विशेष रूप से Add ईवेंट हैंडलर। यह आपकी जरूरत के अनुसार भी काम करता है। किसी बिंदु पर आपको UserControl की स्थिति तक पहुंच प्राप्त करने की आवश्यकता होगी। मैं आमतौर पर 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

गुणों के साथ, अब आप किसी भी मान्य अनुक्रमणिका का उपयोग करके UserControl की स्थिति सेट और प्राप्त कर सकते हैं:

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
3
Brian M Stafford 20 पद 2019, 14:17