在VB6 / VBA项目引用中,Array(),LBound()和UBound()来自......?

时间:2017-01-12 20:28:01

标签: vba vb6

在VB6 / VBA项目引用中的位置是Array(),LBound()和UBound()来自..?当我输入代码时,它们不会出现在自动完成列表(ctrl + space)中,它们不会自动完成,并且必须在文本编辑器识别它们之前完全输入它们。只有在键入左括号时,ToolTipText才会弹出命令语法。此外,它们不会出现在对象资源管理器中的任何位置。

这里可能存在一个基本概念,我不知道。它让我想知道,其他命令/声明/关键字以同样的方式被隐藏了吗?某个地方有名单吗?我用谷歌搜索信息,但没有找到任何东西,可能是因为我不知道我在寻找什么,并使用错误的搜索条件。

我问这些问题是因为我习惯为许多VB6内置函数加上前缀:VBA.Left(),VBA.Len,VBA.Instr()等等。但我无法弄清楚与Array(),LBound()和UBound()一起使用的参考前缀,或者它们对VB6来说是如此基本,以至于它们没有。

我做这个前缀是因为多年前我正在开发一个大型项目,并且我尝试在不同的参考库中使用相同名称的函数。我是一个新手,我花了一段时间才弄明白,它造成了巨大的问题,因为这些功能并没有像我认为的那样工作。就在那之后我发现了这个前缀习惯。这种方式更简单,并始终确保使用预期的功能。

3 个答案:

答案 0 :(得分:6)

它们不作为IntelliSense选项出现的原因(以及它们没有出现在对象浏览器中的原因)是因为某种原因它们不在我之外的VBE7.dll类型库中声明它们。 Array函数在.dll中实现为rtcArray。知道它的实用性是可疑的,因为它的唯一参数是ParamArray,这意味着如果你直接从VBE7.dll调用它,你需要创建一个数组,让它为你提供相同的数组。 ..这部分解释了为什么它不在类型库上 - 一个COM调用需要做同样的事情,并且编组基本上会做与你期望函数返回相同的事情。

LBoundUBound甚至不会在导出表中显示为函数,因此我的猜测是它们在内部处理的类似于“关键字”而不是第一类函数。这使一些有意义,因为如果你有一个指向自动化结构的指针(你只需要索引到rgsabound数组,那么检查SAFEARRAY的边界是相当简单的。它的结尾并从中读取cElementslLbound。再次猜测,但我认为这样可以灵活地让LBoundUBound与固定长度和可变长度数组。在固定的情况下,数组基本上被管理为带有索引器的内存块(更像是VT_CARRAY而不是VT_SAFEARRAY)。我想象处理这在内部比提供一流的功能更容易或更方便。

答案 1 :(得分:2)

Debug在对象浏览器中找到了Assert,也找不到方法PrintOpen

您无法找到像CloseGetPutLoad这样的方法使用的语句,其中这就是为什么当你使用这些语句时你没有得到任何智能感知,并且必须记住语法。

UnloadVBA.Global作为Objects的成员找到,但不清楚他们属于什么,以及他们的论点是后期Load。 VBA文档指出Unloadthis.scoring.[if this.playersTurn % 2 = 0 then this.playerOneScore else this.playerTwoScore] 语句,即使对象浏览器将其显示为方法

答案 2 :(得分:-1)

请记住,您可以移动引用的顺序,它会有所作为。尝试将VBA移动到引用列表的顶部或顶部。我相信,如果其他东西也定义了一个BASIC关键字,从某种意义上说它会窃取它。我曾经让Right消失,因为我不知道引用的顺序,不得不改变对VBA.Right的所有引用。它与ubound,lbound或array可能相同。