#vba #ms-access-2016
#vba #ms-access-2016
Вопрос:
Я пытаюсь перебрать все текстовые поля / выпадающие списки и изменить цвет их границы на красный, если он пуст. Я пробовал предыдущее решение для использования функции «Handle Focus», но цвет границы меняется только на красный, когда я нажимаю на текстовое поле / поле со списком.
- Как изменить цвет границы без необходимости нажимать на нее?
- Во-вторых, как мне получить имя метки для отображения в msgbox вместо имени элемента управления?
Предыдущий пример: https://www.access-programmers.co.uk/forums/threads/change-border-color-of-textboxes-when-they-have-focus.246363/
Public Function validateCase() As Boolean
Dim ctrl As Control
For Each ctrl In Me.Controls
If IsNull(ctrl) Then
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is ComboBox Then
MsgBox (ctrl.Name amp; " is Empty")
ctrl.OnGotFocus = "=HandleFocus([" amp; ctrl.Name amp; "], True)"
End If
End If
Next ctrl
End Function
Public Function HandleFocus(ByRef ctrl As Control, ByVal blnFocus As Boolean)
If blnFocus = True Then
ctrl.BorderColor = RGB(255, 0, 0)
Else
ctrl.BorderColor = RGB(0, 0, 0)
End If
End Function
Ответ №1:
ctrl.LabelName.caption
Измените LabelName на имя вашей метки
Ответ №2:
Короткое замечание к вашему собственному ответу на вопрос о границе: нет абсолютно никаких причин устанавливать фокус перед установкой цвета границы. Вы неправильно поняли цель вопроса, на который вы ссылались: идея заключалась в том, чтобы изменить цвет границы, когда элемент управления попадает в фокус.
Обратите внимание, что вы должны задавать только один вопрос за раз в Stackoverflow. Если вам нужно знать две вещи, задайте два отдельных вопроса.
Чтобы найти метку текстового поля (или аналогичного элемента управления), используйте controls-свойство элемента управления. Метка сохраняется как controls(0)
. Следующие 2 функции извлекают элемент управления label для соответствующего элемента управления. это заголовок:
Function getLabelCaption(ctrl As Control) As String
Dim ctrlLabel As label
Set ctrlLabel = getLabel(ctrl)
If Not ctrlLabel Is Nothing Then getLabelCaption = ctrlLabel.Caption
End Function
Function getLabel(ctrl As Control) As label
On Error Resume Next
If TypeName(ctrl.Controls(0)) = "Label" Then
Set getLabel = ctrl.Controls(0)
End If
On Error GoTo 0
End Function
В вашем коде вы могли бы использовать что-то вроде
Dim caption as String
caption = getLabelCaption(ctrl)
MsgBox Iif(caption = "", ctrl.name, caption) amp; " is Empty")
Ответ №3:
У меня есть частичный ответ.
Я решил первый вопрос, добавив строку ctrl.SetFocus
сразу после ctrl.OnGotFocus
.
У меня нет решения для второго вопроса.