2009-05-12 20 views
9

Der folgende Code tötet VB6 (SP6) mit einem 'unhandled Ausnahmefehler in VB.exe' auf zwei Computern im Büro auf der markierten Zeile.Übergeben von Arrays als Parameter 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 

Von dem, was ich auf verschiedenen Websites sagen kann ich ein Array richtig bin vorbei, aber ich bin es eigentlich richtig tun, und warum es verursacht VB6 so schrecklich zu sterben?

+0

Gibt es eine Möglichkeit, auf den Syntax-Highlighter hinzuweisen, welche Sprache er bekommt? –

+0

Sind Sie sicher, dass dieser Code korrekt ist? Der Code in Class2.cls scheint derselbe wie in Form1.frm zu sein. Ist das richtig? –

+0

Dieser Code macht keinen Sinn. Wo ist ArrayHolder.Add? Warum Code in Class2.cls ist wie in Form1.frm? – GSerg

Antwort

8

Ich habe keine Antwort, und sicherlich ist eine kuriose Frage, aber warum nicht einfach eine Methode hinzufügen und weitermachen?

'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

Seltsamerweise funktioniert es. Nun, ich arbeitete daran, es zu einer Sammlung zu machen, aber die Aktualisierung all der Orte, an denen es verwendet wird, erwies sich als ein Schmerz. –

+3

Ich glaube, Sie haben gerade einen Fehler in der VB-Laufzeit entdeckt. Aber wir werden nie SP7 sehen :) –

+0

+1 für Pragmatismus! Und, vielleicht traurig, dass Sie über SP7 korrekt sind. Die erweiterte Unterstützung für die Laufzeit enthält keine Service Packs (ich glaube mich daran zu erinnern) – MarkJ

1

Ich habe keine Ahnung, warum dies geschieht, aber wenn man trotzdem eine Kopie eines Arrays wollen, eine Variante in class2 verwenden:

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 

Fixes, aber immer noch, ich bin neugierig der Grund.

+0

Als ich eine Variante ausprobierte, stürzte sie immer noch ab. Vielleicht habe ich etwas falsch gemacht ?! –

+0

Vielleicht hast du einfach das getan, was ich gesagt habe, und Inhalte von Class2 durch diesen Code ersetzt. :) Natürlich wollte ich Class1 sagen. Funktioniert gut für mich. – GSerg

+0

Stürzt immer noch in meinem Rechner ab –

8

Dies ist ein Fehler in der IDE (kompiliert ist ok), die MS nie behoben hat. Ich verwende eine Abhilfe mit einem temporären Array wie folgt:

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, wird es noch schlimmer mit Byte-Arrays (Long-Arrays ist sicher), wenn Sie versehentlich mit der Maus über das param oder die Array-Eigenschaft schweben. Halte deine Maus besser vom Code weg :-))

Verwandte Themen