كيفية الوصول إلى تسمية عنصر تحكم في التعليمات البرمجية

StackOverflow https://stackoverflow.com/questions/1637083

  •  06-07-2019
  •  | 
  •  

سؤال

لا بد في كثير من الأحيان عنصر تحكم التسمية إلى النص أو سيطرة أخرى مماثلة. وأنا أعلم أن هناك وسيلة للوصول إلى التسمية خلال التعليمات البرمجية، لكنني لا أتذكر كيفية القيام بذلك.

ويمكن لأي شخص أن تساعد؟

وربما شيء من هذا القبيل:

Me.txtName.Child!lblName.Value

أو

Me.txtName.Parent!lblName.Value

وسأستخدم هذا وأنا عندما تعداد من خلال التحكم في نموذج لأغراض التحقق من الصحة. ثم أريد أن استخدام تسمية عنصر تحكم ممكن من المعلومات في رسالة خطأ لتظهر للمستخدم حيث الخطأ.

هل كانت مفيدة؟

المحلول

ومع النص يمكنك محاولة

Text0.Controls.Item(0).Caption

وحيث تحكم 0 هي التسمية مرتبطة

نصائح أخرى

وAstander قدمت الجواب الصحيح، ولكن نأخذ في الاعتبار أن ليس كل الضوابط لديها نفس النوع من مجموعات عناصر التحكم.

ومربعات النص، كومبوبوكسيس، مربعات سرد، خانات الاختيار وبحد أقصى 1 عنصر في مجموعة ضوابطها (التسمية المرفقة)، ولكن إذا لم يتم إرفاق التسمية، فإنها لن حتى يكون ذلك، لذلك .Controls (0) سوف رمي خطأ.

وهناك مجموعة الخيار ديها ضوابط متعددة، والتسمية وزر الخيار أو تبديل أزرار داخل الإطار. عند إسقاط مجموعة الخيارات على النموذج من شريط الأدوات أدوات النموذج، يتم إنشاء الإطار مع تسمية المرفقة، لذلك سوف يكون عنصر التحكم مع مؤشر 0. ولكن إذا، على سبيل المثال، يمكنك حذف التسمية الافتراضية، إضافة أزرار الخيار و ثم إضافة مرة أخرى تسمية، فإنه لن يكون المؤشر 0، ولكن مؤشر .Controls.Count - 1

وهكذا، على سبيل التسمية التوضيحية من lable ومجموعة الخيار، إما تريد أن تكون حذرا أنه إذا قمت بحذف التسمية الافتراضية، يمكنك أيضا حذف الضوابط داخل الإطار بعد إضافة تسمية الخلف. إذا كان هذا ليس هو الحال، تحتاج إلى اسم التسمية والرجوع إليه بالاسم، لأن التسميات لأزرار الخيار / تبديل هي جزء من مجموعة عناصر التحكم مجموعة خيار (وهذا فاجأني - كنت أتوقع منهم أن يكون إلا في عناصر التحكم مجموعة من زر الخيار / تبديل التي كانوا المرفقة).

لتجنب هذه المشكلة، ويمكنني أن أتخيل كود معقد حيث يمكنك يحلق من خلال مجموعة عناصر التحكم مجموعة الخيارات لتبحث عن التسميات التي تعلق على أزرار الخيار / تبديل، ثم يحلق من خلال مجموعة عناصر التحكم مجموعة الخيارات لمرة ثانية، هذه المرة تبحث فقط في التسميات. شيء من هذا القبيل:

  Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As Control
    Dim ctl As Control
    Dim strOptionToggleLabels As String

    If ctlOptionGroup.ControlType <> acOptionGroup Then
       MsgBox ctlOptionGroup.Name & " is not an option group!", _
         vbExclamation, "Not an option group"
       Exit Function
    End If
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acOptionButton, acToggleButton
          If ctl.Controls.Count = 1 Then
             strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
          End If
      End Select
    Next ctl
    strOptionToggleLabels = strOptionToggleLabels & " "
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acLabel
          If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
             Set FindOptionGroupLabel = ctl
          End If
      End Select
    Next ctl
    Set ctl = Nothing
  End Function

