2009-05-12 8 views
9

El siguiente código elimina VB6 (sp6) con un 'error de excepción no controlada en VB.exe' en dos máquinas de la oficina en la línea marcada.Pasar matrices como parámetros en 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 

De lo que puedo decir en varios sitios web estoy pasando una matriz correctamente, pero estoy realmente hacerlo correctamente y por qué lo está causando VB6 a morir tan terriblemente?

+0

¿Hay alguna forma de insinuar al marcador de sintaxis qué idioma está recibiendo? –

+0

¿Estás seguro de que este código es correcto? El código dentro de Class2.cls parece ser el mismo que en Form1.frm. ¿Es esto correcto? –

+0

Este código no tiene sentido. ¿Dónde está ArrayHolder.Add? ¿Por qué el código en Class2.cls es el mismo que en Form1.frm? – GSerg

Respuesta

8

No tengo una respuesta, y ciertamente es una pregunta curiosa, pero ¿por qué no solo agregas un método y sigues adelante?

'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 funciona. Bueno, estaba trabajando en convertirlo en una colección, pero la actualización de todos los lugares en los que se usa demostraba ser un problema. –

+3

Creo que acaba de descubrir un error en el tiempo de ejecución de VB. Pero nunca veremos SP7 :) –

+0

+1 por pragmatismo! Y, quizás tristemente, por ser correcto acerca de SP7. El soporte extendido para el tiempo de ejecución no incluye service packs (me parece recordar) – MarkJ

1

que no tienen idea de por qué sucede esto, pero si usted quiere de todos modos una copia de una matriz, utilizar una variante en la clase 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 

lo fija, pero aún así, siento curiosidad por la razón.

+0

Cuando probé una variante, aún se colgó. Tal vez hice algo mal? –

+0

Quizás acaba de hacer lo que dije y reemplazó el contenido de Class2 con este código. :) Por supuesto, quise decir Class1. Funciona bien para mí – GSerg

+0

Todavía se cuelga en mi máquina –

8

Este es un error en el IDE (compilado está bien) que MS nunca ha corregido. Estoy usando una solución con una gama de temperatura de esta manera:

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, se pone peor con matrices de bytes (matrices largas son seguros) cuando se pasa accidentalmente con el ratón sobre el parámetro o la propiedad de matriz. Mejor mantener el mouse alejado del código :-))

Cuestiones relacionadas