Vba 正在寻找更好的方法来设置窗体控件的属性
我以多种形式和多种应用程序使用以下代码:Vba 正在寻找更好的方法来设置窗体控件的属性,vba,ms-access,Vba,Ms Access,我以多种形式和多种应用程序使用以下代码: 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
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”的方法,但不是在表单模块本身中提供代码,而是在只为应用程序提供一次的模块或类模块中提供代码。我认为access的工作方式是,我需要传递一个额外的参数来区分表单。但是,如果表单名称需要作为附加参数传递(例如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
传递表单名称会导致额外的开销,当表单是子表单时出错,当您希望允许同一表单的多个实例(当然,所有实例都具有相同的名称)时出错
您总是希望直接传递表单,这既是因为它避免了这些问题,也是因为它更简洁
< >为了更彻底的返工,我将避免传递字段名称,而使用标记属性来确定哪些字段需要启用/禁用,因为字段不需要独立地禁用或启用。您也可以考虑实现WiTeVunts。请参阅我的文章以获取示例和进一步阅读。