والآن، وهذا يكسر إذا لم يكن هناك التسمية المرفقة، لذلك ربما يكون أكثر منطقية لذلك لإرجاع اسم التسمية، بدلا من الإشارة التحكم:

  Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As String
    Dim ctl As Control
    Dim strOptionToggleLabels As String

    If ctlOptionGroup.ControlType <> acOptionGroup Then
       MsgBox ctlOptionGroup.Name & " is not an option group!", _
         vbExclamation, "Not an option group"
       Exit Function
    End If
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acOptionButton, acToggleButton
          If ctl.Controls.Count = 1 Then
             strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
          End If
      End Select
    Next ctl
    strOptionToggleLabels = strOptionToggleLabels & " "
    For Each ctl In ctlOptionGroup.Controls
      Select Case ctl.ControlType
        Case acLabel
          If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
             FindOptionGroupLabel = ctl.Name
          End If
      End Select
    Next ctl
    Set ctl = Nothing
  End Function

وربما يكون من الممكن القيام بذلك مع حلقة واحدة من خلال مجموعة عناصر التحكم مجموعة الخيارات، ولكن فوات! ما يبدو وثيق جدا لواقية من الرصاص، وليس أي شخص يعطي الحمار فأر، وبطبيعة الحال! :)

إذا صولها أعتقد أنه

وأشكال! YourFormName! YourField.Value

وأو إذا كان لديك الفرعية شكله:

وأشكال! yourMainForm! YourSubForm! YourField.Value

وهنا بعض التعليمات البرمجية التي كتبت إعادة تسمية التسميات المرتبطة OptionButtons. تسمية لديها ممتلكات الوالد الذي يشير إلى السيطرة عليه تسميات. وظيفة هي عامة جدا بينما writtenn روتين لOptionButtons. يجب أن تعمل هذا الرمز بالنسبة لمعظم أي شيء ما عدا أنه عندما لا يرتبط التسمية، وأنا لم تقدم أي انتعاش.

وظيفة عمومية paNameControlLabel (FormName وسلسلة ControlName كسلسلة) وسلسلة     والعلاجات قاتمة ونموذج     CTL قاتمة وتحكم     خافت ctlLabel وتحكم     خافت ctlParent ومراقبة

Set frm = Forms(FormName)
For Each ctl In frm.Controls
    Select Case ctl.ControlType
        Case acLabel
            If ctl.Parent.Name = ControlName Then
                Debug.Print "Label " & ctl.Name & " Renamed to lbl" & ControlName
                ctl.Name = "lbl" & ControlName
                paNameControlLabel = ctl.Name
            End If
    End Select
Next ctl

النهاية وظيفة paNameOptionButtonLabels الفرعية الجمهور (FormName كسلسلة)     والعلاجات قاتمة ونموذج     CTL قاتمة ومراقبة

Set frm = Forms(FormName)
For Each ctl In frm.Controls
    If ctl.ControlType = acOptionButton Then
        Debug.Print paNameControlLabel(FormName, ctl.Name)
    End If
Next ctl
Set frm = Nothing

النهاية الفرعية

وفي وقت متأخر ربما، ولكني كافحت مع هذا، وماذا عملت وللتحقق من نوع من الرقابة للتأكد من أنها تدعم العلامات، ثم استخدم

ctl.Properties(3) ' For the label name
Forms(ctl.Form).Controls(ctl.Properties(3)).Caption ' For the label text

في الإطار الحالي، وذلك باستخدام مؤشر النص بدلا من الرقم السحري: عملت ctl.properties("LabelName")

في البداية بحثت عن التسمية بين خصائص النص وضرب بها. ثم نظرت من بين ضوابط النموذج وجدت هناك.

وآمل أن يساعد هذا شخص ما!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top