Hex-Befehl in String Array

  • Allgemein

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von TimeOut.

    Hex-Befehl in String Array

    Hallo Forum,



    ich bin relativ nei in VB und habe folgendes Problem:

    Ich bekomme String-Befehle in form eines Hex-Codes rein (ähnlich A0.7C.34.xx...)

    Nun möchte ich jeden eintreffenden Befehl in einem String-Array abspeichern, um anschließend zu prüfen ob der Befehl schon mal eingegangen ist. Ich will nämlich jeden Befehl in einer ListView ausgeben und bereits vorhandene Befehle sollen darin nicht doppelt auftauchen.

    Die Liste zu ertellen und zu befüllen ist kein problem, allerdings schreibt er mir trotzdem jeden Befehl hinein.

    Meine Überlegung:

    1.allcmds soll jeden eingegangenen Befehl speichern

    2. Dann mit einer Methode das Array auf den aktuell anliegenden Befehl prüfen, wenn bereits im Array -> nicht in Liste. Ansonsten schreibe ihn in die Liste


    Private
    Sub ReadList(ByVal command AsString)

    Dim lvItem AsListViewItem
    Dim
    allcmds(100) As String

    With ListView1
     

    If telegramm.success = sendstatus.ok And Count_List <1 Then
    lvItem = .Items.Add(Count_list)

    lvItem.SubItems.Add(DateTime.Now)
    lvItem.SubItems.Add(command) <------Hier wird der eintreffende Befehl in die Liste eingetragen

    allcmds(Count_list) = command <----Count_List =0 wird immer um 1 erhöht nach befüllen
    Count_list = Count_list + 1

    ElseIf telegramm.success = sendstatus.ok AndNot Array.ReferenceEquals(allcmds, command) Then <---Hier suche ich eine Methode die mir das Array durchsucht



    lvItem = .Items.Add(Count_list)
    lvItem.SubItems.Add(DateTime.Now)
    lvItem.SubItems.Add(command) allcmds(Count_list) = command
    Count_list = Count_list + 1



    Hoffe ihr könnt mir da ein wenig auf die Spünge helfen.



    Gruß

    TimeOut
    Willkommen im Forum. :thumbup:
    Muss es ein ListView sein?
    Sieh Dir mal dies mit einer ListBox an:

    VB.NET-Quellcode

    1. Private MyList As New List(Of String)
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. MyList.Add("aa.bb.cc.dd")
    4. MyList.Add("aa.bb.cc.ee")
    5. ListBox1.DataSource = MyList
    6. End Sub
    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!
    Hallo,

    Vielen dank für die schnellen Antworten.

    Ich habe das Gefühl, dass der Fehler darin liegt, dass er mir den eintreffenden Befehl nicht in das String-Array schreibt.

    Mit IndexOf liefert er mir doch eine -1, wenn nichts gefunden wurde, daher änder ich meinen Code ab auf:

    VB.NET-Quellcode

    1. If telegramm.success = sendstatus.ok And Array.IndexOf(allcmds, command) = -1 Then
    2. lvItem = .Items.Add(Count_list)
    3. lvItem.SubItems.Add(DateTime.Now)
    4. lvItem.SubItems.Add(command)
    5. allcmds(Count_list) = command
    6. Count_list = Count_list + 1

    Nun sollte er mir nur Befehle in die Liste eintragen, die so noch nicht im Array gespeichert sind, oder?

    Allerdings werden immer noch alle ankommenden Befehle in die Liste gespeichert :/

    Mit ListBox habe ich mich so noch nicht beschäftigt. Ist das besser hier in dem Fall und wie äußert sich das?

    TimeOut schrieb:

    Ist das besser hier in dem Fall und wie äußert sich das?
    Hier ist nicht die ListBox wichtig, sondern die List(Of MyClass), womit Du ordentlich arbeiten kannst.
    Sorry, aber über Dein eigentliches Problem ListView werde ich mir keine Gedanken machen. :S
    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!
    Dann wärst Du mit einem DataGridView an der richtigen Adresse.
    Allerdings betrittst Du da eine neue Stufe der .NET-Programmierung.
    Bist Du dazu bereit?
    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!
    Wenn mich das meiner Lösung näher bringt, ja.

    Aber durch rumprobieren ist mir aufgefallen, dass er die Befehle nicht in mein angelegtes String-Array schreibt.

    Ich weiss nur nicht wieso. Daher bringt mir meine Abfrage nichts:

    VB.NET-Quellcode

    1. If telegramm.success = sendstatus.ok Then
    2. elseIf Array.IndexOf(allcmds, command) = -1 Then

    Da es einfach immer -1 ist...
    Ist mein Array falsch deklariert oder weise ich ihm "command" falsch zu O.o

    Gruß
    1. Listview Control auf die Form ziehen
    2. Listview Eigenschaft View auf "Details" setzen, MultiSelect auf False, FullRowSelect auf True
    3. Columns Eigenschaft anklicken, dann 3 Columns erstellen.
    4. Globale Variable vom Typ List(Of String) anlegen. -> Private AllCommands As New List(Of String)

    An diesem Sub kannst Du dann einen Befehl übergeben:

    VB.NET-Quellcode

    1. Private Sub Evaluate(C As String)
    2. If Not AllCommands.Contains(C) then
    3. AllCommands.Add(C)
    4. Dim L As New ListViewItem
    5. L.Text = DateTimw.Now.ToString
    6. L.Subitems.add("bla") ' Unteritem
    7. L.Subitems.add(C) ' 2. Unteritem
    8. DeinListView.Items.Add(L)
    9. End If


    Arrays sind eigentlich gut für Konstante Werte.
    Komm vom Gedanken ab, so dynamische Elemente in ein Array zu packen.
    Das gibt nacher IndexOf Exceptions weil Du irgendwas falsch gemacht hast mit dem Index etc etc.
    In der Regel nutzt ein Entwickler List(Of T) wenn Elemente dazukommen.

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

    TimeOut schrieb:

    Da es einfach immer -1 ist...
    Mach Dir zunächst ein separates kleines Testprojekt, in dem Du Deine Zuweisung und den Inhaltstest untersuchst (die Daten schreibst Du einfach in 2 oder 3 Zeilen hin) und nix anderes.
    Wenn das funktioniert, machst Du mit der Anzeige weiter.
    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!
    Habe jetzt das Beispiel von Kevin genommen und ein wenig abgeändert. Es macht genau das, was ich mir vorgestellt habe.

    Super, Danke! :thumbsup:

    List(Of T) war mir so noch gar nicht bekannt :(

    Wie gesagt bin noch neu und bringe mir VB gerade selbst immer Schritt für Schritt bei.



    Gruß
    List(Of T) - dieses T steht einfach nur für einen Datentyp.

    Das geht auch mit eigenen "Datentypen" , also Structures und Klassen.


    Du könntest in deinem Fall z.B eine Structure erstellen,
    um direkt beide Werte(sprich den Command als String(plain) und den Hex String) in der Liste zu haben.


    VB.NET-Quellcode

    1. Public Structure VCommand 'Hab die Structure einfach mal so genannt
    2. Public [Hex], [Plain] As String
    3. Public Sub New(HexN As String, PlainN As String)
    4. Hex = HexN
    5. Plain = PlainN
    6. End Sub
    7. End Structure
    8. Private AllCommands As New List(Of VCommand)
    9. Private Sub Evaluate(C As String)
    10. Dim TempC As New VCommand(C als Hash, C) '
    11. If Not AllCommands.Contains(TempC) then
    12. AllCommands.Add(TempC)
    13. Dim L As New ListViewItem
    14. L.Text = DateTimw.Now.ToString
    15. L.Subitems.add(TempC.Hex) ' Unteritem
    16. L.Subitems.add(TempC.Plain) ' 2. Unteritem , in diesem Fall der Befehl als purer String(kein Hex)
    17. DeinListView.Items.Add(L)
    18. End If



    Mit Tuple(Of ) ging es natürlich auch.. Gibt viele Möglichkeiten.
    Hallo,

    ich versuche nun die Befehle in der ListView mit neuen eintreffenden Befehlen zu vergleichen und wenn dies der Fall ist, soll sich die Komplette zeile, in der der gleiche Befehl schon steht sich rot färben.

    Im Forum habe ich folgenden Code gefunden und modifiziert:

    VB.NET-Quellcode

    1. For Each item As ListViewItem In ListView1.Items
    2. If String.Compare(item.Text, command_check) = 0 Then
    3. ListView1.Select()
    4. item.Selected = True
    5. item.BackColor = Color.Red
    6. End If
    7. Next

    Der Code färbt allerdings nicht die vorkommende Zeile ein..
    Wenn ich den Debugger laufen lasse und mir items.Text anschaue hat es nie den Wert des Hex-Codes gespeichert sondern nur die Anzahl der Zyklen (Tabelle besteht aus mehreren Spalten: Zyklus, Datum , Befehl)
    Aber sollte items.Text nicht jedes Element in der Liste beinhalten?
    Gruß
    TimeOut

    TimeOut schrieb:

    VB.NET-Quellcode

    1. For Each item As ListViewItem In ListView1.Items
    Diese Schleife läuft über alle Zeilen der 1. Spalte.
    Wenn Du auf die anderen Spalten zugreifen willst, nutze ListViewItem.SubItems.
    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!