Listview und Prozesse mit Ausnahmen!

  • VB.NET
  • .NET 3.5

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    @Cheffboss ich hatte sowas gemeint

    VB.NET-Quellcode

    1. For Each AppTitle As Process In Process.GetProcesses
    2. 'Abbruch Bedingungen prüfen
    3. If (AppTitle.MainWindowTitle = "" OrElse AppTitle.MainWindowTitle = "SysFader" OrElse AppTitle.MainWindowTitle = Me.Text ) Then Continue For
    4. ' Hinfügen...
    5. Me.ListViewEx1.Items.Add(AppTitle.MainWindowTitle).SubItems.Add(AppTitle.ProcessName)
    6. Next


    Oder auch mit einer eigenen Methode zur Prüfung der Abbruch Bedingungen

    VB.NET-Quellcode

    1. Private Sub DoSomeStuff
    2. For Each AppTitle As Process In Process.GetProcesses
    3. 'Abbruch Bedingungen prüfen
    4. If(Not CheckTitleOk(AppTitle.MainWindowTitle)) Then Continue For
    5. ' Hinfügen...
    6. Me.ListViewEx1.Items.Add(AppTitle.MainWindowTitle).SubItems.Add(AppTitle.ProcessName)
    7. Next
    8. End Sub
    9. Private Function CheckTitleOk(title as String) As Boolean
    10. If (AppTitle.MainWindowTitle = "" OrElse AppTitle.MainWindowTitle = "SysFader" OrElse AppTitle.MainWindowTitle = Me.Text ) Then Return False
    11. Return True
    12. End Function


    Deine tiefen If Verschachtelungen machen es schwerer den Code zu lesen und zu warten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo: Da hat sich aber in der CheckTitleOK was eingeschlichen. Du verwendest den Parameter gar nicht. Außerdem kann man sie vereinfachen.

    Jetzt komm ich noch daher und feile noch weiter in der VaporiZed-Manier dran:
    Das

    VB.NET-Quellcode

    1. For Each AppTitle As Process In Process.GetProcesses 'AppTitle ist aber irreführend. Man hat hier schließlich einen Process an der Angel
    2. If (AppTitle.MainWindowTitle = "" OrElse AppTitle.MainWindowTitle = "SysFader" OrElse AppTitle.MainWindowTitle = Me.Text ) Then Continue For
    3. 'restlicher Code…
    4. Next

    oder das

    VB.NET-Quellcode

    1. For Each AppTitle In Process.GetProcesses
    2. If(Not CheckTitleOk(AppTitle.MainWindowTitle)) Then Continue For
    3. 'restlicher Code…
    4. Next

    sind für mich immer LINQ-Kandidaten:

    VB.NET-Quellcode

    1. For Each AppTitle As Process In Process.GetProcesses.Where(Function(x) CheckTitleOk(x.MainWindowTitle))
    2. 'restlicher Code…
    3. Next

    Die Abbruchbedingung auszulagern halte ich für sinnvoll, aber die Benennung sollte aussagekräftiger sein, z.B. TitleIsOk
    Sobald man das hat, kann man sogar dazu übergehen, den Schleifencode ebenfalls in eine Sub auszulagern und aus der For-Schleife eine LINQ-Geschichte zu machen.

    VB.NET-Quellcode

    1. Private Sub AddValidProcessesToList()
    2. Process.GetProcesses.Where(Function(x) TitleIsOk(x.MainWindowTitle)).ForEach(Sub(x) AddProcessToList(x))
    3. End Sub
    4. Private Function TitleIsOk(Title As String) As Boolean
    5. Return Title <> "" AndAlso Title <> "SysFader" AndAlso Title <> Me.Text
    6. End Function
    7. Private Sub AddProcessToList(Process As Process)
    8. Me.ListViewEx1.Items.Add(Process.MainWindowTitle).SubItems.Add(Process.ProcessName)
    9. End Sub


    Allerdings braucht man dafür entweder noch eine selbstgemacht IEnumerable(Of T)-ForEach-Extension (die ich häufig brauche, aber warum auch immer nicht im Framework ist) oder man setzt in Zeile#2 vor das .ForEach noch ein .ToArray ein.

    ##########

    Ich setz noch nach:

    VB.NET-Quellcode

    1. Private Sub AddValidProcessesToList()
    2. Process.GetProcesses.Where(Function(x) TitleIsOk(x.MainWindowTitle)).ForEach(Sub(x) AddProcessToList(x))
    3. End Sub

    ->

    VB.NET-Quellcode

    1. Private Sub AddValidProcessesToList()
    2. GetValidProcesses.ForEach(Sub(x) AddProcessToList(x))
    3. End Sub
    4. Private Function GetValidProcesses() As IEnumerable(Of Process)
    5. Return Process.GetProcesses.Where(Function(x) TitleIsOk(x.MainWindowTitle))
    6. End Function


    Was der ganze Aufteilungskram soll? Einmal selbst-sprechender Integrationscode und auf der anderen Seite einfacher Operationscode, der leicht durch eine Handvoll Tests geprüft werden kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    VaporiZed schrieb:

    Da hat sich aber in der CheckTitleOK was eingeschlichen. Du verwendest den Parameter gar nicht.
    passiert schon mal wenn man In nem mini Textfeld am iPhone Code aus dem Kopf schreibt... ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen