【问题标题】:Looking for a better way to set properties for form controls寻找更好的方法来设置表单控件的属性
【发布时间】:2020-12-11 18:44:30
【问题描述】:

我在多种形式和多个应用程序中使用以下代码:

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”,从而使通话变得更好?

【问题讨论】:

标签: vba ms-access


【解决方案1】:

永远不要传递表单名称,总是传递表单:

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

传递表单名称会导致额外的开销,当您的表单是子表单时会出错,而当您希望允许同一表单的多个实例(当然,它们都具有相同的名称)时会出错。

您总是希望直接传递表单,这既是因为它避免了这些问题,也是因为它更简洁。

为了进行更彻底的返工,我会避免传递字段名称,而是使用 tag 属性来确定哪些字段需要启用/禁用,因为不需要单独禁用或启用字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多