2009-05-12 18 views
9

Aşağıdaki kod VB6'yı (sp6) VB.exe'de 'işlenmeyen bir özel durum hatasıyla' işaretli hatta ofiste bulunan iki makinede öldürür.Dizilerin VB6 olarak parametre olarak geçirilmesi

''# 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 
Ben doğru bir dizi geçirerek ama aslında doğru yapıyorum çeşitli web sitelerinde söyleyebileceğim

ve neden VB6 korkunç derecede ölüme neden oluyor?

+0

Sözdizimi vurgulayıcıya hangi dilde ulaşabileceğine dair bir ipucu var mı? –

+0

Bu kodun doğru olduğundan emin misiniz? Class2.cls içindeki kod, Form1.frm'deki ile aynı gibi görünüyor. Bu doğru mu? –

+0

Bu kod anlam ifade etmiyor. ArrayHolder.Add nerede? Neden Class2.cls'deki kod, Form1.frm'deki ile aynı? – GSerg

cevap

8

Cevabım yok ve kesinlikle meraklı bir soru, ama neden sadece bir yöntem eklemiyor ve devam etmiyoruz?

'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

Merakla işe yarıyor. İyi bir koleksiyon yapmak için çalışıyordum, ancak kullanılan tüm yerleri güncellemek bir acı olduğunu kanıtlıyordu. –

+3

Sanırım VB çalışma zamanında bir hata keşfettiniz. Fakat pragmatizm için asla SP7 :) –

+0

+ 1 göremeyiz! Ve belki de, ne yazık ki, SP7 hakkında doğru olduğu için. Çalışma zamanı için genişletilmiş destek hizmet paketlerini içermiyor (hatırlamıyorum) – MarkJ

1

ben bunun neden böyle hiçbir fikrim yok, ama yine de bir dizinin bir kopyasını istiyorsanız, Ders2 bir değişken kullanın:

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 

Düzeltmeler bunu, ama yine de, ben merak ediyorum sebep.

+0

Ben bir varyant denedim, hala çöktü. Belki yanlış bir şey mi yaptım? –

+0

Belki de söylediğim şeyi yaptım ve Class2'nin içeriğini bu kodla değiştirdiniz. :) Tabii ki, Class1 demek istedim. Benim için iyi çalışıyor. – GSerg

+0

Hala makinemde kilitleniyor –

8

Bu, MS'in hiçbir zaman düzeltilmediği IDE'deki (derlenmiş) bir hatadır. Böyle bir geçici dizisi ile bir çözüm kullanıyorum:

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 

Bilginize, bu Bayt dizilerle kötüleşir (Uzun diziler güvenlidir) yanlışlıkla param veya dizi özellik üzerine fare ile geldiğinde görünür. Farenizi koddan uzak tutunuz :-))

İlgili konular