[VB6] Kein Unterschied bei Parameteraufruf mittels ByRef und ByVal?

02/09/2010 - 11:03 von Susann Markward | Report spam
xPost -> microsoft.public.de.vb.datenbank; de.comp.lang.misc
fUp2 -> de.comp.lang.misc

Hallo,

ich musste im Rahmen einer Anpassung meiner Software einige Arrays von
statisch auf dynamisch umstellen. Leider verhàlt sich jedoch der
Erase-Befehl von VB6 unterschiedlich bzgl. dieser Problematik. Wàhrend
ein Erase MyArray() bei einem statischen Array wirklich nur die Inhalte
des Arrays löscht (Neuinitialisierung der Elemente des Datenfelds),
zerstört quasi (Freigabe des Speicherbereichs) der Befehl das komplette
Array bei dynamischen Arrays.

Deshalb musste ich das Löschen der Arrays nun irgendwie neu
implementieren. Leider kann man in VB6 VB6-Befehle ja nicht überladen.
Also dachte ich mir, ich schreibe einfach einen neue Prozedur (MyErase),
die das Löschen des Arrays übernimmt. Wobei ich das zu löschende Array
dieser Prozedur mit ByRef übergebe.

Also:

-
Public Sub MyErase(ByRef MyArray As Variant)

Dim i As Integer

' Datentyp des übergebenen Arrays ermitteln
Dim at As Integer: at = VarType(MyArray)
at = at - 8192 '8192 ist der Offset für vbArray
'(siehe F1-Hilfe für VarType)

For i = LBound(MyArray) To UBound(MyArray)
Select Case at
Case 2 To 5 ' 2=Integer / 3=Long / 4=Single / 5=Double
MyArray(i) = 0
Case 8 ' String
MyArray(i) = ""
Case Else
MsgBox "The given datatype is unknown!", _
vbOKOnly + vbInformation
End Select
Next i

End Function
-

Rufe ich jetzt also MyErase mit

MyErase (a)

einem gefüllten Array auf, löscht diese Prozedur zwar brav alle Inhalte
von MyArray, aber nicht die Inhalte des übergebenen Arrays a. Ganz so,
als hàtte ich im Prozedurkopf von MyErase nicht ByRef, sondern ByVal
geschrieben.

Was geht da schief, was habe ich falsch verstanden?

Mit freundlichen Grüßen
Susann
 

Lesen sie die antworten

#1 Helmut Meukel
02/09/2010 - 11:19 | Warnen spam
"Susann Markward" schrieb im Newsbeitrag
news:4c7f684f$0$7663$
-
Public Sub MyErase(ByRef MyArray As Variant)

Dim i As Integer

' Datentyp des übergebenen Arrays ermitteln
Dim at As Integer: at = VarType(MyArray)
at = at - 8192 '8192 ist der Offset für vbArray
'(siehe F1-Hilfe für VarType)

For i = LBound(MyArray) To UBound(MyArray)
Select Case at
Case 2 To 5 ' 2=Integer / 3=Long / 4=Single / 5=Double
MyArray(i) = 0
Case 8 ' String
MyArray(i) = ""
Case Else
MsgBox "The given datatype is unknown!", _
vbOKOnly + vbInformation
End Select
Next i

End Function
-

Rufe ich jetzt also MyErase mit

MyErase (a)

einem gefüllten Array auf, löscht diese Prozedur zwar brav alle Inhalte von
MyArray, aber nicht die Inhalte des übergebenen Arrays a. Ganz so, als hàtte
ich im Prozedurkopf von MyErase nicht ByRef, sondern ByVal geschrieben.

Was geht da schief, was habe ich falsch verstanden?





Lass einfach die Klammern weg!

Wenn Du eine Sub aufrufst, hast du zwei Möglichkeiten:
Call MyErase(a)
oder
MyErase a

Was Du mit den Klammern gemacht hast, weist VB an, den Ausdruck
in der Klammer auszuwerten und das _Ergebnis_ an die Prozedur zu
übergeben, de fakto ByVal.
Es entspricht dem
Call MyErase((a))

Helmut.

Ähnliche fragen