哪些对象可以制作全局,哪些可以制作本地?

时间:2013-11-16 20:47:52

标签: vba access-vba scope visio

为了避免不喜欢一般问题的主持人,这是一个Visio VBA,但我不想在标题中包含它,因为它有点利基,我想答案可能是通用的:-)

我的代码有以下变量:

Public gappVisio As Visio.Application
Public gdocFile As Visio.Document
Public gpagDiagram As Visio.Page

对于那些不熟悉Visio的人,您可以创建一个应用程序对象,打开文档,然后在文档中设置对页面的引用,您可以在其中实际进行绘图。

所有vars都是全局的,但实际上gdocFile仅用于我的初始化例程。 所以我的问题是,我是否需要gdocFile作为全局,或者我可以将其设置为本地? 我想我担心如果它超出范围它是本地的,它可能会整理Document对象,但我仍然需要文档的页面?

这有意义吗?

2 个答案:

答案 0 :(得分:2)

除非绝对必须,否则不要将变量或对象设为全局变量,这几乎从不。将对象引用作为参数传递给那些需要它们的过程 - 并且只传递给那些。正如你所说,在“超出范围”之前你需要的任何东西应该作为函数返回值传递给调用过程(或者,更不明显地因此不太优选地,Sub ByRef参数值)。

当您说对象超出范围时,实际上该对象的引用超出了范围。对象仍然在内存中保持不变。

通常,全局性很差并导致难以维护的代码,但例外情况可能是通用常量,例如:

Public Const PI As Double = 3.14159265358979

把它作为全球性的很好。

答案 1 :(得分:1)

在您的情况下,文档生命周期由Visio应用程序控制,无论您创建多少个引用它的变量,或者它们在哪个范围(全局或本地),都不会清理文档。实际上,Visio对文档忽略了所有引用计数(范围)规则,即使文档中没有更多对它的引用,也不会销毁文档。

您可以使用document.close告诉Visio关闭文档。在该调用之后,任何尝试使用本文档中引用此文档/页面的任何doc / page变量来使用文档(或页面)方法或属性都将导致异常。

用户可能会关闭文档。在这种情况下,引用它的所有变量(或其中的对象,如页面或形状)都将变为无效。