Hi
Hallo,
naja Schäm, kann vielleicht wirklich aus Basic Zeiten sein.
Die Frage ist, ob es sich lohnt alles umzustellen???
Je nachdem wie gross das Project ist nicht mehr! Wenn es denn von Nöten ist, ist man meist schneller das Project neu zu entwerfen
Danach geht evtl. weniger also vorher richtig.
Eben, einmal etwas übersehen und schon kann es maechtig vor dem Baum gehen und der Debugger ist ueber viele Tage dein bester Freund
Gibts hier Tools oder geht das mit der Suchfunktion, wenn man
nur innerhalb der aktuellen Prozedur oder Modul sucht.
Das wäre wohl recht schwierig.
Das ByVal und ByRef hab ich auch noch nie gecheckt *lol*
Was macht das denn?
Einmal übergibst du den Wert direkt (ByVal)und einmal als Refernz(ByRef). Was das bedeutet weisst du sicherlich nicht.
Ich habe dazu mal einiges geschrieben. Aber nun gut dann eben noch einmal.
Unter VB gibt es einmal die primitiven Datentypen und dann noch Objecte.
Primitive Datentypen sind zum Bsp. Integer, Byte, Long etc.
Objecte sind zum Bsp. Klassen.
Vom Prinzip her kannst du dir merken. Alles wo du eine direkte Zuweisung machen kannst, sind Primitive Datentypen. Überall wo du Set verwendest oder New sind Object.
Nun stelle dir mal folgendes vor. Dein Speicher ist in 2 Teile unterteilt. Einmal den Stack und einmal den Heap.
Primitive Datentypen werden im Stack abgelegt. Objecte werden im Heap abgelegt. Bei Objecten kommt noch hinzu das im Stack ein Zeiger abgelegt wird. Er zeigt nur auf die Adresse im Heap wo sich das Object befindet.
Wenn du nun einen Wert als Referenz (ByRef)übergibst, so wird der Prozedur oder Function nur ein Zeiger auf den Wert übergeben. Das bedeutet aber das du diesen direkt ändern kannst!
Übergibst du stattdessen den Wert als ByVal, so wird im Stack eine Kopie des Wertes angelegt. In deiner Prozedur oder Function arbeitest du nur mit der Kopie. Beim verlassen der Prozedur oder der Function wird die Kopie gelöscht. Änderst du nun in der Prozedur oder Function den Wert, so ist er ergo nach verlassen der Prozedur oder Function wieder der selbe wie zu prozedure beginn.
Ein kleines Demo wird dies verdeutlichen.
Private Sub Command1\_Click()
Dim x As Integer, y As Integer
x = 10
y = 10
Test x, y
MsgBox "X (Byval):=" & x & vbTab & "Y /ByRef):=" & y
End Sub
Sub Test(ByVal a As Integer, ByRef b As Integer)
a = 20
b = 20
End Sub
Soweit ist das auch alles richtig, solange es um primitive Datentypen handelt. Anders ist das verhalten bei Objecten.
Da spielt ByRef und ByVal keine Rolle mehr. Da ja auf ein Zeiger im Stack zugegriffen wird. Über diesen Zeiger kommt man dann auf dem Heap. Das bedeutet, selbst wenn du den Wert als ByVal übergibst, so wird zwar eine Kopie vom Zeiger im Stack erstellt. Aber zugreifen tust du auf die Orginal Daten im Heap!
Private Sub Command1\_Click()
Dim MyData1 As New Class1, MyData2 As New Class1
MyData1.X = 10
MyData2.X = 10
Test MyData1, MyData2
MsgBox "Mydata (Byval):=" & MyData1.X & vbTab & "MyData /ByRef):=" & MyData2.X
End Sub
Sub Test(ByVal a As Class1, ByRef b As Class1)
a.X = 20
b.X = 20
End Sub
Die entsprechende Klasse würde dazu so ausschauen
Private MyData As Integer
Public Static Property Get X() As Integer
X = MyData
End Property
Public Static Property Let X(ByVal vNewValue As Integer)
MyData = vNewValue
End Property
Ein Besipiel wäre immer ganz hilfreich dazu.
Siehe oben
Mfg Werner
MfG Alex