كيفية الوصول إلى تسمية عنصر تحكم في التعليمات البرمجية
-
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")
في البداية بحثت عن التسمية بين خصائص النص وضرب بها. ثم نظرت من بين ضوابط النموذج وجدت هناك.
وآمل أن يساعد هذا شخص ما!