Передача массивов в качестве параметров в VB6 - PullRequest
10 голосов
/ 12 мая 2009

Следующий код убивает VB6 (sp6) с помощью «ошибки необработанного исключения в VB.exe» на двух компьютерах в офисе в строке, помеченной.

''# Form1.frm
Option Explicit
Private ArrayHolder As Class2

Private Sub Command1_Click()
    Set ArrayHolder = New Class2

    Dim arr(3) As Long
    arr(0) = 1
    arr(1) = 2
    arr(2) = 3

    ArrayHolder.Add arr

End Sub

''# -----------------------------------------------------------    
''# Class1.cls
Option Explicit

Private m_myArray() As Long

Public Property Get myArray() As Long()
    myArray = m_myArray
End Property

Friend Property Let myArray(ByRef anArray() As Long)
    m_myArray = anArray
End Property

''# -----------------------------------------------------------    
''# Class2.cls
Option Explicit

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Set oClass = New Class1

    oClass.myArray = newArray  <- This kills VB6 dead
    MsgBox "passed"

End Function

Из того, что я могу сказать на разных веб-сайтах, я правильно передаю массив, но действительно ли я делаю это правильно, и почему он так ужасно умирает VB6?

Ответы [ 3 ]

8 голосов
/ 18 мая 2009

Это ошибка в IDE (скомпилированная в порядке), которую MS никогда не исправляла. Я использую обходной путь с временным массивом, как этот:

Friend Function Add(newArray() As Long) As Class1
    Dim oClass As Class1
    Dim tempArray() As Long
    Set oClass = New Class1

    tempArray = newArray
    oClass.myArray = tempArray <- Should work now
    MsgBox "passed"

End Function

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

8 голосов
/ 12 мая 2009

У меня нет ответа и, конечно, это любопытный вопрос, но почему бы просто не добавить метод и двигаться дальше?

'Passed the test
Public Sub LetMyArray(anArray() As Long)
    m_myArray = anArray
End Sub


'oClass.MyArray = newArray ' <- This kills VB6 dead
oClass.LetMyArray newArray  ' <- This works
1 голос
/ 12 мая 2009

Понятия не имею, почему это происходит, но если вам все равно нужна копия массива, используйте вариант в классе 2:

Private m_myArray As Variant

Public Property Get myArray() As Variant
    myArray = m_myArray
End Property

Friend Property Let myArray(anArray As Variant)
    m_myArray = anArray
End Property

Исправляет это, но все же, мне любопытно узнать причину.

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