我有很多例子,我从一个基本的子表单开始,然后我有 3 个其他子表单建立在它之上,每个子表单都在基本子表单上添加了一些不同的元素。这意味着我对每个子表单都有一个代码页,其中有很多重复。是否可以将公共元素放入单独的模块中,并在其代码页上仅保留与每个子表单相关的附加代码?这有任何性能问题吗?
3 回答
关于你问题的最后一部分,“这有什么性能问题吗? ”
我知道有两个后果:
- 表单加载时间
- 内存使用
作为一个假设示例,假设您有一个带有选项卡控件的表单。该选项卡控件包含 10 个页面,每个页面包含一个子表单。如果这些子表单包含相同 VBA 代码的副本,则必须为每个子表单再次加载该公共代码。这需要时间并增加内存使用。
如果您将公共代码移动到标准模块并从子表单中引用它,则只需加载一次...减少表单加载时间和内存消耗。
所以最终结果是您正在考虑的方法可以使您的应用程序更具响应性......这可能会导致更快乐的用户。
但是,即使这种方法没有产生明显的性能改进,我仍然会这样做,因为这意味着您只需要维护一份通用代码的副本。
简短的回答,是的,这样做,拆分每个表单之间重复的代码。
更长的答案,但在我看来,将重复的代码提取到单独的模块或类中是更好的方法。
类使您的代码更易于管理和维护。如果您在多个地方都有相似的代码,那么维护会更加困难,因为您必须在每个位置进行更改。将它放在一个地方可以更容易地管理和维护。
优点列表来自Chicago Access Users Group (CAUG) talk - "Class Modules in Access"
:
Advantages of using classes/objects:
- let's you create more complex objects than tables or queries provide
alone
- using classes within classes let's you restrict function visibility
- class methods & attributes are more descriptive than module's
function list alone
- let's you use Intellisense for more efficient coding
- no "ambiguous name" errors with multiple copies of the same class
module
- can copy class modules without worry of creating ambiguous function
names
- static variables are implicit in class objects, and so are easier to
manage
- isolating access layers within wrapper classes promote
portability/maintainability
- better support for separation of UI/business logic/data access =
n-tier development
- promotes modular thinking in analysis, design
- easier to adapt many publicly-available object models to Access apps
- prepares you for transition to .NET and other fully object-oriented
architectures
如果我理解这个问题,是的,您可以通过将一定数量的代码移动到标准代码模块中来集中它。可能有很多方法可以做到这一点,但更好的方法之一是将表单对象传递给您的函数。这是一个例子:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If ValidateContact = False Then Cancel = True
End Sub
'This code goes in a standard code module not associated with any form
Public Function ValidateContact(ByRef frm as Form) as Boolean
Dim bValid as Boolean
bValid = True
If Nz(frm!FirstName, "") = "" Then
MsgBox "First Name cannot be blank."
bValid = False
ElseIf Nz(frm!LastName, "") = "" Then
MsgBox "Last Name cannot be blank."
bValid = False
End If
ValidateContact = bValid
End Function
另外,如果我理解正确,您的问题根本不是关于使用类模块/类对象,至少不是明确的。(事实上,基本上你在 Access 中编写的每一段代码都在使用类对象,通常是隐式的。)另一个 SO 用户已经发布了一个很好的答案,关于在 Access 中使用类对象的好处,所以我不会解释更多关于这一点。事实上,标准代码模块基本上是一个单例类,不需要像类对象那样实例化。首选单例/标准代码模块是有原因的,至少在某些情况下,如果没有其他原因,调用函数更容易。然而,如果你发现自己编写的函数有大约四个或更多参数,你'