Windows form mit während Datei kopiert wird Label weißer Balken

  • VB.NET

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

    Windows form mit während Datei kopiert wird Label weißer Balken

    Hi. Bin mittlerweile am Verzweifeln. Ich habe eine etwas größere Datei in den Ressourcen und möchte diese gerne kopieren. Wenn der Kopiervorgang fertig ist, kommt eine MsgBox und so weiter. Das habe ich auch alles schon fertig. Problem ist nur: Es soll eine Form kommen mit "Datei wird kopiert... Bitte warten." wenn die Datei kopiert wird. Die Form habe ich schon fertig designed. Hier der Code wenn auf den Kopierbutton gedrückt wird. (Kopiervorgang.show ist hier die Form mit der Meldung "Bitte warten.").

    VB.NET-Quellcode

    1. Kopiervorgang.Show()
    2. IO.File.WriteAllBytes(copy, My.Resources.Start)
    3. If My.Computer.FileSystem.FileExists(copy) Then
    4. Kopiervorgang.Hide()
    5. If MsgBox("Das Setup von Winamp wurde kopiert und kann nun gestartet werden." & vbCrLf & " " & vbCrLf & "Klicken Sie auf Ok um die Installation von Winamp zu starten." & vbCrLf & " " & vbCrLf & "Klicken Sie auf abbrechen, um den Vorgang zu beenden und zum vorherigen Fenster zurückzukehren.", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "Installation") = MsgBoxResult.Ok Then
    6. Process.Start(copy)
    7. End If
    8. Exit Sub
    9. End If


    Wenn ich jetzt auf den Kopierbutton drücke, erscheint die Form zwar, aber die Schrift ist nur ein weißer Balken (total verbuggt). Und erst wenn die Datei vollständig kopiert wurde, sind die Label in der Form nicht mehr verbuggt und es kommt auch schon die Msgbox daher. Und ob ich den Kopiervorgang.show Befehl jetzt vor oder hinter den Copy Befehl setze ändert sich auch nichts. Hier ein Screenshot (Der weiße Balken ist das verbuggte Label)
    Bilder
    • fn mdbgdsffdfd.PNG

      15,61 kB, 614×318, 151 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Simkoo“ ()

    Das liegt wahrscheinlich daran das durch den Kopiervorgang das Programm einfriert und deswegen nicht ordentlich angezeigt wird.
    Ansonsten kannst du Im Click Event "Kopiervorgang.Show()" lassen den rest solltest du dann ins Shown Event der Form schreiben.
    Sodass der Kopiervorgang erst dann startet wenn die Form komplett geladen wurde.

    Mfg
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    Wenn du mit FW4.5 arbeitest ist das sehr einfach zu lösen.
    Allerdings müsstest die ganze hier angedeutete Methode posten.

    Die ganze - nicht nur ein paar verlorene Zeilen ohne Anfang und Ende.

    Btw - was soll eigentlich Zeile#5? Ob die Datei existiert, brauchst du doch nicht testen, wenn du sie 2 Zeilen weiter oben selbst erzeugt hast.

    ErfinderDesRades schrieb:

    Wenn du mit FW4.5 arbeitest ist das sehr einfach zu lösen.
    Allerdings müsstest die ganze hier angedeutete Methode posten.

    Die ganze - nicht nur ein paar verlorene Zeilen ohne Anfang und Ende.

    Btw - was soll eigentlich Zeile#5? Ob die Datei existiert, brauchst du doch nicht testen, wenn du sie 2 Zeilen weiter oben selbst erzeugt hast.

    Das mit der Abfrage ist ja dafür dass die "Bitte warten. .." Form geschlossen wird wenn die Datei vorhanden ist oder ganz kopiert wurde.
    Ich kann dir ja gerne den ganzen Projektordner geben. Außerdem ich glaube du verstehst mein Vorgehen nicht ganz. Denn 1. wird die Datei kopiert. Dann kommt die Form, mit dem Label "Bitte warten..". Und wenn die Datei vollständig kopiert wurde (Die If Abfrage über die du dich wunderst), schließt sich das bitte warten Fenster und die msgbox kommt. Das hat auch alles wunderprächtig funktioniert, nur ist das Label in der bitte warten Form weiß.
    Auch beim Lösungsvorschlag von TheTrust. Der Kopiervorgang starten Button öffnet die bitte warten Form. Diese wiederrum kopiert die Datei beim shown-Event. Hier der Code:
    Der Kopiervorgang starten Button startet die bitte warten Form:

    VB.NET-Quellcode

    1. Kopiervorgang.Show()

    Dann der Kopiervorgang mit in der bitte warten Form mit dem Shown Event:

    VB.NET-Quellcode

    1. IO.File.WriteAllBytes(copy, My.Resources.Start)
    2. If My.Computer.FileSystem.FileExists(copy) Then
    3. Me.Hide()
    4. If MsgBox("Das Setup von Winamp wurde kopiert und kann nun gestartet werden." & vbCrLf & " " & vbCrLf & "Klicken Sie auf Ok um die Installation von Winamp zu starten." & vbCrLf & " " & vbCrLf & "Klicken Sie auf abbrechen, um den Vorgang zu beenden und zum vorherigen Fenster zurückzukehren.", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "Installation") = MsgBoxResult.Ok Then
    5. Process.Start(copy)
    6. Exit Sub
    7. End If
    8. IO.File.Delete(copy)
    9. Me.Close()
    10. End If


    Edit: Ohne die die If Abfrage würde die MSgbox mit "Datei erfolgreich kopiert" Ja direkt kommen wenn man auf den Button drückt, obwohl die Datei in wirklichkeit noch kopiert wird.
    Hier zum besseren Verständnis die Deklarationen:

    VB.NET-Quellcode

    1. Dim userdir As String = Environment.GetEnvironmentVariable("USERPROFILE")
    2. Dim copy As String = userdir & "\AppData\Local\Temp\Start.exe"

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Simkoo“ ()

    IO.File.WriteAllBytes kopiert die Daten synchron. Das heißt es geht erst weiter wenn die Aktion abgeschlossen ist.
    Daher kann man davon ausgehen, dass die Datei im Anschluss existiert.

    Was du benötigst ist das von EDR bereits angedeutete Verfahren mit Async und Await.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Naja, ich wiederhole jetzt mal seinen Post.

    GGf. liest du ihn jetzt und machst das was drin steht:


    Wenn du mit FW4.5 arbeitest ist das sehr einfach zu lösen.Allerdings müsstest die ganze hier angedeutete Methode posten.Die ganze - nicht nur ein paar verlorene Zeilen ohne Anfang und Ende.Btw - was soll eigentlich Zeile#5? Ob die Datei existiert, brauchst du doch nicht testen, wenn du sie 2 Zeilen weiter oben selbst erzeugt hast.
    Das ist meine Signatur und sie wird wunderbar sein!
    Naja, die Methode würde reichen. Falls du nicht weißt was das ist...

    Das was mit Sub (oder Function) anfängt und End Sub (oder Function) aufhört in dem der entsprechende Teil von dem was du gepostet hast steht.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Ok, gut.
    Die Deklarationen für die Kopierbefehle:

    VB.NET-Quellcode

    1. Dim userdir As String = Environment.GetEnvironmentVariable("USERPROFILE")
    2. Dim copy As String = userdir & "\AppData\Local\Temp\Start.exe"


    Hier die Methode für den Kopiervorgang starten Button:

    VB.NET-Quellcode

    1. Private Sub ButtonInstalliereWinamp_Click(sender As System.Object, e As System.EventArgs) Handles ButtonInstalliereWinamp.Click
    2. Kopiervorgang.Show()
    3. End Sub


    Hier die Kopiermethode mit der "Bitte warten..." Form mit dem Shown Event (nach TheTrust):

    VB.NET-Quellcode

    1. Private Sub Kopiervorgang_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    2. IO.File.WriteAllBytes(copy, My.Resources.Start)
    3. If MsgBox("Das Setup von Winamp wurde kopiert und kann nun gestartet werden." & vbCrLf & " " & vbCrLf & "Klicken Sie auf Ok um die Installation von Winamp zu starten." & vbCrLf & " " & vbCrLf & "Klicken Sie auf abbrechen, um den Vorgang zu beenden und zum vorherigen Fenster zurückzukehren.", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "Installation") = MsgBoxResult.Ok Then
    4. Process.Start(copy)
    5. Me.Close()
    6. End If
    7. IO.File.Delete(copy)
    8. Me.Close()
    9. End Sub

    VB.NET-Quellcode

    1. Imports System.Threading.Tasks
    2. '...
    3. Private Async Sub ButtonInstalliereWinamp_Click(sender As Object, e As EventArgs) Handles ButtonInstalliereWinamp.Click
    4. Kopiervorgang.Show() 'WarteForm anzeigen
    5. Await task.Run(Sub() IO.File.WriteAllBytes(copy, My.Resources.Start))
    6. If MsgBox("Das Setup von Winamp wurde kopiert und kann nun gestartet werden." & vbCrLf & " " & vbCrLf & "Klicken Sie auf Ok um die Installation von Winamp zu starten." & vbCrLf & " " & vbCrLf & "Klicken Sie auf abbrechen, um den Vorgang zu beenden und zum vorherigen Fenster zurückzukehren.", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "Installation") = MsgBoxResult.Ok Then
    7. Process.Start(copy)
    8. End If
    9. 'IO.File.Delete(copy)
    10. Kopiervorgang.Close() 'WarteForm schließen
    11. End Sub
    Die Form_Shown - Methode in deim Kopiervorgang-Form musste dafür auskommentieren - deren Inhalt gehört wie gezeigt ins ButtonClick, von dem die Geschichte ausgeht.