Globale Var

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von SchokoMilch.

    Hey Com.

    Ich bekomm das mit der globalen var nicht hin.
    So deklariere ich sie in Form4:

    VB.NET-Quellcode

    1. Public Class Form4
    2. Public Server As String
    3. Public Port As String


    Das weise ich Server und Port einen wert zu.

    In Form5 versuche ich sie zu erhalten:

    VB.NET-Quellcode

    1. Dim Server As String = Form4.Server
    2. Dim Port As String = Form4.Port



    Die Variable wird einfach nicht übertragen.
    Was mache ich denn falsch?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SchokoMilch“ ()

    weist du die Variablen in Form5 zu, bevor sie ihren Wert in Form4 bekommen haben? Da du sie direkt bei der Deklaration mit Werten befüllst, muss die Deklaration entsprechend spät sein.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Bist du dir sicher, dass das eine auch nach dem anderen ausgeführt wird? Evtl mal mit Einzelschritten durchgehen. Weil wenn du immer nur Form5.Show() aufrufst, ist es glaube ich so, dass nur beim ersten mal auch wirklich der Konstruktor der Form aufgerufen wird.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Wenn der User Die Settings ändern will, wird Form5 Geschlossen (mit Form5.Close), Form4 Geladen - und anschließend nach dem ändern wieder Form5 aufgerufen.

    Komischer weise:

    Beim ersten aufruf von Form5 werden die variablen nicht übertragen, bei den danach schon.

    vb-checker schrieb:

    Weil wenn du immer nur Form5.Show() aufrufst, ist es glaube ich so, dass nur beim ersten mal auch wirklich der Konstruktor der Form aufgerufen wird.

    Der Konstruktor dürfte schon bei Erstellen des Übergeordneten Objektes aufgerufen werden. Genauer gesagt da, wo das Stichwort New() steht.


    Ansonsten sollte der TE mal ordentlich Debuggen. Zu dem Zeitpunkt, an dem du das erste Mal eine Inhalt in Server/Port erwartest musst du anhalten und die Werte checken. Wenn sie hier nicht stimmen musst du die Ursache finden. Wir können hier allerdings nur noch weiterraten, außer du postest mal ein bisschen mehr code.

    Falls dein Objekt Form5 heißt:
    Es ist höchst unüblich Objektname = Klassenname zu verwenden (es gibt ja auch shared Methoden).
    Ich poste einfach mal den ganzen code.

    Form4:

    VB.NET-Quellcode

    1. Public Class Form4
    2. Public Server As String
    3. Public Port As String
    4. Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. TextBox3.Text = "8000"
    6. End Sub
    7. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    8. Server = TextBox2.Text
    9. Port = TextBox3.Text
    10. Dim Form1 As Form1 = New Form1
    11. Form1.Show()
    12. Me.Hide()
    13. End Sub
    14. End Class


    Form5:

    VB.NET-Quellcode

    1. Imports MySqlLib3
    2. Imports System
    3. Imports System.IO
    4. Imports System.Text
    5. Imports System.Net.Sockets
    6. Public Class Form1
    7. Private stream As NetworkStream
    8. Private streamw As StreamWriter
    9. Private streamr As StreamReader
    10. Private client As New TcpClient
    11. Private t As New Threading.Thread(AddressOf Listen)
    12. Private Delegate Sub DAddItem(ByVal s As String)
    13. Private nick As String
    14. Dim Server As String = Form4.Server
    15. Dim Port As String = Form4.Port
    16. Dim Check As Integer = 0
    17. Private Sub AddItem(ByVal s As String)
    18. ListBox1.Items.Add(s)
    19. End Sub
    20. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    21. MsgBox(Server)
    22. Try
    23. client.Connect(Server, Port)
    24. If client.Connected Then
    25. stream = client.GetStream
    26. streamw = New StreamWriter(stream)
    27. streamr = New StreamReader(stream)
    28. streamw.WriteLine(nick)
    29. streamw.Flush()
    30. t.Start()
    31. Else
    32. MsgBox("Es kann keine Verbindung zum Server " & Server & " hergestellt werden!")
    33. Me.Close()
    34. Form4.Show()
    35. Me.Hide()
    36. End If
    37. Catch ex As Exception
    38. MsgBox("Es kann keine Verbindung zum Server " & Server & " hergestellt werden!")
    39. Me.Close()
    40. Form4.Show()
    41. Me.Hide()
    42. End Try
    43. End Sub
    44. Private Sub Listen()
    45. While client.Connected
    46. Try
    47. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    48. Catch
    49. MsgBox("Es kann keine Verbindung zum Server " & Server & " hergestellt werden!")
    50. Me.Close()
    51. Form4.Show()
    52. Me.Hide()
    53. End Try
    54. End While
    55. End Sub
    56. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    57. streamw.WriteLine(TextBox1.Text)
    58. streamw.Flush()
    59. TextBox1.Clear()
    60. End Sub


    "Form1" ist Form5, habe es gerade geändert.
    Info: Das ist zum teil der TCP Source, der hier mal releast wurde.
    Du hast meinen Post nicht richtig gelesen. Offenbar fehlen dir die Grundlagen von OOP bzw. die Begriffe Klasse/Objekt.

    Du machst 2 Sachen falsch:
    1. Du nennst deine Objekte genauso wie deine Klassen
    2. Du verwendest keine Propertys (z.B. Public Property Server As String)

    Korrigiere bitte mal diese 2 Sachen und du wirst sehen, das dein Code nicht mehr kompiliert.
    Mir ist selber nicht ganz klar wie du dir das Übergeben der Daten gedacht hast. Aber so gehts nicht:

    VB.NET-Quellcode

    1. Dim Server As String = Form4.Server
    2. Dim Port As String = Form4.Port

    Form4 ist in diesem Kontext eine Klasse!!!!!!!!!!!!!!!!!

    Über shared Member in Form4 wäre es möglich aber unnötig. Besser: Einfach beim Konstruktor übergeben.
    Du rufst von Form1 die Form4 auf und dann wieder umgekehrt?
    Wenn du Variablen übergeben willst kann nur die aufrufende Klasse der aufgerufenen Klasse diese direkt übergeben. Dies geschieht üblicherweise mit Properties oder Public-Membern.
    Du versuchst in Form1 die Variablen außerhalb der Subs zu übernehmen. Das muß fehlschlagen!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Server As String = Form4.Server
    3. Dim Port As String = Form4.Port 'Das ist Crap

    Versuch mal das:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Server As String
    3. '
    4. '
    5. Public Form4
    6. Sub Test
    7. Dim f as new Form1 'Instanz von Form1 erzeugen
    8. f.Server="Huhu" 'Variablen übergeben
    9. f.Show 'Form anzeigen
    10. End Sub


    Alternativ kannst du auch enen Konstruktor der Form1 mit entsprechenden Parametern geben oder (da du ja mit Try-Catch zurück willst) gleich einen Dialog nehmen.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Befasse Dich mit modalen und nicht modalen Dialogen sowie mit dem Schlüsselwort Shared.
    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!