Как правильно кодировать конструктор в VBA? - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь реализовать пользовательский интерфейс Model-View-Presenter в VBA excel.Для этого я писал различные классы моделей.Вот пример:

Option Explicit

Private Type TModel
    FilterCol As Collection
    N As Integer
End Type

Private this As TModel

Public Property Get FilterCol() As Collection
    Set FilterCol = this.FilterCol
End Property
Public Property Let FilterCol(ByVal value As Collection)
    Set this.FilterCol = value
End Property

Public Property Get N() As Integer
    Set N = this.N
End Property
Public Property Let N(ByVal value As Integer)
    Set this.N = value
End Property

Этот класс с именем "FilterModel" является коллекцией объектов MSFormObject.Чтобы правильно использовать коллекцию, мне нужно новый .Поэтому код, в котором я его использую, будет выглядеть примерно так:

Sub testFilter()
Dim Filterm As FilterModel
Dim DefaultFilterLine As New FilterLine

Set Filterm = New FilterModel
Filterm.FilterCol = New Collection

'Set DefaultFilter
Filterm.FilterCol.Add DefaultFilterLine

'DoStuff
With New frmFilter
    Set .Model = Filterm
    .Show
End With
End Sub

Если я не new Property FilterCol, прежде чем что-то добавить, в данном случае defaultfilter, этоне работаетИтак, вот мой вопрос:

Есть ли способ перезаписать новый оператор для моего нового класса, чтобы он также был новым в коллекции FilterCol.Мое исследование дало мне понять, насколько я знаю, что это будет называться конструктором.

Но как правильно реализовать конструктор для класса VBA?

Что-то вроде:

Private Sub Class_Initialize()
Set this.FilterCol = New Collection
N = 0
End Sub

Если я сделаю это, то получуошибка в строке «Свойство Let N (Byval Value as integer)».Сообщение об ошибке гласит «требуется объект».

1 Ответ

0 голосов
/ 08 марта 2019

Вот рабочее решение.Я предлагаю пройтись по коду, используя F8, чтобы понять, что там происходит.Debug.print выводит значения в окно Immediate.

Вот класс FilterModel:

'''   FilterModel class
Option Explicit

Private pFilterCol As Collection
Private pN As Integer

Public Property Get FilterCol() As Collection
    Set FilterCol = pFilterCol
End Property

Public Property Let FilterCol(ByVal value As Collection)
    Set pFilterCol = value
End Property

Public Property Get N() As Integer
    N = pN
End Property

Public Property Let N(ByVal value As Integer)
    pN = value
End Property

Private Sub Class_Initialize()
    Set pFilterCol = New Collection
    pN = 0
End Sub

, а вот код модуля для его проверки:

'''   random module
Option Explicit

Sub testFilter()

    Dim Filterm As FilterModel

    Set Filterm = New FilterModel
    Filterm.FilterCol = New Collection

    '''   default values (specified in Class_Initialize())
    Debug.Print Filterm.N
    Debug.Print Filterm.FilterCol.Count

    '''   set the values through Property Let
    Filterm.FilterCol.Add "whatever"
    Filterm.FilterCol.Add "whenever"
    Filterm.N = 6

    '''   print the new values (through Property Get)
    Debug.Print Filterm.N
    Debug.Print Filterm.FilterCol.Count
    Debug.Print Filterm.FilterCol(1)
    Debug.Print Filterm.FilterCol(2)

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