Как неявно вызвать функцию класса по умолчанию - PullRequest
2 голосов
/ 08 ноября 2019

Импортируйте этот класс:

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "MyMsgBox"
Attribute VB_PredeclaredId = True

Public Function Show(testo As String) as Boolean
Attribute Show.VB_UserMemId = 0
    msgbox testo
    Show = True
End Function

и выполните этот код в модуле:

MyMsgBox.Show "hi"
If MyMsgBox("hi") = True Then msgbox "it works"
MyMsgBox "hi"  ' << I get "Compile error: Invalid use of property"

Почему в последней строке выдается ошибка?
и какая самая короткая альтернативачто работает?

Ответы [ 2 ]

4 голосов
/ 08 ноября 2019

ВЫ НЕ ХОТИТЕ ДЕЛАТЬ ЭТО.

По умолчанию члены являются злым, неявным и запутанным кодом. Rubberduck аннотации наподобие @DefaultMember помогают сделать скрытые атрибуты более заметными, но API все еще является странным, нетрадиционным, неидиоматическим кодом VBA.

Элемент по умолчанию, который принимает один параметрдолжен иметь имя Item, а его параметр - Index инкапсулированной коллекции - сам класс будет неким пользовательским классом коллекции.

Любое другое использование элемента по умолчанию сводится к злоупотреблению.

См. Современные рекомендации VBA: члены по умолчанию для получения дополнительной информации.


Теперь, когда все прояснено ...

Из-за VB_PredeclaredId = True атрибут, самый короткий возможный способ вызвать элемент по умолчанию:

?MyMsgBox("test")

Это потому, что MyMsgBox является одновременно именем класса и именем объекта глобальной области видимостипеременная этого типа класса. Обратите внимание, что если вы не захватываете возвращаемое значение, это «недопустимое использование свойства» .... обратите внимание, что VBA предполагает, что членами по умолчанию являются Property члены.

Вы получаете параметр quick-информация в IDE для члена по умолчанию с MyMsgBox(:

parameter quick-info is displayed when the ( opening parenthesis is typed

Точно почему вызов члена по умолчанию отлично работает на локальном экземпляре (и не по умолчанию) грязно и неясно - вероятно, здесь запутывается VBA, по вполне понятным причинам: это грубое злоупотребление языковыми возможностями.

2 голосов
/ 08 ноября 2019

Работает для меня:

Sub Test()
    Dim x As MyMsgBox
    Set x = New MyMsgBox

    x.Show "Hi"
    If x("Hi") Then MsgBox "It works"
    x "Hi"
End Sub

Чип Пирсон имеет хорошее чтение на членах по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...