Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 正在寻找更好的方法来设置窗体控件的属性_Vba_Ms Access - Fatal编程技术网

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。请参阅我的文章以获取示例和进一步阅读。