2009-05-12 27 views
9

Il seguente codice uccide VB6 (sp6) con un 'errore di eccezione non gestita in VB.exe' su due macchine nell'ufficio sulla riga contrassegnata.Passare gli array come parametri in 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 

Da quello che posso dire su vari siti web sto passando un allineamento correttamente, ma in realtà sto facendo in modo corretto, e perché è causando VB6 a morire in modo orribile?

+0

C'è un modo per suggerire all'evidenziatore della sintassi che lingua sta ottenendo? –

+0

Sei sicuro che questo codice sia corretto? Il codice all'interno di Class2.cls sembra essere lo stesso di Form1.frm. È corretto? –

+0

Questo codice non ha senso. Dov'è ArrayHolder.Add? Perché il codice in Class2.cls è uguale a quello in Form1.frm? – GSerg

risposta

8

Non ho una risposta, e certamente è una domanda curiosa, ma perché non basta aggiungere un metodo e andare avanti?

'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

Curiosamente funziona. Beh, stavo lavorando per renderlo una raccolta, ma l'aggiornamento di tutti i posti in cui è stato utilizzato è stato un dolore. –

+3

Penso che tu abbia appena scoperto un bug nel runtime VB. Ma non vedremo mai SP7 :) –

+0

+1 per il pragmatismo! E, forse purtroppo, per essere corretto su SP7. Il supporto esteso per il runtime non include i service pack (mi sembra di ricordare) – MarkJ

1

io ho idea del perché questo accade, ma se si vuole comunque una copia di un array, utilizzare una variante in 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 

la fissa, ma ancora, io sono curioso di sapere la ragione.

+0

Quando ho provato una variante, si è comunque bloccata. Forse ho fatto qualcosa di sbagliato ?! –

+0

Forse hai appena fatto quello che ho detto e sostituito il contenuto di Class2 con questo codice. :) Certo, intendevo dire Class1. Funziona bene per me. – GSerg

+0

Ancora si blocca nella mia macchina –

8

Questo è un bug nell'IDE (compilato è ok) che MS non ha mai risolto. Sto utilizzando una soluzione con una gamma di temperatura come questo:

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, c'è di peggio di array di byte (array lunghi sono sicuro) quando si passa accidentalmente con il mouse sopra il parametro o la proprietà di matrice. Meglio tenere il mouse lontano dal codice :-))

Problemi correlati