【问题标题】:Is SetFocus a Function?SetFocus 是一个函数吗?
【发布时间】:2019-12-31 00:35:02
【问题描述】:

我看到txtNewCaption.SetFocus这行代码,被告知SetFocus被用作子 在这里,但它也是一个函数。我还在网上读到,子和函数之间的区别在于子不返回任何值,但函数返回值。我无法想象SetFoucs 可以返回什么样的值,所以我在网上搜索了很多关于SetFocus 的文章,但没有一篇给我一个SetFocus 用作返回值的函数的示例。我假设我的理解或我被告知的内容不准确或有问题。

你能帮我澄清一下吗?

谢谢!

【问题讨论】:

标签: vba ms-access setfocus


【解决方案1】:

好吧,在这个例子和例子中,.setFocus 不是一个 sub,也不是一个函数。

sub 是一段单独的代码,你可以这样称呼它

Call MySub

(或更短的形式会跳过“call”这个词——它是可选的) 例如:

MySub

或者,如果有参数,你可能会去:

Call MySub(InvoiceNumber)

在函数的情况下?这又是一段外部代码。您可以使用返回值的函数并忽略返回值。

所以

MyVar = MyFunction()

和 subs 一样,函数可以接受参数:

MyVar = MyFunction(InvoiceNumber)

正如我所指出的,您可以像这样“忽略”函数的返回值:

MyFuncton  InvoiceNumber

如果您按照上述方式编写,则您正在传递值,但函数的返回值并未“放置”或放入任何内容。所以你可以“使用”一个返回值的函数。您还可以跳过在传递的值周围使用 ()。

但是,在上面的两个示例中,我们讨论的是 VBA 子程序和您编写的函数。

SomeTextBox.SetFocus 不是 sub,也不是函数。

上面叫什么?它被称为对象的方法。

那么,当您使用 Access 对象时,比如记录集、控件等?好吧,“对象”将具有我们所说的属性(通常是您可以设置或从中获取值的东西)。

所以,对于一个文本框,你有:

MyControl.Value = "Hello"

上面会将文本框的值(文本)设置为 Hello。因此“.value”是该文本框的属性。它也恰好是默认属性。所以你可以去:

MyControl = "Hello"

现在,如果你去:

 Msgbox("Value of MyControl = " & MyControl.Value)

因此“事物”(对象)的属性通常可以设置一个值,并且您可以获取(检索)一个值。这称为属性。

然而,这些对象也有所谓的方法。方法是一种“动作”,类似于子/函数(但您没有编写该方法)。

这些方法是作为对象一部分运行的“一些代码”。所以有时对象的属性和对象的方法之间的区别是“灰色的”。一些方法可以接受值和返回值,但两者(方法和属性)之间的区别在于 MORE 然后设置值可以与方法一起发生。 (因此它不仅限于获取和设置)。

一个“方法”可以被认为是一些“动作”和代码。该方法的使用倾向于假定某些代码将运行。 (在大多数情况下,它不是您的代码 - 它是附加到内置对象的“代码”。

所以

MyTextBox.SetFocus

它是文本框控件的方法,或有问题的给定控件。并非所有必要的控件都可能具有这种“方法”。

所以 .SetFocus 不是 sub,不是函数,而实际上是相关控件的方法。

【讨论】:

  • 非常全面的解释,很好区分。由于它变得很长,一些标题会给出结构。甚至TL;DR 也会总结在上面:-)
  • 不都是(方法,类型是子)吗?例如。 Application.BuildCriteria 也是一个方法,但是类型是函数。
  • 正如我所说,它可能会有点“灰色”。方法和属性之间的主要区别归结为设置(或获取)值是否也会导致某种 OTHER 动作。因此,您可以设置记录指针,这不仅允许您获取(或设置)记录指针,而且还导致记录集“移动”到给定记录。因此,虽然属性和方法“通常”都允许设置和获取值,但区别在于方法还可以做更多的事情,而不仅仅是获取/设置值。通常,方法被标记为属性,反之亦然。但区别在于“动作”。
  • 感谢您的详细解答。很有帮助!
【解决方案2】:

函数不一定要返回值。你可以像调用 subs 一样调用函数。亲自尝试:编写一个函数,在 sub 中逐步执行该函数,然后检查您的本地窗口。

函数具有返回值的额外好处,但不是必须的。

编辑:除了需要返回一个值之外,我确信有理由使用一个而不是另一个,但我通常根据任务的复杂性来确定是使用子还是函数。我使用函数来执行简单的任务,使用 subs 来执行更复杂的任务。

【讨论】:

【解决方案3】:

如果你search the Microsoft Documentation (MSDN) for SetFocus,你会发现它被定义为:

方法在用户界面控件对象上,将焦点移到它... 没有返回值

(以上引文并非字面引用,而是传达意思)

功能?

因此它不是 VBA 语法中的 函数。 另外:函数的返回值在VBA中是可选的。见VBA language reference: Function statement

可选。函数的返回值。

常用方法命名约定

在大多数编程语言中,通用的命名约定(忽略大小写)适用于方法:

  • 使用get(通常不带参数)返回一个值。此类方法称为 getteraccessor
  • 使用set(通常将参数作为要设置的值)设置新状态(或值)。通常没有返回值,因为新值或状态是由传递的参数(它们的参数)预测的。此类方法称为 settermutator
  • 使用ishasexistscontainsstartsends等返回一个布尔值。此类方法用于检查标志(开/关、真/假、是/否)。
  • 使用calculatelocateindexOffindfetchlookupdetermine等(通常带有参数)返回一个基于指定处理的值参数(通过某种逻辑、数学算法或通过数据检索查询)

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多