处理 属性 内部数据输入错误的最佳方法是什么?让 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
当然,这是一个有点做作的示例,但它提供了一种将错误原因传达给客户端代码的方法。
在 属性 让 在 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
当然,这是一个有点做作的示例,但它提供了一种将错误原因传达给客户端代码的方法。