2009-05-12 10 views
9

Poniższy kod zabija VB6 (sp6) z "nieobsługiwanym wyjątkiem wyjątku w VB.exe" na dwóch komputerach w biurze na linii oznaczonej.Przekazywanie tablic jako parametrów w VB6

''# 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 

Z tego co mogę powiedzieć na różnych stronach internetowych I 'm przechodzącą tablicę poprawnie, ale ja faktycznie robi to prawidłowo, i dlaczego jest on przyczyną VB6 umrzeć tak strasznie?

+0

Czy istnieje sposób na podpowiedź do markera składni, w jakim języku się znajduje? –

+0

Czy ten kod jest prawidłowy? Kod w Class2.cls wydaje się być taki sam jak w Form1.frm. Czy to jest poprawne? –

+0

Ten kod nie ma sensu. Gdzie jest ArrayHolder.Add? Dlaczego kod w Class2.cls jest taki sam jak w Form1.frm? – GSerg

Odpowiedz

8

Nie mam odpowiedzi, a na pewno jest to ciekawe pytanie, ale dlaczego po prostu nie dodać metody i przejść dalej?

'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 
+0

Co ciekawe, działa. Cóż, pracowałem nad stworzeniem kolekcji, ale aktualizacja wszystkich miejsc, w których była używana, okazała się być bardzo trudna. –

+3

Myślę, że właśnie odkryłeś błąd w środowisku wykonawczym VB. Ale nigdy nie zobaczymy SP7 :) –

+0

+1 dla pragmatyzmu! I, niestety, za poprawność SP7. Rozszerzona obsługa środowiska wykonawczego nie zawiera pakietów serwisowych (wydaje się, że pamiętam). – MarkJ

1

Nie mam pojęcia, dlaczego tak się dzieje, ale jeśli mimo to chcesz kopię tablicy, należy użyć Wariant w Class2:

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 

przytwierdza to, ale nadal jestem ciekaw powód.

+0

Kiedy próbowałem wariantu, nadal się rozbił. Może zrobiłem coś nie tak ?! –

+0

Może właśnie zrobiłeś to, co powiedziałem i zastąpiłem zawartość Class2 tym kodem. :) Oczywiście chciałem powiedzieć Class1. Działa dobrze dla mnie. – GSerg

+0

Nadal powoduje awarie w moim komputerze –

8

To jest błąd w IDE (skompilowany jest w porządku), którego MS nigdy nie naprawiono. Używam obejście z tablicy temp tak:

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 

FYI, jest jeszcze gorzej z tablicami bajtów (długie tablice są bezpieczne), kiedy przypadkowo najechaniu myszką nad param lub mienia tablicy. Lepiej trzymać myszkę z daleka od kodu :-))

Powiązane problemy