vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Listview Muster erkennen 
Autor: Opossum01
Datum: 04.12.22 11:45

Hi,

mit diesem Code benenne ich Muster in einer Listview
For Each lva As ListViewItem In Form1.lv.Items
            If lva.SubItems(1).Text = "17" And lva.SubItems(4).Text = "22" Then
                lva.SubItems(7).Text = "Muster1"
                lva.BackColor = Color.AliceBlue
            End If
        Next
        For Each lva As ListViewItem In Form1.lv.Items
            If lva.SubItems(1).Text = "8" And lva.SubItems(4).Text = "28" Then
                lva.SubItems(7).Text = "Muster2"
                lva.BackColor = Color.Aqua
            End If
        Next


Jetzt würde ich gerne horizontale Muster erkennen in lva.SubItems(3)
25,89,185,281,377,473,537 und ---> Muster3
89,185,281,377,473,537 ---> Muster4

Problem ist das alles relativ gleich ist, das eine Muster aus 7 Zeilen besteht das andere nur aus 6 Zeilen.

Hat jemand eine Idee, wie ich dieses Problem lösen kann ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Manfred X
Datum: 04.12.22 14:18

Hallo!

Beschreibe Deine Fragestellung korrekt und vollständig.

Wie wird ein Muster als solches erkannt?
Können sich z.B. die Muster-Zahlenreihen überlappen?
Können bestimmte Zahlen(folgen) in einem Muster mehrfach vorkommen?
Hebt ein längeres Muster ein darin vollständig enthaltenes kürzeres Muster auf?


Eventuell:
Zuerst in allen Zeilen nach dem längsten Muster suchen und die "betroffenen" Zeilen markieren.
Danach das zweit-längste Muster in den noch unmarkierten Zeilen suchen, diese markieren usw.

Beitrag wurde zuletzt am 04.12.22 um 14:28:53 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Opossum01
Datum: 04.12.22 14:51

Hi,

das Muster soll als solches erkannt werden, wenn diese Zahlen direkt 25,89,185,281,377,473,537 untereinander stehen.
7 Zahlen in Reihenfolge wäre Muster 3.

Die gleichen Zahlen können untereinander stehen, es fehlt aber die 25. Also sind es hier nur 6 Zahlen wäre Muster 4.

In der Listview können die gleichen Folgen mehrmals vorkommen, haben dann aber in lva.SubItems(3) andere Werte.

Ein längeres Muster hebt ein kürzeres auf.

Lauter Sachen an die ich noch garnicht gedacht habe.

Für eine kleines Beispiel wäre ich sehr dankbar.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Manfred X
Datum: 04.12.22 15:40

Annahme: Muster überlappen sich nicht
Winforms-Formular
Public Class frmListMuster
 
    Dim lv As New System.Windows.Forms.ListView With {.Parent = Me, .Size = New _
      Size(400, 400), .View = View.Details}
 
    Dim musters As New List(Of Integer())
    Dim colors As New List(Of Color)
 
 
    Private Sub frmListMuster_Load(sender As Object, e As EventArgs) Handles _
      MyBase.Load
 
       'Muster  (nach Länge geordnet)
       musters.Add({25, 89, 185, 281, 377, 473, 537})
       musters.Add({89, 185, 281, 377, 473, 537})
       '..............
 
      'Markierfarben der Muster
       colors.Add(Color.Cyan)
       colors.Add(Color.Yellow)
       '...............
 
 
       Dim basecolor As Color = Color.White
 
       'Testdaten
       lv.Columns.Add("Ziffernfolge")
       For i As Integer = 0 To musters.Count - 1
        For k As Integer = 0 To musters(i).Length - 1
            lv.Items.Add(musters(i)(k))
        Next k
       Next i
       lv.Items.Add(1234)
       For i As Integer = 0 To musters.Count - 1
          For k As Integer = 0 To musters(i).Length - 1
             lv.Items.Add(musters(i)(k))
          Next k
       Next i
 
 
      'Markieren der gefundenen Musterfolge
      Dim ok As Boolean
 
      'Schleife über alle Muster
      For m As Integer = 0 To musters.Count - 1
 
        'Schleife über die Items für Suche nach Muster m
        For it As Integer = 0 To lv.Items.Count - 1
 
            ok = True
 
            'Schleife über Ziffernfolge vom Muster m
            For k As Integer = 0 To musters(m).Length - 1
                If it + k > lv.Items.Count - 1 Then
                    ok = False : Exit For
                End If
                If Not ColorsEqual(lv.Items(it + k).BackColor, basecolor) Then
                    ok = False : Exit For
                End If
                If CInt(lv.Items(it + k).Text) <> musters(m)(k) Then
                    ok = False : Exit For
                End If
            Next k
 
            If ok Then
                'Muster m ab Item It markieren mit color(m)
                For k As Integer = 0 To musters(m).Length - 1
                    lv.Items(it + k).BackColor = colors(m)
                Next k
            End If
        Next it
    Next m
 
End Sub
 
 
 
Private Function ColorsEqual(c1 As Color, c2 As Color) As Boolean
 
   If c1.R <> c2.R Then Return False
   If c1.G <> c2.G Then Return False
   If c1.B <> c2.B Then Return False
   Return True
 
End function


Beitrag wurde zuletzt am 04.12.22 um 15:43:22 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Opossum01
Datum: 04.12.22 19:09

Danke schön,

hat mir sehr geholfen.

Die farbige Einordnung ist für den Anfang sehr hilfreich, damit ich einen optischen Überblick bekomme.

Gibt es auch eine Möglichkeit, das Ganze in
lva.SubItems(8).Text = "Muster3"
zu benennen, welches Muster gefunden wurde ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Manfred X
Datum: 04.12.22 21:12

Jetzt sind die Muster in der Liste musters indiziert mit 0,1,....

Einfach in der Markierschleife, in der jeweils dem Item mit Index i+k
die Backcolor m zugewiesen wird, in Spalte 8 dieses Items die Nummer m
eintragen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Listview Muster erkennen 
Autor: Opossum01
Datum: 06.12.22 20:48

Hallo Manfred,

ich verstehe was du meinst. Leider bekomme ich es nicht aufs Blatt.

Du meinst diesen bereich ?

For k As Integer = 0 To musters(m).Length - 1
                    lv.Items(it + k).BackColor = colors(m)
                Next k
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel