bestimmte Prozesse in Listview

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    bestimmte Prozesse in Listview

    Hallo,

    ich hab ein Array und dieses mit 2 Strings befüllt. Nun versuche ich vergebens beide Einträge im Array mit den laufenden Prozessen gegenzuprüfen.
    Mein bisheriger Code sieht so aus:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim process(1) As String
    3. process(0) = "firefox"
    4. process(1) = "thunderbird"
    5. For Each runproc As Process In System.Diagnostics.Process.GetProcessesByName(process(0))
    6. 'Form2.ListView1.Items.Clear()
    7. process(0) = "Mozilla Firefox"
    8. process(1) = "Mozilla Thunderbird"
    9. Form2.ListView1.Items.Add(process(0))
    10. Form2.Show()
    11. Return
    12. Next
    13. Form3.Show()
    14. End Sub


    Wenn ich nur einen Wert des Arrays angebe funktioniert es. Ich komme einfach nicht dahinter wie ich das ganze array prüfen kann?
    Denn dann müssten ja 2 Messageboxen hintereinander auspoppen wenn beide Programme laufen.

    Edit: hab den Code soweit umgeschrieben auf die Dinge die ich wirklich machen möchte.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

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

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim processes() As String = {"firefox", "thhunderbird"}
    3. Dim displaynames() as String = {"Mozilla Firefox", "Mozilla Thunderbird"}
    4. Form2ListView1.BeginUpdate()
    5. Form2ListView1.Clear()
    6. For i As integer = 0 to processes.length - 1
    7. For Each runproc As Process In System.Diagnostics.Process.GetProcessesByName(processes(i))
    8. Form2.ListView1.Items.Add(processes(i))
    9. Form2.Show()
    10. Return
    11. Next
    12. Next
    13. Form2ListView1.EndUpdate()
    14. Form3.Show()
    15. End Sub
    Ich würde das mit zwei Schleifen machen. Außerdem statt processes(1) As Process eher processes(1) As String.

    VB.NET-Quellcode

    1. Dim prozesse(1) As String
    2. prozesse(0) = "firefox"
    3. prozesse(1) = "thunderbird"
    4. For i As Integer = 0 To 1
    5. For Each prozess In Process.GetProcessesByName(prozesse(0))
    6. MessageBox.Show("blabla")
    7. Next
    8. Next


    LG

    //Edit: Infinity war schneller...

    Ich würds so machen....

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Dim listRunningProcs As New List(Of String)
    4. Dim listLookProcs As New List(Of String)
    5. listLookProcs.Add("opera")
    6. listLookProcs.Add("chrome")
    7. listRunningProcs.AddRange(From p As Process In Process.GetProcesses() Select p.ProcessName)
    8. For Each s As String In listLookProcs
    9. If listRunningProcs.Contains(s) Then
    10. MessageBox.Show(s & " is running")
    11. End If
    12. Next
    13. End Sub
    14. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Edit:

    OK nochmal zurückspulen...
    Ich hab es jetzt so:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim listRunProcs As New List(Of String)
    3. Dim listProcs As New List(Of String)
    4. listProcs.Add("firefox")
    5. listProcs.Add("thunderbird")
    6. listRunProcs.AddRange(From p As Process In Process.GetProcesses() Select p.ProcessName)
    7. For Each s As String In listProcs
    8. If listRunProcs.Contains(s) Then
    9. Form2.ListView1.Items.Add(s)
    10. Form2.Show()
    11. End If
    12. Next
    13. End Sub


    Das läuft jetzt so die items werden im ListView1 richtig angezeigt. Hab mich dann nach dem List(Of T) - Klasse erkundigt denn ich wollte was suchen womit ich die Namendie oben in die Liste gefüllt sind bevor sie in die Listview kommen überschreiben kann...wurde aber leider nicht fündig. Beim Array wusste ich das ich 0 und 1 habe. Bei dieser Liste dürfte das etwas anders sein.

    OK, habs jetzt so gelöst und funktioniert auch so:

    VB.NET-Quellcode

    1. If s.Contains("firefox") Then
    2. s = "Mozilla Firefox"
    3. ElseIf s.Contains("thunderbird") Then
    4. s = "Mozilla Thunderbird"
    5. End If


    Somit hat sich mein Problem mit dem Überschreiben mal geklärt, aber ein neues ist aufgetaucht. Wenn natürlich kein Programm läuft soll sich Form3 öffnen, jedoch kann ich mich nicht an die listProcs() halten weil die immer gefüllt ist. Muss ich noch einmal eine 2. IF-Abfrage machen für den Fall das garkein der beiden Programme läuft?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Snaptu“ ()

    Snaptu schrieb:

    VB.NET-Quellcode

    1. Form2.Show()
    in einer schleife?
    Hast Du schon mal was von Instanzen gehört?

    VB.NET-Quellcode

    1. Dim dlg As New Form2
    2. dlg.Show()
    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!

    RodFromGermany schrieb:

    Hast Du schon mal was von Instanzen gehört?


    Antwort = Nein.

    Darum, back to the Grundlagen.

    microsoft.com/germany/msdn/akt…005dasentwicklerbuch.mspx
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Auf das Buch (aber die 2010 ausgabe) warte ich noch, Amazon lässt sich Zeit. Nagut dann muss ich mir Instanzen mal ansehen.
    Ich war heute auf dieser Seite -> microsoft.com/germany/msdn/beg…ideos/basics/default.aspx
    Hab mir Lektion 3 und 4 angesehen und finde das man aus den Videos schon lernen kann. Haltet ihr die Videos für Anfänger geeignet?

    Edit: Hab jetzt alles wie ihr gesagt habt soweit angepasst und jetzt läuft natürlich auch alles gleich viel besser.

    Ne Frage hätte ich noch nachdem ja nach dieser Prüfung der Kopiervorgang beginnen kann, der nicht so schwer sein dürfte weil es Ordner von A nach B kopieren ist ABER ist es schwer oder sagen wir mal zu schwer für MICH die Progressbar beim kopieren richtig zu timen? Ich kann mir ja theoretisch Informationen wie "Größe aller Dateien","Kopiergeschwindigkeit" besorgen und dann ausrechnen wielange es dauert würde alles zu kopieren und den Wert der Progressbar dadurch verändern?

    Danke das ihr mir immer so nett helft :thumbsup:
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Snaptu“ ()

    Snaptu schrieb:

    Nagut dann muss ich mir Instanzen mal ansehen.
    Suche hier im Forum gezielt nach modalen und nicht modalen Dialogen.
    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!
    Ok jetzt habe ich dich verstanden ;) Ich hatte nämlich auch das Problem das wenn einmal die warning Form da war die mir gesagt hat das ein Programm läuft der Benutzer die hintere Form nochmal anklicken konnte und sich dadurch die warning Form mehrfach öffnen lies. Hab mir dann das hier angekuckt:

    VB.NET-Quellcode

    1. bla.Show() 'Nicht modaler Dialog (aufrufende form anklickbar), kann hinter aufrufendem Fenster verschwinden
    2. bla.Show(Me) 'Nicht modaler Dialog (aufrufende Form anklickbar), kann nicht hinter aufrufendem Fenster verschwinden
    3. bla.ShowDialog() 'Modaler Dialog (aufrufende Form nicht anklickbar)
    4. bla.ShowDialog(Me) 'Modaler Dialog, kein Unterschied zu bla.ShowDialog()


    und meinen Code so umgebaut:

    VB.NET-Quellcode

    1. Dim warning As New Form2
    2. Dim setup As New Form3
    3. Dim running As Boolean
    4. Dim listRunProcs As New List(Of String)
    5. Dim listProcs As New List(Of String)
    6. listProcs.Add("firefox")
    7. listProcs.Add("thunderbird")
    8. listRunProcs.AddRange(From p As Process In Process.GetProcesses() Select p.ProcessName)
    9. For Each s As String In listProcs
    10. If listRunProcs.Contains(s) Then
    11. 'Prozessnamen als String überschreiben....
    12. If s.Contains("firefox") Then
    13. s = "Mozilla Firefox"
    14. ElseIf s.Contains("thunderbird") Then
    15. s = "Mozilla Thunderbird"
    16. End If
    17. '....und in Listview ausgeben
    18. warning.ListView1.Items.Add(s)
    19. running = True
    20. End If
    21. If running = True Then
    22. warning.ShowDialog()
    23. Else
    24. Me.Visible = False
    25. setup.Show()
    26. End If
    27. Next


    und siehe da ich habe merklich weniger Probleme dem späteren Nutzer Dinge die er nicht machen darf auszugrenzen. Danke RodFromGermany
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Snaptu schrieb:

    VB.NET-Quellcode

    1. Dim warning As New Form2
    Das wird so nicht funktionieren, wenn Du den Dialog beendest und wieder aufrufen willst.
    Da musst Du 2 Herangehensweisen unterscheiden:
    Spoiler anzeigen
    1. Modaler Dialog

    VB.NET-Quellcode

    1. Using dlg As New FormX
    2. dlg.ShowDialog()
    3. End Using
    2. Nicht modaler Dialog

    VB.NET-Quellcode

    1. Private dlg As FormX
    2. Private Sub xxx()
    3. If dlg Is Nothing OrElse dlg.IsDisposed Then
    4. dlg = New FormX
    5. End If
    6. If Not dlg.Visible Then
    7. dlg.Show()
    8. ' oder
    9. 'dlg.Show(Me)
    10. End If
    11. 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!
    Dann würde es in meinem Fall genügen wenn ich es wie folgt umschreibe?

    VB.NET-Quellcode

    1. Using warning As New Form2
    2. Dim setup As New Form3
    3. Dim running As Boolean
    4. Dim listRunProcs As New List(Of String)
    5. Dim listProcs As New List(Of String)
    6. listProcs.Add("firefox")
    7. listProcs.Add("thunderbird")
    8. listRunProcs.AddRange(From p As Process In Process.GetProcesses() Select p.ProcessName)
    9. For Each s As String In listProcs
    10. If listRunProcs.Contains(s) Then
    11. 'Prozessnamen als String überschreiben....
    12. If s.Contains("firefox") Then
    13. s = "Mozilla Firefox"
    14. ElseIf s.Contains("thunderbird") Then
    15. s = "Mozilla Thunderbird"
    16. End If
    17. '....und in Listview ausgeben
    18. warning.ListView1.Items.Add(s)
    19. running = True
    20. End If
    21. If running = True Then
    22. warning.ShowDialog()
    23. Else
    24. Me.Visible = False
    25. setup.Show()
    26. End If
    27. End Using
    28. Next
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Snaptu schrieb:

    wenn ich es wie folgt umschreibe?
    Geht nicht, da das öffnende Using außerhalb der For-schleife, das schließende Using jedoch innerhalb dieser ist.

    VB.NET-Quellcode

    1. Dim setup As New Form3
    geht so auch nicht, da der Dialog beendet wird, wenn die Prozedur verlassen wird.
    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!
    OK warning muss in die For Schleife, gut.
    Das mit dem Setup überleg ich mir wenn die For-Schleife richtig funktioniert,
    im Moment habe ich nämlich auch das Problem das nur das 1. Programm geprüft wird und in
    die Listbox kommt. Ich bau das ganz einfach nochmal sauber und vorallem richtig auf sonst
    kommt sowieso nur blödsinn raus.

    Edit: So habs jetzt nochmal (ich hoffe) verbessert.

    VB.NET-Quellcode

    1. Using warning As New Form2
    2. Dim listRunningProcs As New List(Of String)
    3. Dim listLookProcs As New List(Of String)
    4. listLookProcs.Add("firefox")
    5. listLookProcs.Add("thunderbird")
    6. listRunningProcs.AddRange(From p As Process In Process.GetProcesses() Select p.ProcessName)
    7. For Each s As String In listLookProcs
    8. If listRunningProcs.Contains(s) Then
    9. If s.Contains("firefox") Then
    10. s = "Mozilla Firefox"
    11. ElseIf s.Contains("thunderbird") Then
    12. s = "Mozilla Thunderbird"
    13. End If
    14. warning.ListView1.Items.Add(s)
    15. MessageBox.Show(s)
    16. End If
    17. Next
    18. End Using


    Also in die Listview1 schreibt er ja schon erfolgreich die beiden Programme und auch in der MessageBox zeigt er beide Programme mit richtigem Namen.
    Füge ich jetzt aber ein warning.ShowDialog() ein kommt die Form nur mit dem 1. eintrag, d.h. er bricht nach dem 1. durchlauf die schleife ab.
    Was mach ich noch falsch? Ich schließe sicher irgendwie schon wieder den Dialog :(
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Snaptu“ ()

    Setz in die Schleife einen Haltepunkt, verfolge die Programmabarbeitung schrittweise und sieh Dir permanent den Inhalt der Variablen an.
    Dies nennt man Debuggen.
    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!