处理 属性 内部数据输入错误的最佳方法是什么?让 VBA 进来

What's the Best Way to Handle Data Entry Errors Inside Property Let in VBA

属性 让 ModelClass 中,我想知道最好的建议方法是什么客户端 class (ViewClass) 关于每个数据输入错误。

请找到ModelClass示例代码,如下:

Option Compare Database
Option Explicit

Private m_idCompra As String

Public Property Get codCompra() As String
    codCompra = m_idCompra
End Property

Public Property Let codCompra(ByVal codigoCompra As String)
    'Data entry roughly treated, just to illustrate.
    If Len(codigoCompra) = 0 Then
        'Advice ViewClass somehow
    ElseIf Not IsNumeric(codigoCompra) Then
        'Advice ViewClass somehow
    'Elseif...
    
    Else
        m_idCompra = codigoCompra
        'Advice ViewClass somehow
    End If
End Property

m_idCompra 必须是 String 类型,在这种情况下。

提前致谢。

对于类似的情况,我添加了方法,例如:

Public Function SetCompra(ByVal codigoCompra As String) As Boolean

    Dim Valid As Boolean

    Valid = IsValidCompra(codigoCompra)
    If Valid Then
        ' Set property.
        m_idCompra = codigoCompra
    Else
        ' Raise error or pop message box.
    End If

    SetCompra = Valid

End Function


Public Function IsValidCompra(ByVal codigoCompra As String) As Boolean

    Dim Valid As Boolean

    If <your validation rules> = True Then
        Valid = True
    End If

    IsValidCompra = Valid

End Function


    

另一种方法是继续使用 属性 Let,但向 class 添加一个错误代码枚举,让用户确定在出现错误时要采取的操作:

例如MySimpleClass模块:

Option Explicit

Private m_strId As String

Public Enum MSC_Errors
    'MS uses this offset to avoid in-built automation error codes AFAIK
    MSC_ID_EMPTY = vbObjectError + 513
    MSC_ID_NOTNUMBER
End Enum

Public Property Get Id() As String
    Id = m_strId
End Property

Public Property Let Id(ByVal sNewVal As String)
    If Len(sNewVal) = 0 Then
        Err.Raise MSC_Errors.MSC_ID_EMPTY, Description:="Id cannot be empty string"
    ElseIf Not IsNumeric(sNewVal) Then
        Err.Raise MSC_Errors.MSC_ID_NOTNUMBER, Description:="Id must be a number"
    End If
    
    m_strId = sNewVal
End Property

那么作为客户端代码的例子:

Sub TestId()
    Dim myobj As New MySimpleClass
    
    On Error GoTo IdError
    
    myobj.Id = InputBox("Enter a numeric Id", "Id Entry")
    
    MsgBox "Good Id=" & myobj.Id
    
    Exit Sub
    
IdError:
    MsgBox Err.Description
    TestId
End Sub

客户端可以进一步查询您提供的错误代码,例如:

If Err.Number = MSC_Errors.MSC_ID_EMPTY Then
    'Assign a default id    
    myobj.Id=42
End If

当然,这是一个有点做作的示例,但它提供了一种将错误原因传达给客户端代码的方法。