5

我有很多例子,我从一个基本的子表单开始,然后我有 3 个其他子表单建立在它之上,每个子表单都在基本子表单上添加了一些不同的元素。这意味着我对每个子表单都有一个代码页,其中有很多重复。是否可以将公共元素放入单独的模块中,并在其代码页上仅保留与每个子表单相关的附加代码?这有任何性能问题吗?

4

3 回答 3

1

关于你问题的最后一部分,“这有什么性能问题吗?

我知道有两个后果:

  1. 表单加载时间
  2. 内存使用

作为一个假设示例,假设您有一个带有选项卡控件的表单。该选项卡控件包含 10 个页面,每个页面包含一个子表单。如果这些子表单包含相同 VBA 代码的副本,则必须为每个子表单再次加载该公共代码。这需要时间并增加内存使用。

如果您将公共代码移动到标准模块并从子表单中引用它,则只需加载一次...减少表单加载时间和内存消耗。

所以最终结果是您正在考虑的方法可以使您的应用程序更具响应性......这可能会导致更快乐的用户。

但是,即使这种方法没有产生明显的性能改进,我仍然会这样做,因为这意味着您只需要维护一份通用代码的副本。

于 2012-05-02T14:25:37.733 回答
1

简短的回答,是的,这样做,拆分每个表单之间重复的代码。

更长的答案,但在我看来,将重复的代码提取到单独的模块或类中是更好的方法。

类使您的代码更易于管理和维护。如果您在多个地方都有相似的代码,那么维护会更加困难,因为您必须在每个位置进行更改。将它放在一个地方可以更容易地管理和维护。

优点列表来自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
于 2012-04-26T11:34:01.590 回答
1

如果我理解这个问题,是的,您可以通过将一定数量的代码移动到标准代码模块中来集中它。可能有很多方法可以做到这一点,但更好的方法之一是将表单对象传递给您的函数。这是一个例子:

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 中使用类对象的好处,所以我不会解释更多关于这一点。事实上,标准代码模块基本上是一个单例类,不需要像类对象那样实例化。首选单例/标准代码模块是有原因的,至少在某些情况下,如果没有其他原因,调用函数更容易。然而,如果你发现自己编写的函数有大约四个或更多参数,你'

于 2012-04-27T13:14:31.990 回答