Dynami c коллекция классов - PullRequest
       0

Dynami c коллекция классов

0 голосов
/ 14 февраля 2020

Это работает, но я не знаю как: я хочу создать динамическое c количество классов, поэтому я использую словарь для этого. Но я не могу добавить ключ к каждому классу словаря. Это работает, когда я добавляю каждую запись 1-го словаря во второй словарь как элемент / ключ пары.

sub test()
Dim dict As New Dictionary
Dim dict2 As New Dictionary

For i = 1 To 2
    Set dict(i) = New Cfgadress
    dict(i).Col1 = i
    dict2.Add "d" & i, dict(i)
Next i

Debug.Print dict2("d1").Col1
Debug.Print dict2("d2").Col1
End Sub

Это было предположение, и я не уверен, что понимаю, как это работает: это запись первого словаря является объектом класса, тогда как запись второго словаря является объектом словаря (пара элемент / ключ)?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Нет необходимости во втором словаре. Какую ошибку вы получаете, используя только одну?

Вот мой рабочий код:

Добавить модуль: Module1

Sub test()

    Dim col1 As Dictionary

    Dim classInstance As Class1

    Dim counter As Long

    ' Init the collection
    Set col1 = New Dictionary

    For counter = 1 To 2

        ' Set new instance of class
        Set classInstance = New Class1

        ' Set properties in new class instance
        classInstance.testfield = "Test value" & counter

        ' Add it to the collection
        col1.Add "test" & counter, classInstance

    Next counter


    Debug.Print col1.Item("test1").testfield
    Debug.Print col1.Item("test2").testfield

End Sub

Класс: Class1

Public testfield As String
0 голосов
/ 14 февраля 2020

Я думаю, что понял, поправьте меня, если я ошибаюсь.

Когда я создаю словарную запись с

Set dict(i) = New Cfgadress

Создается новая словарная запись: пустой объект класса Cfgadress, связанный с ключом i

Dict (i) относится к элементу, содержащемуся в записи i словаря dict, т.е. к объекту класса, содержащемуся.

Чтобы изменить ключ, мне нужно назначить новый элемент / ключ пары, но элемент существует только как запись i словаря. Поэтому мне нужно:

  • , чтобы использовать запись словаря как элемент, связанный с ключом в новом словаре / коллекции / массиве (что я сделал в своем коде)
  • или чтобы назначить dict (i) для объекта, добавьте его к правильному ключу и удалите прежний.
Set object as New class
Set object=dict(i)
dict.Add "key", object
dict.remove "1"

Я получил его?

Ваше решение Это гораздо проще, и это то, что я попробовал в первую очередь, но я пошел в словарь Dynami c, потому что на каждой итерации, обновление экземпляра класса также обновляло предыдущие записи коллекции

Set Wb = ThisWorkbook           '==================
Set WsCfg = Wb.Sheets("Cfg")    '==================


Dim dict_cfg As New Dictionary
Dim coll As New Collection
Set tcfg_adress = New Cfgadress

For i = 3 To 4 '22

    If WsCfg.Cells(i, 10) = 1 And WsCfg.Cells(i, 11) = 1 Then   
        tcfg_adress.Row1 = WsCfg.Cells(i, 4).Value
        tcfg_adress.Col1 = WsCfg.Cells(i, 5).Value
        tcfg_adress.Lrow = WsCfg.Cells(i, 6).Value
        tcfg_adress.Lcol = WsCfg.Cells(i, 7).Value
        tcfg_adress.Nbrow = WsCfg.Cells(i, 8).Value
        tcfg_adress.Nbcol = WsCfg.Cells(i, 9).Value
        coll.Add tcfg_adress, WsCfg.Cells(i, 1)

     End If
Next i

Оказывается, этот параметр новый экземпляр класса в каждом l oop, как я видел в вашем коде, решил мою проблему. Я думал, что было нечего делать и расследовал в обход. Большое спасибо!

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