VB 2010 - Objektvariable "Weiterleitung" auf andere Variable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    VB 2010 - Objektvariable "Weiterleitung" auf andere Variable

    Hallo,
    dies ist mein erster Beitrag, darum bitte ich euch, seid nicht so streng zu mit.
    Mein Problem in VB 2010:
    Ich will sowas wie eine Objektvariable haben, die auf eine anderer Variable verweist.
    Wenn ich bei dieser Objektvariable aber etwas ändere soll sich die andere Variable damit auch ändern.
    Meine Idee (+ bisschen von meinem Programm dabei):
    Ausschnitt aus Form2:

    Visual Basic-Quellcode

    1. ​If RadioButton1.Checked = True Then
    2. button1a = Form1.a1
    3. button1b = Form1.b1
    4. Nr1 = "1"
    5. ElseIf RadioButton2.Checked = True Then
    6. button1a = Form1.a2
    7. button1b = Form1.b2
    8. Nr1 = "2"
    9. ElseIf RadioButton3.Checked = True Then
    10. button1a = Form1.a3
    11. button1b = Form1.b3
    12. Nr1 = "3"
    13. ElseIf RadioButton4.Checked = True Then
    14. button1a = Form1.a4
    15. button1b = Form1.b4
    16. Nr1 = "4"
    17. ElseIf RadioButton5.Checked = True Then
    18. button1a = Form1.a5
    19. button1b = Form1.b5
    20. Nr1 = "5"
    21. End If
    22. ...
    23. button1a = bla


    Nun sollte aber auch die Variable, für die button1a steht(Form1.a1,Form1.a2,Form1.a3,Form1.a4 oder Form1.a5) den Wert von bla erhalten.
    Das passiert aber nicht.
    button1a hat den Wert von bla zwar erhalten, aber die Variablen von Form1 sind immernoch gleich.

    2. einfacheres Beispiel:

    Visual Basic-Quellcode

    1. Dim abc = "1234567890"
    2. Dim obj as object = abc
    3. 'Jetzt das Objekt ändern
    4. obj = "123"
    5. 'Jetzt sollte abc = "123" sein


    Hoffe ihr versteht was ich meine und könnt mir helfen.
    Danke
    Beat2er
    Sorry. Probiere es nochmal.

    Visual Basic-Quellcode

    1. Dim a1, a2, a3, a4, a5, a6, a7, a8, a9 As String
    2. Dim obj As Object
    3. If TextBox1.Text = "1" Then
    4. obj = a1
    5. ElseIf TextBox1.Text = "2" Then
    6. obj = a2
    7. ElseIf TextBox1.Text = "3" Then
    8. obj = a3
    9. ...
    10. ...
    11. End If
    12. obj = bla
    13. Weiteres mit obj(a1,a2 oder a3 ...)

    Sodass ich einmal obj mit einer Variable deklariere, und dann sozusagen immer wenn ich etwas mit obj mache, es eigentlich mit einem von a1,a2,a3... passiert.
    Sozusagen ist obj nur eine Weiterleitung, die ich aber während der Laufzeit ändern kann
    @Beat2er Willkommen im Forum. :thumbup:
    1. Warum Object, wenn Du Strings zuweist?
    2. Wenn im der Textbox Zahlen drin stehen, warum String und nicht Integer?
      mach das mit Select Case.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Beat2er schrieb:

    Wenn ich bei dieser Objektvariable aber etwas ändere soll sich die andere Variable damit auch ändern.


    Aber diese Änderung findet doch auch statt! Allerdings ist b1 selber nicht änderbar durch obj. Nur das Object, auf das die beiden Variablen verweisen kann modifiziert werden.

    VB.NET-Quellcode

    1. Dim b1 As New Button
    2. Dim obj As Button = b1
    3. ' obj und b1 zeigen auf das selbe Object im Speicher
    4. ' Wenn ich obj ändere sehe ich die Änderung auch in b1
    5. obj.Text = "bla"
    6. Debug.WriteLine(obj.Text)
    7. Debug.WriteLine(b1.Text)
    8. ' Das Object auf das b1 verweist hat sich geändert!
    9. ' ich kann allerdings nicht den Zeiger von b1 auf ein anderes Object im Speicher umbiegen indem ich obj ändere
    10. obj = New Button
    11. obj.Text = "neu"
    12. ' b1 ist unverändert
    13. Debug.WriteLine(obj.Text)
    14. Debug.WriteLine(b1.Text)


    Die Verzeigerung nach der 2.Zeile ist:
    b1 -> [New Button im Speicher]
    obj -> [New Button im Speicher]

    und nicht
    obj -> b1 -> [New Button im Speicher]

    Pointer auf Pointer gibts so nicht in VB.Net - ich bin mir aber nicht sicher, ob du das auch wirklich benötigst.
    Also damit das hier was du oben gepostet hast:

    VB.NET-Quellcode

    1. Dim abc = "1234567890"
    2. Dim obj as object = abc
    3. 'Jetzt das Objekt ändern
    4. obj = "123"
    5. 'Jetzt sollte abc = "123" sein


    funktioniert gibts zwei Möglichkeiten:

    Einmal über ByRef:

    VB.NET-Quellcode

    1. Private Sub Test(ByRef pVariable As String)
    2. pVariable = "123"
    3. End Sub
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim abc = "1234567890"
    6. Test(abc)
    7. MessageBox.Show(abc)
    8. End Sub


    oder so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim abc As New BlaBla With {.Input = "1234567890"}
    3. Dim def = abc
    4. def.Input = "123"
    5. MessageBox.Show(abc.Input)
    6. End Sub
    7. End Class
    8. Public Class BlaBla
    9. Public Property Input As String
    10. End Class