Dialog mit Processbar und Abbruch-Button

  • VB.NET

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

    Dialog mit Processbar und Abbruch-Button

    Moin!

    ich habe eine Schleife die einige Zeit arbeitet und in dieser Zeit habe ich einen Dialog geöffnet mit einer Processbar. Die arbeitet auch richtig und der Balken wandert.

    Auf dem Dialog habe ich ein Button zum Abbrechen - aber dieser wird nicht angezeigt.



    Wenn auf den Button geklickt wird, dann soll eine Rückfrage kommen ob dieses wirklich gewünscht wird. Eine Variable wird dann ggf. in der Form entsprechend umgestellt . Diese dann wiederum innerhalb der arbeitenden Schleife ausgewertet um ggf. abzubrechen.

    Vermutlich frisst die Scheife Performance und deshalb wird die Schaltfläche nicht "angeboten". So mein Gedanke.

    Kann mir einer mit einem guten Tipp weiterhelfen?

    Gruß Jan
    Moin!

    danke erst einmal. Hier der Code aus dem Frame mit der Prozessbar:

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic
    2. Public Class frmProcess
    3. Private _CancelStatus As Boolean = False
    4. Public ReadOnly Property CancelStatus() As Boolean
    5. Get
    6. Return _CancelStatus
    7. End Get
    8. End Property
    9. ''' <summary>
    10. ''' Rückfrage, ob die Funktion wirklich abgebrochen werden soll
    11. ''' </summary>
    12. Private Sub bt_cancel_Click(sender As Object, e As EventArgs) Handles bt_cancel.Click
    13. If MsgBox("Wollen Sie den wirklich abbrechen?", MsgBoxStyle.Question, k_CompanyName) = MsgBoxResult.Yes Then
    14. _CancelStatus = True
    15. End If
    16. End Sub
    17. End Class


    Gruß Jan
    @jan99 Sieh Dir mal hier an und verstehe, was da zu DialogResult geschrieben steht.
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Und noch einmal: Bei Deinem Code ist nicht ersichtlich, wer wie die Progressbar ansteuert.
    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!
    Meist passiert so etwas wenn die Schleife alle Programmressourcen beansprucht. Wenn die Anwendung keine Zeit mehr hat die Formulare zu zeichnen passiert genau das was du in deinem Screenshot zeigst. Das kannst du verhindern indem du in deiner Schleife mal ein Application.DoEvents einbaust.

    Die alternative wäre die Schleife in einen eigenen Thread auslagerst.

    Stichwort Backgroundworker.
    Backgroundworker, Thread, alles tolle Sachen. Warum empfiehlt keiner was mit Async/Await? Hier habe ich den Eindruck das der TE eine fehlerhafte Architektur hat. Daher meine explizite Frage nach dem Code. Sicherlich koennte man das in die Klasse der Form auf welcher die Progressbar ist auslagern, danach waere Threading etc. an der Reihe.
    And i think to myself... what a wonderfuL World!

    Eddy schrieb:

    Warum empfiehlt keiner was
    Leider hat sich @jan99 noch nicht wieder zu Wort gemeldet, seine bisherigen Aussagen waren doch eher etwas mau.
    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!
    Moin!

    war zwischendurch Wochenende ...!

    Habe den Code der aufrufenden Funktion einmal soweite ausgedünnt das das Grundgerüst noch da ist - hoffentlich nicht zu viel entfernt!

    Sage schon einmal - gruß Jan

    VB.NET-Quellcode

    1. Dim f As New frmProcess
    2. ...
    3. Try
    4. If ListOfDM.Count > 0 Then
    5. ...
    6. f.pb_action.Minimum = 0
    7. f.pb_action.Value = 0
    8. f.Text = "DWG-Export ...."
    9. f.Show()
    10. ...
    11. For Each element In keyArray
    12. ...
    13. f.lbl_NameDM.Text = CurrentDM
    14. f.pb_action.Minimum = 0
    15. f.pb_action.Value = 0
    16. f.pb_action.Maximum = LayerNames.Count + 1
    17. f.bt_cancel.Enabled = True
    18. For i = 0 To LayerNames.Count - 1
    19. f.pb_action.Value = f.pb_action.Value + 1
    20. ... HIER IST DER HAUPTVERARBEITUNGSBLOCK
    21. Next 'i
    22. Next 'each
    23. ErrorDetail = "Processbar schließen"
    24. f.Close()
    25. f.Dispose()
    26. ErrorDetail = "Acad-Regen und UpdateScreen"
    27. _Acad.Regen()
    28. _Acad.UpdateScreen()
    29. ErrorDetail = "Schlussmeldung"
    30. End If
    31. Catch ex As Exception
    32. ' Processbar schließen bei Fehler
    33. If Not IsNothing(f) Then
    34. f.Close()
    35. f.Dispose()
    36. End If
    37. Return -99
    38. End Try

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

    @jan99 Den _TryReport hättest Du noch weglassen können. ;)
    Was ich nicht sehe ist, wie Du der Progressbar unterschiedliche Werte zuweist.
    Und:
    Was passiert, was soll passieren?
    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!
    Moin @jan99

    Die Lösung die @Fakiz dir Vorgeschlagen hat mit Threading/Backgroundworker hast du noch nicht testen können? Mach das mal und gib uns Feedback on das geklappt hat.

    Ist mit obigem Code das Darstellungproblem reproduzierbar? Falls nicht (wovon ich ausgehe) wäre es schön, wenn du deinen Code im Ganzen posten würdest.

    Hast du die Controls der frmProcess auf Public gestellt? Der Code den du ausführst um in frmProcess etwas anzuzeigen, würde ich auch dort (oder ganz in eine andere Klasse ausgelagert) platzieren und nicht in der aufrufenden Form. Bei Bedarf gib beim instanzieren der frmProcess einige Werte (Properties) mit.
    "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

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

    Moin!

    den TryReport habe ich oben entfernt und Zeile 27 ergänzt wo der Counter hochgezählt wird.

    Threading/Backgroundworker - habe ich noch nicht getestet, da mir diese Begriff noch völlig unbekannt sind und ich somit erst nachlesen muss.

    Gruß Jan
    Moin!

    ich habe mir das mit dem Backgroundworker einmal angesehen in dem Film:

    Dort gibt es einen Dialog mit Prozessbar aus dem heraus der Backgroundworkerprozess gestartet wird. Bei mir ist es genau umgekehrt - es ein Dialog mit Prozessbar und Cancel-Button gestartet werden.

    Geht das auch - nur einmal als Frage voraus bevor ich mir den Code verbaue.

    Gruß Jan
    @jan99 Ein Dialog muss im selben Thread wie Dein Hauptfenster laufen, daher ist es egal. wo der BGW gestartet wird. Dieser läuft dann in einem anderen Thread.
    Der Rest geht dann über Events.
    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!