Message- bzw. Infobox automatisch nach bestimmter Zeit ausblenden

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von stevez.

    Message- bzw. Infobox automatisch nach bestimmter Zeit ausblenden

    Wenn eine Datei (meine Datenbank) gesperrt ist, soll weder gelesen noch geschrieben werden. Wird dies von einer anderen Programminstanz (läuft auf mehreren VMs gleichzeitig) dennoch versucht, so soll eine Art Infobox/Messagebox mit einer kurzen Message ohne Buttons aufpoppen, welche einfach kurz von 5 Sekunden runterzählt und den Vorgang dann nochmal versucht. Hat es z.B. nach 10 Vorgängen immer noch nicht geklappt, kann dann eine normale Messagebox, welche auf eine Usereingabe wartet, geöffnet werden.

    -> Keine Usereingabe ist notwendig, da die Tests direkt nach dem fertigen Testdurchlauf eingelesen werden (d.h. auch wenn keiner am Rechner sitzt. Für den Fall, dass dennoch einer vor dem Rechner sitzt, soll besagte Info gezeigt werden.
    Dann bau Dir einfach eine MessageInfoBox als modalen Dialog.
    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!

    stevez schrieb:

    also einfach eine eigene Form dafür bauen und mit Timer aufrufen?
    Ja und Nein.
    Der Timer verbleibt innerhalb dieser Form, die Wartezeit ist ein Aufruf-Property, sowie der 1. Text und der richtige MessageBox-Text.
    Das kann alles da drin 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!
    Habs jetzt mal so dargestellt:

    VB.NET-Quellcode

    1. Public Class RetryDialogBox
    2. Dim sec As Integer = 5
    3. Private Sub Timer_retry_Tick(sender As System.Object, e As System.EventArgs) Handles Timer_retry.Tick
    4. If sec = 0 Then
    5. Timer_retry.Stop()
    6. Me.Close()
    7. Else
    8. sec -= 1
    9. lbl_retry.Text = "Retry in " & sec & " Sekunden."
    10. End If
    11. End Sub
    12. End Class


    In der MainForm:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DatenbankSpeichern()
    2. 'Anzahl automatischer Speicherversuche
    3. For i = 0 To 10
    4. ManuellerRetry:
    5. If _fiDataset.IsReadOnly Then
    6. 'Wenn Zugriff erlaubt, aus Schleife springen und Datenbank speichern
    7. Exit For
    8. ElseIf i = 10 Then
    9. 'Wenn der Zugriff auf das Dataset gesperrt ist und retry = 10, Userabfrage
    10. Select Case MsgBox("Der Datenbankzugriff ist aufgrund der Berechtigungsprerre durch eine andere Programminstanz mehrmalig nicht möglich gewesen. Möchten Sie das Speichern erneut versuchen?", _
    11. MsgBoxStyle.RetryCancel Or _
    12. MsgBoxStyle.Information)
    13. Case MsgBoxResult.Retry
    14. GoTo ManuellerRetry
    15. Case MsgBoxResult.Cancel
    16. Exit Sub
    17. End Select
    18. ElseIf RetryDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
    19. 'Wenn der Zugriff auf das Dataset gesperrt ist und retry < 10, Dialog mit Timer zeigen und erneut versuchen
    20. End If
    21. Next


    --> Hier besteht jetzt noch das Problem der Abfrage der Dateiberechtigung (Thema: [VB 2010] Dateizugriff sperren / wieder freigeben )
    Bilder
    • ScreenShot001.jpg

      6,11 kB, 496×59, 243 mal angesehen

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

    die Sub heißt DatenbankSpeichern - aber ich sehe keinerlei Code darin, der damit in Verbindung zu bringen wäre.

    Nur eine komische Schleife.

    Goto ist in diesem Falle absolut überflüssig, da hast du ungenau gelesen.
    ich schrieb: "Schreib eine Schleife,...", und nicht "Schreib eine Sch...." ;)

    ErfinderDesRades schrieb:

    die Sub heißt DatenbankSpeichern - aber ich sehe keinerlei Code darin, der damit in Verbindung zu bringen wäre.
    Liegt daran, dass nur der obere Teil (der in diesem Threat relevant ist) gepostet ist.

    Zum Code, ist der so besser?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DatenbankSpeichern(ByVal zaehler As Integer)
    2. While _fiDataset.IsReadOnly AndAlso _
    3. RetryDialog.ShowDialog() = Windows.Forms.DialogResult.OK
    4. 'Während: Datei = Readonly AND Dialogbox gibt ein OK zurück
    5. If zaehler < 10 Then
    6. 'Wenn Zähler kleiner 10, dann erneut versuchen
    7. zaehler += 1
    8. Else
    9. 'Ansonsten Benutzerabfrage
    10. Select Case MsgBox("Der Datenbankzugriff ist aufgrund der Berechtigungsprerre durch eine andere Programminstanz nicht möglich gewesen. Erneut versuchen?", _
    11. MsgBoxStyle.RetryCancel Or _
    12. MsgBoxStyle.Information)
    13. Case MsgBoxResult.Retry
    14. DatenbankSpeichern(10)
    15. Exit Sub
    16. Case MsgBoxResult.Cancel
    17. Exit Sub
    18. End Select
    19. End If
    20. End While
    21. 'Backup anlegen
    22. DbBackup(False)
    23. 'Datenbank speichern
    24. Try
    25. HauptDataSet.Save(Me)
    26. Catch ex As Exception
    27. MsgBox(String.Format("Das DataSet konnte nicht gespeichert werden!{0}{0}Fehlermeldung: {1}", vbNewLine, ex.ToString), _
    28. MsgBoxStyle.Exclamation, _
    29. "Fehler")
    30. Return
    31. End Try
    32. If TabMenue.SelectedTab Is tab_testumgebung Then SetSuiteCheckBoxes()
    33. End Sub
    iwie scheints da einen REtry-Dialog zu geben, und wenn der 10(!) mal fehlschlägt, kommt noch eine Retry-Messagebox, die ihm noch 10 Runden "anbietet". Wird ihm das nicht auf die Nerven fallen? :cursing:

    also ich hätte ja gedacht, ein Retry kann selber, ohne immer neu UserEingabe zu verlangen - Retry-Dialog soll weg.
    Auch Kommentation und Benamung recht grauselig: wassis Zäehler - was wird denn da gezählt?

    Also wenn man die Methode anguckt, fragt man sich nur: Warum ist die so irre kompliziert, vom Methoden-Namen her würde ich einen Einzeiler erwarten:

    VB.NET-Quellcode

    1. HauptDataSet.Save(Me)
    und fertig.

    Aber totale Trivialitäten sind kommentiert:

    VB.NET-Quellcode

    1. If zaehler < 10 Then
    2. 'Wenn Zähler kleiner 10, dann erneut versuchen
    3. zaehler += 1
    (Sowas formuliere ich übrigens lieber in einer For-Schleife)

    ErfinderDesRades schrieb:

    iwie scheints da einen REtry-Dialog zu geben, und wenn der 10(!) mal fehlschlägt, kommt noch eine Retry-Messagebox, die ihm noch 10 Runden "anbietet". Wird ihm das nicht auf die Nerven fallen?

    also ich hätte ja gedacht, ein Retry kann selber, ohne immer neu UserEingabe zu verlangen - Retry-Dialog soll weg.
    Auch Kommentation und Benamung recht grauselig: wassis Zäehler - was wird denn da gezählt?


    vom Threatbeginn schrieb:

    Hat es z.B. nach 10 Vorgängen immer noch nicht geklappt, kann dann eine normale Messagebox, welche auf eine Usereingabe wartet, geöffnet werden


    --> es soll 10 mal (=zaehler) automatisch durchlaufen (mit angezeigter Dialogbox, welche nach 5sec ein OK-Dialogresult zurückgibt). D.h. erst nach ca. 50s kommt, sollte das Speichern immer noch nicht funktioniert haben, eine Benutzerabfrage, da es sinnlos wäre, das Speichern die nächsten Stunden alle 5 Sekunden erneut zu probieren. Sieht der User dann diese Message, so kann er die Ursache für das dauerhafte "Readonly" des Datasets suchen und danach die Speicherung erneut vornehmen. Dieser Dialog wird nur 1x angezeigt, wenn es dann funktioniert, da sehe ich keine Nervenaufreibung ;)

    Vielleicht ist es so verständlicher:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DatenbankSpeichern(ByVal wiederholungen As Integer)
    2. While Not _fiDataset.IsReadOnly AndAlso _
    3. RetryDialog.ShowDialog() = Windows.Forms.DialogResult.OK
    4. 'Während: Datei = Readonly AND Dialogbox gibt ein OK zurück
    5. If wiederholungen > 0 Then
    6. 'Wenn Wiederholungen stattfinden sollen, dann erneut versuchen und Zähler herabsetzen
    7. wiederholungen -= 1
    8. Else
    9. 'Ansonsten Benutzerabfrage
    10. Select Case MsgBox("Der Datenbankzugriff ist aufgrund der Berechtigungsprerre durch eine andere Programminstanz nicht möglich gewesen. Erneut versuchen?", _
    11. MsgBoxStyle.RetryCancel Or _
    12. MsgBoxStyle.Information)
    13. Case MsgBoxResult.Retry
    14. DatenbankSpeichern(0)
    15. Exit Sub
    16. Case MsgBoxResult.Cancel
    17. Exit Sub
    18. End Select
    19. End If
    20. End While
    21. 'Backup anlegen
    22. DbBackup(False)
    23. 'Datenbank speichern
    24. Try
    25. HauptDataSet.Save(Me)
    26. Catch ex As Exception
    27. MsgBox(String.Format("Das DataSet konnte nicht gespeichert werden!{0}{0}Fehlermeldung: {1}", vbNewLine, ex.ToString), _
    28. MsgBoxStyle.Exclamation, _
    29. "Fehler")
    30. Return
    31. End Try
    32. If TabMenue.SelectedTab Is tab_testumgebung Then SetSuiteCheckBoxes()
    33. End Sub
    hmm

    VB.NET-Quellcode

    1. While _fiDataset.IsReadOnly AndAlso _
    2. RetryDialog.ShowDialog() = Windows.Forms.DialogResult.OK
    ist doch eine schleife, die diesen Dialog immer wieder öffnet - oder?

    PS - das mittm Zäehler ist so viiel besser :thumbsup:
    (aber noch immer denke ich, dassis eher ein fall für eine For-Schleife denn für eine EndRekursion)

    ErfinderDesRades schrieb:

    ist doch eine schleife, die diesen Dialog immer wieder öffnet - oder?

    Ein reiner Info-Dialog, der lediglich anzeigt, dass das Dataset gesperrt ist, und dass in 5 Sekunden (zählt runter) das Speichern erneut versucht wird. Erfordert keine Usereingabe und dient nur für den seltenen Fall, dass während des Einlesens der User vor dem Rechner sitzt, über den "Fehler" informiert wird. Ist also eher eine Art wait(50) als eine Messagebox/Dialogbox.
    Aber dieser Dialog öffnet und schließt sich doch 10 mal hinternander.

    Ich würd das iwie einfacher aufziehen - v.a. ohne Rekursion:
    zunächstmal versuchter zu speichern - ohne jedes Feedback, denn normal geht das ja schnell.
    Beim Retry geht dann ein Form auf, wo der User den Speicher-Vorgang canceln kann. Solange er nicht cancelt wird alle 5s das Speichern versucht, meinetwegen bis zu 20 mal.
    Dann cancelt er halt selber.
    Ich würde dann auch abstürzen lassen, damit der User unignorierbar informiert ist, dass das Speichern fehlgeschlagen ist.

    Also bei mir gäbs nur ein Retry-Form, und das hätte auch diese Funktion - keine zusätzliche Retry-Messagebox. Darauf ein Timer, der alle 5s probiert, und ein angezeigter CountDown oder CountUp - is ja egal. Wenn der User cancelt ist halt gecancelt, wenn der CountDown ganz durchläuft - Exception.
    Das wäre eine andere Möglichkeit, da hast du recht. Nur habe ich dazu vorher noch eine Frage: Wie kann ich das Hauptdataset, welches in der MainForm "existiert", von einer anderen Form aus speichern?

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

    in der MainForm sichere ich das Hauptdataset ja mit der Zeile

    VB.NET-Quellcode

    1. HauptDataSet.Save(Me)
    Läuft das dann in der anderen Form damit?

    VB.NET-Quellcode

    1. MainForm.HauptDataSet.Save(MainForm)


    edit: funktioniert.

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