Bei Verbindung Listbox erstellen

  • Allgemein

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Dendem.

    Bei Verbindung Listbox erstellen

    Hallo, ich habe ein weiteres kleines Problem,

    Ich habe einen TCP-Server programmiert und hätte gerne,
    dass bei jeder eingehenden Verbindung eine Listbox erstellt
    wird und dort bestimmte Daten des Clients eingetragen werden.

    VB.NET-Quellcode

    1. ....
    2. Private Structure Connection
    3. Dim stream As NetworkStream
    4. Dim streamw As StreamWriter
    5. Dim streamr As StreamReader
    6. Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    7. Dim geschossen As Integer
    8. Dim position As Point
    9. Dim winkel As Integer
    10. Dim waffe As Integer
    11. Dim libo As ListBox
    12. End Structure
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. ipendpoint = New IPEndPoint(IPAddress.Any, TextBox1.Text)
    15. mainthread = New Threading.Thread(AddressOf mainserver)
    16. mainthread.Start()
    17. End Sub
    18. Sub mainserver()
    19. Dim y As Integer = 12
    20. MsgBox("Der Server läuft!")
    21. Server = New TcpListener(ipendpoint)
    22. Server.Start()
    23. While True ' wir warten auf eine neue verbindung...
    24. client = Server.AcceptTcpClient
    25. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    26. c.stream = client.GetStream
    27. c.streamr = New StreamReader(c.stream)
    28. c.streamw = New StreamWriter(c.stream)
    29. Me.Controls.Add(c.libo)
    30. c.libo.Visible = True
    31. c.libo.Size = New Size(71, 459)
    32. c.libo.Location = New Point(y, 41)
    33. c.waffe = 1
    34. c.geschossen = 0
    35. c.winkel = 0
    36. c.position = New Point(250, 250)
    37. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    38. MsgBox(c.nick)
    39. liste.Add(c) ' und fügen sie der liste der clients hinzu.
    40. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
    41. y = y + 77
    42. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    43. t.Start(c)
    44. End While
    45. End Sub
    46. .....


    leider bekomme ich an der Stelle, bei der ich auf die Eigenschaften der listbox zugreife immer folgenden Fehler:

    Quellcode

    1. Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in WindowsApplication6.exe aufgetreten.
    2. Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


    Im Formload-Event klappt alles wunderbar, aber das ist ja nicht Sinn der Sache :)

    Hoffe mir kann einer behilflich sein :)

    Dendem schrieb:

    Im Formload-Event klappt alles wunderbar
    Wird dort etwa eine Exception geworfen, von der Du nichts mitkriegst?
    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!
    Ist die Klasse "Connection" (ich gehe davon aus die selbst erstellt?) in irgendeiner Weise mit der Listbox verbunden?
    Wenn nein, erstell doch einfach eine neue Listbox per

    VB.NET-Quellcode

    1. Dim l as New listbox


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    Dendem schrieb:

    leider bekomme ich an der Stelle, bei der ich auf die Eigenschaften der listbox zugreife
    Wo genau ist das?
    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!
    Ich hab ja in der Klasse mehrere Variablen, für jede wird eine neue instanz in Verbindung zu der eingehenden Verbindung angelegt.
    z.B. nick, das klappt auch wunderbar, warum wird aber für die Listbox keine instanz angelegt?

    @fichz dann bräuchte ich aber für jeden Spieler ne Listbox mit nem anderen Namen

    @RodFromGermany ja wenn ich visible auf true setzt, oder größe und position verändern will
    Jetzt erst gesehen...

    VB.NET-Quellcode

    1. Private Structure Connection
    2. Dim stream As NetworkStream
    3. Dim streamw As StreamWriter
    4. Dim streamr As StreamReader
    5. Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert.
    6. Dim geschossen As Integer
    7. Dim position As Point
    8. Dim winkel As Integer
    9. Dim waffe As Integer
    10. Dim libo As ListBox
    11. End Structure


    Ist klar. Du versuchst auf libo zuzugreifen obwohl noch kein Objekt daraus instanziert wurde.
    Mach

    VB.NET-Quellcode

    1. Dim libo As new ListBox


    Das sollte dein Problem lösen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wenn ich hier

    VB.NET-Quellcode

    1. Sub mainserver()
    2. Dim y As Integer = 12
    3. MsgBox("Der Server läuft!")
    4. Server = New TcpListener(ipendpoint)
    5. Server.Start()
    6. While True ' wir warten auf eine neue verbindung...
    7. client = Server.AcceptTcpClient
    8. [b]Dim libo as New Listbox[/b]
    9. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    10. c.stream = client.GetStream
    11. c.streamr = New StreamReader(c.stream)
    12. c.streamw = New StreamWriter(c.stream)
    13. Me.Controls.Add(c.libo)
    14. c.libo.Visible = True
    15. c.libo.Size = New Size(71, 459)
    16. c.libo.Location = New Point(y, 41)
    17. c.waffe = 1
    18. c.geschossen = 0
    19. c.winkel = 0
    20. c.position = New Point(250, 250)
    21. c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen.
    22. MsgBox(c.nick)
    23. liste.Add(c) ' und fügen sie der liste der clients hinzu.
    24. ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients
    25. y = y + 77
    26. Dim t As New Threading.Thread(AddressOf ListenToConnection)
    27. t.Start(c)
    28. End While
    29. End Sub


    da bleibt der Oben genannte fehler, wenn ich anstatt Dim libo as Listbox kommt:
    Nicht freigegebene Member in einer Struktur können nicht als "New" deklariert werden.
    Dann musst du entweder deine Structure zu einer Class machen (was in deinem Fall denk ich egal wäre)
    oder bevor du auf "libo" zugreifen willst:

    VB.NET-Quellcode

    1. c.streamw = New StreamWriter(c.stream)
    2. c.libo = New ListBox
    3. Me.Controls.Add(c.libo)


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wenn ich c.libo = new listbox mache, kommt bei mir:

    Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Form1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    -> Ich werde vermutlich Delegates brauchen? :)

    wenn ich die structure zu einer class mache steht da: ist in diesem Kontext nicht zugreifbar, da es "private" ist
    habs aber auch schon mit public versucht.