2016-09-13 2 views
0

Я попытался реализовать это несколько разных способов и, очевидно, что-то не хватает.Как реализовать массив, заполненный объектами внутри класса в VBA

Класс Куните, который включает в себя массив объектов Cpanel -

Private pPanel() As CPanel 

Public Property Get Panel(Optional RIndex As Integer) As CPanel 
    If RIndex = 0 Then 
     Panel = pPanel 
    Else 
     Panel = pPanel(RIndex) 
    End If 
End Property 

Public Property Let Panel(Optional RIndex As Integer, Value As Variant) 
    If RIndex = 0 Then 
     pPanel = Value 
    Else 
     pPanel(RIndex) = Value 
    End If 
End Property 

Тело модуля:

Function UnitBom(Unit As CUnit) As CUnit 

Set UnitBom = Unit 

Dim Panels() As CPanel 
ReDim Panels(1 To UnitBom.NumPanels) 
Dim PanelTemp As CPanel 
Set PanelTemp = New CPanel 
Dim i As Variant 

For i = 1 To UnitBom.NumPanels 
    Set Panels(i) = PanelTemp 
Next i 

UnitBom.Panel = Panels() 

это работает

Panels(1).Width = 1 

Когда я запускаю это я получаю «переменную Object или с переменной блока не установлена. "

UnitBom.Panel(1).Width = 2 

Вы, ребята, должны будете простить меня, потому что я, очевидно, не очень хорошо объяснил. Мне нужен массив объектов CPanel внутри объекта CUnit. Проблема в том, что когда я создаю объект CUnit, я не знаю, как большой размер массива CPanel. Я пытался создать временный массив, который является надлежащим размером, как только я узнаю, каким должен быть этот размер, и затем установите массив CUnit равным временному массиву, чтобы «размер» его. Вероятно, есть намного лучший способ выполнить одно и то же.

ответ

1

от того, что я могу догадаться из тех (немногих) частей коды ваших, есть некоторые ошибки кодирования, которые я думаю, вывести из код логика должна быть рассмотрено:


Получить свойство

код:

Public Property Get Panel(Optional RIndex As Integer) As CPanel 
    If RIndex = 0 Then 
     Panel = pPanel 
    Else 
     Panel = pPanel(RIndex) 
    End If 
End Property 

следует переписать, потому что, так как вы возвращаете Panel тип объекта (...As CPanel) следует добавить Set ключевое слово перед каждым Panel появления в левой части операторов присваивания:

Public Property Get Panel(Optional RIndex As Integer) As CPanel 
    If RIndex = 0 Then 
     Set Panel = pPanel 
    Else 
     Set Panel = pPanel(RIndex) 
    End If 
End Property 

но то в случае RIndex = 0 вы получите ошибку, так как попытаетесь установить объект типа Panel на массив объектов Panel, что совсем не то же самое!

, чтобы вы могли принять Variant подход:

Public Property Get Panel(Optional RIndex As Integer) As Variant 
    If RIndex = 0 Then 
     Panel = pPanel 
    Else 
     Set Panel = pPanel(RIndex) 
    End If 
End Property 

которая до сих пор (успешно) разрешить такое заявление, как:

UnitBom.Panel(1).Width = 2 

, но и будет (неудачно) позволяют такое высказывание, как:

UnitBom.Panel().Width = 2 

, который вы, скорее всего, (и, надеюсь, тоже) d on't нужно, но тем не менее, ваш класс будет на самом деле позволяют это ...

поэтому, возможно, вы бы рассмотреть функциональность вашего CUnit класса и, например, принять по умолчанию Rindex:

Public Property Get Panel(Optional RIndex As Integer) As CPanel 
    If RIndex = 0 Then RIndex = 1 
    Set Panel = pPanel(RIndex) 
End Property 

Пусть свойство

это будет использоваться для такого заявления, как:

UnitBom.Panel(1) = UnitBom.Panel(2) 

иметь оба Panel(1) и Panel(2) относятся к одному Panel объекта

, но тогда вы должны использовать Set ключевое слово еще раз

Public Property Let Panel(Optional RIndex As Integer, Value As Variant) 
    If RIndex = 0 Then 
     pPanel = Value 
    Else 
     Set pPanel(RIndex) = Value 
    End If 
End Property 
+0

@ bluebass44, вы прошли через это? – user3598756

+0

@ bluebass44, было бы неплохо, если бы вы дали правильную обратную связь людям, пытающимся помочь вам – user3598756

0

Здесь нет необходимости в линии. Я предполагаю, что Unit не был установлен, и это вызывает проблемы в дальнейшем.

'Set UnitBom = Новый Куните' 'Set UnitBom = Unit'

Здесь каждая ссылка в Panels() создается в одном экземпляре PanelTemp.

For i = 1 To UnitBom.NumPanels 
    Set Panels(i) = PanelTemp 
Next i 

Это то, что вы на самом деле хотите сделать:

For i = 1 To UnitBom.NumPanels 
    Set Panels(i) = New CPanel 
Next i 
+0

Когда я делаю это набор панелей (я) = CPanel, я получаю ошибка времени выполнения 424 - требуемый объект – bluebass44

+0

Извините. Я оставил ключевое слово 'New':' Set Panels (i) = New CPanel'. –

Смежные вопросы