ListBox Items hinzufügen funktioniert nicht !

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von arcus.

    ListBox Items hinzufügen funktioniert nicht !

    Ich habe ein Programm geschrieben, welches über einen lokalen Proxy den Datenverkehr eines Programms abfängt.
    Zu Testzwecken habe ich das Programm jedes ankommende Paket bearbeiten und dann in die ListBox eintragen lassen.
    Doch leider wollen die Pakete einfach nicht in die ListBox aufgenommen werden. Ich habe schon jeden Schritt bis zum Eintrag verfolgt, und der String
    mit den Paketdaten kommt auch einwandfrei in folgender Methode an:

    VB.NET-Quellcode

    1. Public Sub addtoPacketLog(ByVal strPinfo As String)
    2. lbPacketLog.Items.Add(strPinfo)
    3. End Sub


    Wenn ich versuche einen String manuell über die Methode in die ListBox hinzuzufügen, funktioniert es einwandfrei 8|

    VB.NET-Quellcode

    1. Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. addtoPacketLog("asdf1234")
    3. End Sub


    Hat jemand eine Ahnung woran es liegen könnte ?

    MfG
    @Gugi Mir ist schon klar wie man ein Item einer ListBox hinzufügt^^

    @Arcus
    Ich habe schon so:

    VB.NET-Quellcode

    1. Call addtoPacketLog(PacketInfo)


    und so:

    VB.NET-Quellcode

    1. addtoPacketLog(PacketInfo)


    ausprobiert, funktioniert beides nicht.
    PacketInfo ist der String der übergeben wird!

    MfG
    wenn du einen wert in form einer vaiablen übergibst, muss diese auch im gleichen synthax in der argumentleiste der prozedur auftauchen. bei dir steht in der prozedurdeklaration nichts von "PacketInfo" wenn diese übergeben wird.

    das wäre das selbe wie hier, da würdes auch nicht gehen:

    VB.NET-Quellcode

    1. call Prozedur(sender,e)
    2. private sub Prozedur (byval sende as system.object, byval e as system.eventargs)


    hier wurde nur das "r" von "sender" vergessen.

    um sowas zu umgehen, änder die sub in eine function, da brauchst du keinen übergabewert für den aufruf der prozedur. natürlich hat die function den hintergrund werte an den aufrufenden code zurückzugeben, doch man kann den rückgabewert auch vernachlässigen.
    Hey,

    @arcus: Sein Code ist doch korrekt und funktioniert? Argumente und Aufruf werden korrekt behandelt, insofern ist dein Einwand... falsch?! Der Fehler, bzw. das nicht-eintragen in die Listbox muss durch ein anderen Codeabschnitt verursacht werden.

    Gruß, Manschula
    Wie oben geschrieben funktioniert er ja mit dem Button_Click event, aber mit meinem Code nicht.

    Das ist die Funktion, die eintritt, wenn ein Paket von dem Socket angenommen wurde

    VB.NET-Quellcode

    1. Public Sub Received(ByVal buffer() As Byte, ByVal size As Integer)
    2. Dim packetData As String = BitConverter.ToString(buffer)
    3. packetData = packetData.Replace("-", "")
    4. 'Opcode (wird benutzt um Pakete zu identifizieren)
    5. Dim OpCode As String = sData.Substring(4, 4)
    6. OpCode = OpCode.Substring(2, 2) & OpCode.Substring(0, 2)
    7. 'Data (eigentlicher Inhalt des Pakets)
    8. Dim PacketData As String = sData.Substring(12, size)
    9. 'Direction (ob das Paket vom Server->Client, oder vom Client-> Server verschickt wurde)
    10. Dim Direction As String = sData.Substring(8, 2)
    11. If Direction = "01" Then
    12. Direction = "C->S"
    13. Else
    14. Direction = "S->C"
    15. End If
    16. Dim PacketInfo As String = String.Format("[{0}]({1}){2}", Direction, OpCode, PacketData)
    17. Call addtoPacketLog(PacketInfo)
    18. 'MsgBox(PacketInfo)
    19. End Sub


    MfG Normalerweise sollte es keien Fehler geben! Wenn ich PacketInfo mit einer MessageBox ausgebe funktioniert es auch!

    //edit: Ich habe wirklich keien Plan was da schief laufen könnte! MessageBox funktioniert, ListBox eben nicht. Ich habe es auch schon mit einem Delegaten versucht, und ob ein Invoke benötigt wird;
    funktioniert aber ebenfalls nicht!
    @manschula,

    ich hatte auch häufig solche probleme, dass irgendwas nicht funktioniert hat, wenn eine prozedur über call aufgerufen wurde, und häufig war die argumentenliste die ursache dafür.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „arcus“ ()

    @arcus

    Ich kann aber auch direkt in der Received-Prozedur den String PacketInfo per

    VB.NET-Quellcode

    1. lbPacketLog.Items.Add(PacketInfo)


    hinzufügen, und es klappt trotzdem nicht. Also kann das Call oder generell der Aufruf der addtopacketlog-prozedur ja kaum für den Fehler verantwortlich sein.

    //edit: Hier ist der Wert eines BeispielPakets, also der Wert von PacketInfo, falls es jemanden interessiert: [S->C](6102)0404006664676
    wie schon erwähnt, muss die aufgerufene prozedur auch was mit der übergabevariable anfangen können. dazu muss sie in der argumentenliste der prozedur auftauchen.

    das mit der msgbox wird funktionieren, weil du sie aus der selben prozedur aufrufst in der du die variable packetinfo definiert hast. immer wenn eine variable innerhalb einer prozedur definiert wird ist sie außerhalb dieser prozedur unbekannt. deswegen muss diese variable auch in der deklaration der aufzurufenden prozedur auftauchen.

    wenn es aber auch nicht funktioniert, wenn du die listbox innerhalb der prozedur in der du die variable packetinfo definiert hast füllen willst, solltest du mal die art der definition der variablen, also dim..... anschauhen, ob du das nicht irgendwie umschreiben kannst, z.b. indem du string.format in eine neue zeile bringst und das = weg lässt. müsstest dann natürlich packetinfo.format schreiben und nicht string.format.

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

    @arcus Die Gültigkeitsbereiche der verschiedenen Variablentypen sind mir bekannt.

    Aber leider ist es nicht so einfach den fehler einfach auf die Variablen zu schieben.

    VB.NET-Quellcode

    1. Public Sub Received(ByVal buffer() As Byte, ByVal size As Integer)
    2. Dim packetData As String = BitConverter.ToString(buffer)
    3. packetData = packetData.Replace("-", "")
    4. 'Opcode (wird benutzt um Pakete zu identifizieren)
    5. Dim OpCode As String = sData.Substring(4, 4)
    6. OpCode = OpCode.Substring(2, 2) & OpCode.Substring(0, 2)
    7. 'Data (eigentlicher Inhalt des Pakets)
    8. Dim PacketData As String = sData.Substring(12, size)
    9. 'Direction (ob das Paket vom Server->Client, oder vom Client-> Server verschickt wurde)
    10. Dim Direction As String = sData.Substring(8, 2)
    11. If Direction = "01" Then
    12. Direction = "C->S"
    13. Else
    14. Direction = "S->C"
    15. End If
    16. Dim PacketInfo As String = String.Format("[{0}]({1}){2}", Direction, OpCode, PacketData)
    17. lbPacketLog.Items.Add(PacketInfo)
    18. End Sub


    Denn diese Lösung funktioniert ebenfalls nicht, obwohl ich die PacketInfo Variable noch in der selben Prozedur verwende.
    Außerdem:
    immer wenn eine variable innerhalb einer prozedur definiert wird ist sie außerhalb dieser prozedur unbekannt. deswegen muss diese variable auch in der deklaration der aufzurufenden prozedur auftauchen.


    Genau dagegen wirkt "ByVal strInfo as String" Wenn der Compiler addtopacketlog(PacketInfo) parst, dann wird der Wert von PacketInfo an die Variable strInfo übergeben. Folglich ist die Variable PacketInfo dann mit neuem Namen, aber gleichem Wert in der addtoPacketLog Prozedur bekannt. Der Code ist fehlerfrei, an den Parametern kann es nicht liegen ;)
    Hey,

    @arcus:

    arcus schrieb:

    wie schon erwähnt, muss die aufgerufene prozedur auch was mit der übergabevariable anfangen können. dazu muss sie in der argumentenliste der prozedur auftauchen.

    Sollte er die gleiche Prozedur verwenden, die er im ertsen Post geschrieben hat, dann wird die Variable doch korrekt übergeben.

    arcus schrieb:

    immer wenn eine variable innerhalb einer prozedur definiert wird ist sie außerhalb dieser prozedur unbekannt

    Das ist doch völlig egal, weil "PacketInfo" als Argument übergeben wird und deshalb nicht global definiert werden muss.

    Edit: darksplain war wohl schneller ;)

    Gruß, Manschula
    @Manschula Danke dass du meinen Post nochmal untermauert hast, denn solche Kleinigkeiten wie Parameterübergabe werde ich doch wohl hinbekommen^^

    @arcus Die Art, wie ich PacketInfo formatiere ist richtig und die einzigst mögliche; und string.Format in eine neue Zeile zu bringen wird icht funktionieren, das hatte ich schonmal getestet.
    Aßerdem kann es daran nicht liegen, wenn ich den string Direction oder PacketData verwende, dann funktioniert das Hinzufügen in die ListBox ebenfalls nicht.
    die sache mit den variablen fällt mir immer gleich erstes ein, weil mein vb2005 sich bei solchen aufrufen immer am synthax der übergabevariablen aufgeilt und ein fehler bringt, wenn die nich genauso in der prozedur steht.