Я использую приведенный ниже код во многих формах и нескольких приложениях:
Private Sub EnableEdit(strFieldname As String, Optional bUseRed As Boolean = False)
Me.Controls(strFieldname).Enabled = True
Me.Controls(strFieldname).Locked = False
If Not Me.Controls(strFieldname).ControlType = acCheckBox Then
Me.Controls(strFieldname).BackStyle = 1
If bUseRed Then
Me.Controls(strFieldname).ForeColor = vbRed
Else
Me.Controls(strFieldname).ForeColor = vbBlack
End If
End If
End Sub
' and the calls e.g.
EnableEdit ("arHerstellerArtikelNr")
EnableEdit ("arEAN")
EnableEdit ("arArtikelNrIxxtraNice")
EnableEdit ("arSort")
Недавнее изменение показало мне, что было бы намного лучше, чтобы код НЕ дублировался в каждом объекте класса. Сначала моя проблема заключалась в том, что код содержит «Me.Controls (strFieldname)» для обращения к свойствам, которыми я хочу манипулировать. По этой причине он должен был находиться в самом объекте класса --> требующем дублирования.
Поэтому я переписал свой код. Цель разработки заключалась в следующем: способ вызова 'EnableEdit' из событий нескольких форм, но предоставление кода для этого не в самом модуле форм, а в модуле или модуле класса, который предоставляется только один раз для приложения. Я думаю, как работает доступ, мне нужно передать дополнительный параметр, чтобы различать формы. Однако, если имя формы необходимо передать в качестве дополнительного параметра (например, EnableEdit("frmInventoryUpdate", "arSort")), код становится менее читабельным и более подверженным ошибкам. Поэтому мне пришла в голову идея передать имя как инвариант: «EnableEdit (Me.FormName, «arSort»)». Это привело меня к следующему решению:
Public Sub EnableEdit2(strFormName As String, strFieldname As String, Optional bUseRed As Boolean = False)
Dim frmCurrentForm As Form
Set frmCurrentForm = Forms(strFormName)
frmCurrentForm.Controls(strFieldname).Enabled = True
frmCurrentForm.Controls(strFieldname).Enabled = True
frmCurrentForm.Controls(strFieldname).Locked = False
If Not frmCurrentForm.Controls(strFieldname).ControlType = acCheckBox Then
frmCurrentForm.Controls(strFieldname).BackStyle = 1
If bUseRed Then
frmCurrentForm.Controls(strFieldname).ForeColor = vbRed
Else
frmCurrentForm.Controls(strFieldname).ForeColor = vbBlack
End If
End If
End Sub
' and the calls e.g.
Call EnableEdit2(Me.FormName, "arHerstellerArtikelNr")
Call EnableEdit2(Me.FormName, "arEAN")
Call EnableEdit2(Me.FormName, "arArtikelNrIxxtraNice")
Call EnableEdit2(Me.FormName, "arSort")
Решение приемлемо для меня, однако мне интересно, есть ли способ подавить даже «Me.FormName» в вызове и, таким образом, сделать вызовы более приятными?
Никогда не передавайте имя формы, всегда передавайте форму:
Public Sub EnableEdit2(frmCurrentForm As Form, strFieldname As String, Optional bUseRed As Boolean = False)
frmCurrentForm.Controls(strFieldname).Enabled = True
frmCurrentForm.Controls(strFieldname).Enabled = True
frmCurrentForm.Controls(strFieldname).Locked = False
If Not frmCurrentForm.Controls(strFieldname).ControlType = acCheckBox Then
frmCurrentForm.Controls(strFieldname).BackStyle = 1
If bUseRed Then
frmCurrentForm.Controls(strFieldname).ForeColor = vbRed
Else
frmCurrentForm.Controls(strFieldname).ForeColor = vbBlack
End If
End If
End Sub
'Call it:
EnableEdit2 Me, "arHerstellerArtikelNr"
'Never use Call, that's a relic of very old code and not needed in modern code
Передача имени формы вызывает дополнительные накладные расходы, происходит неправильно, когда ваша форма является подчиненной формой, и происходит неправильно, когда вы хотите разрешить несколько экземпляров одной и той же формы (конечно, все они имеют одно и то же имя).
Вы всегда хотите передавать форму напрямую, потому что это позволяет избежать этих проблем и потому что это более лаконично.
Для более тщательной переработки я бы не стал передавать имя поля и вместо этого использовал бы свойство тега, чтобы определить, какие поля нуждаются в этом включении/отключении, учитывая, что поля не нужно отключать или включать независимо.
Вы также можете рассмотреть возможность реализации WithEvents. См. мою статью Создание цветовой палитры и селектора Windows Phone с помощью WithEvents для примера и дальнейшего чтения.