Выделите фон поля в непрерывной форме - PullRequest
1 голос
/ 10 июля 2019

У меня есть непрерывная форма доступа.Я хотел бы изменить основной цвет поля конкретной записи.

У меня есть поле, которое нужно выделить из поля FieldModified.Так, например, FieldModified = "Converted".Преобразуется как поле в моей форме.

Я хотел бы изменить цвет поля «Преобразовать» и сделать это для каждой записи в форме.

Я думал, что этот код будет работать, но я получаю сообщение об ошибке. [FieldModified] .ForeColor.И мне нужно сделать это для каждой записи в форме.

Код:

    Private Sub Form_Load()
    Dim fldName As String
    fldName = Me.FieldModified.value
    If (Not IsNull(fldName)) Then
     Me.[fldName].ForeColor = vbRed '<--doesn't recognize fldName value
    End If
End Sub

Обновлен код, но он выдает ошибку 438 о том, что объект не поддерживает это свойство или метод.Но форма выделяет поля формы, но выделяет больше, чем одно поле "fldName"

Private Sub Form_Load()
Dim rstForm As String
Dim fldName As String
Set rstForm = Me.ChangedData.Form.Recordset

Do While Not rstForm.EOF
fldName = Me.FieldModified.value    
If (Not IsNull(fldName)) Then
    Me.Controls(fldName).ForeColor = vbRed '<--doesn't recognize fldName value
End If

rstForm.MoveNext
Loop
End Sub

Ответы [ 2 ]

3 голосов
/ 13 июля 2019

Вы устанавливаете формат по умолчанию для элемента управления. Каждая копия элемента управления в непрерывной форме использует этот формат. Для форматирования по условию (fldName = Me.FieldModified.value) вам нужно Условное форматирование , как сказал вам Андре, или использовать событие рисования подробных разделов (см. Обновление внизу)

В мастере условного формата вы можете создать условие с Expression Is и [Converted].Name = [FieldModified] для каждого элемента управления формы, который должен быть выделен, если его имя соответствует FiledModified. В выражениях Ms Access нельзя использовать Me, просто опустите его.

Вы можете использовать VBA для форматирования всех элементов управления с помощью FormatConditions по коду. Если вы хотите изменить существующее условие, используйте .Modify вместо .Add

Private Sub Form_Load()
  Dim ctl As Access.Control
  For Each ctl In Me.Controls ' loop through all controls of form
      On Error Resume Next ' Not all controls can have conditional format (e.g. labels). To save the check of control type, we ignore errors here
      ctl.FormatConditions.Add(acExpression, , ctl.Name & ".Name=[FieldModified]").BackColor = vbRed 'add o format condition to control if possible, else an error is raised but ignored
      If Err.Number Then 'show errors
          Debug.Print "Error: " & Err.Number & " - " & Err.description & " in Control: " & ctl.Name & " Type is " & TypeName(ctl)
          Err.Clear 'reset error to catch next
      Else
          Debug.Print "FormatCondition added to Control: " & ctl.Name & " Type is " & TypeName(ctl)
      End If
  Next ctl
  On Error GoTo 0 ' turn on errors again, maybe add an error handler (On Error Goto MyErrHandler)
End Sub

Обновление:
Вы можете использовать событие Details_Paint формы, чтобы отформатировать один и тот же элемент управления для каждой записи. Это включает условный формат для элементов управления без свойства FormatConditions, таких как метки, кнопки.

Private Sub Detail_Paint()
Dim c As Access.Control

For Each c In Me.Detail.Controls
    If c.Name = Me.FieldModified.Value Then
        c.ForeColor = vbRed
    Else
        c.ForeColor = vbBlack
    End If
Next
End Sub
1 голос
/ 10 июля 2019

Вы не можете использовать переменную String, подобную этой, fldName - это идентификатор, содержащий значение String, а не идентификатор - в Me.ControlName, как Me, так и ControlName являются идентификаторами .

Но не вся надежда потеряна! Вы можете использовать String для извлечения Control объекта из формы!

Все элементы управления формы должны существовать в коллекции Controls формы с ключом по имени:

Me.Controls(fldName).ForeColor = vbRed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...