Problem mit Form_Shown() und Fading Effekt

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Petersilie.

    Problem mit Form_Shown() und Fading Effekt

    Hallo Leute,

    Beim laden der Form1, prüfe ich ob ein bestimmter Ordner existiert,
    falls nicht, erstelle ich ihn.

    Wurde der Ordner erstellt, wird ein Bool True und dadurch wird dann ein Sub aufgerufen.
    Der Sub erstellt eine Form und fügt 2 Labels hinzu mit Text.
    Die Form faded dann nach kurzer Zeit weg.

    Sie dient dazu, den Nutzer zu informieren, dass ein Ordner erstellt wurde und was dort reinkommt.

    Problem ist:
    Form1 lädt nicht komplett, Labels sind nicht sichtbar zum Zeitpunkt der Erstellung der neuen Form...
    Das ganze sieht dadurch recht unschön aus.

    Hier mein bisheriger Code:

    VB.NET-Quellcode

    1. '//Fading Effekt für Info Form
    2. Private Sub fading_Form(ByVal formToFade As Form)
    3. For i As Integer = 90 To 10 Step -1
    4. formToFade.Opacity = i / 100
    5. formToFade.Refresh()
    6. Threading.Thread.Sleep(50)
    7. Next
    8. formToFade.Close()
    9. End Sub
    10. '//Erzeugt Form mit Controls
    11. '//Zeigt dem Nutzer an, dass ein Ordner erstellt wurde
    12. Private Sub create_Form_to_Inform_User(ByVal user As String)
    13. Dim tempForm As Form = New Form
    14. Dim infoLbl As Label = New Label
    15. Dim infoLbl_2 As Label = New Label
    16. tempForm.Top = 0
    17. tempForm.Left = 0
    18. tempForm.StartPosition = FormStartPosition.CenterScreen
    19. tempForm.Width = 600
    20. tempForm.Height = 200
    21. tempForm.Opacity = 0.99
    22. infoLbl.Top = 25
    23. infoLbl.Left = 25
    24. infoLbl.AutoSize = True
    25. infoLbl.Text = "Der Ordner 'Angebote_" & user & "' wurde in '\Dokumente' angelegt."
    26. infoLbl_2.Top = 50
    27. infoLbl_2.Left = 25
    28. infoLbl_2.AutoSize = True
    29. infoLbl_2.Text = "In diesem Ordner werden alle Ihre erstellten Angebote automatisch gespeichert!"
    30. tempForm.Controls.Add(infoLbl)
    31. tempForm.Controls.Add(infoLbl_2)
    32. tempForm.Show()
    33. fading_Form(tempForm)
    34. End Sub
    35. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    36. 'Threading.Thread.Sleep(500)
    37. Dim user() As String = Environ("Userprofile").Split(".")
    38. If boolFolderCreated Then create_Form_to_Inform_User(UCase(Microsoft.VisualBasic.Left(user(1), 1)) & Microsoft.VisualBasic.Right(user(1), Len(user(1)) - 1))
    39. End Sub



    Ich rufe die Subs ja erst auf, nachdem die Form1 angezeigt wurde... also nachdem alles darauf geladen wurde.
    Die Form1 wird trotzdem erst nach durchlauf des obigen Codes komplett dargestellt.
    Woran liegt das?
    "Woran lioegt das?" FFV (Frage mit falschen Voraussetzungen), zumindest bei mir. Ich musste zwar bei mir in Form1_Shown den Code auf create_Form_to_Inform_User("Test") zusammenstauchen, aber dann werden gleichzeitig meine Hauptform (im Hintergrund) und die neue (vor der Hauptform) angezeigt, welche langsam verschwindet. Das war doch der Plan, oder?
    btw: VisualBasic-Namespace und Option Strict Off - eine gern gesehene Kombi im Forum :|
    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.

    Petersilie schrieb:

    aber das ganze soll eben nicht simultan laufen
    sondern wann? Mit wieviel Verzögerung? Oder nach welchem Ereignis?
    Ja, Option Strict On ist genau dafür da. Ohne dies wird das Progrmm immer versuchen, irgendwelche Datentypen in andere zu verwandeln, mit Biegen und Brechen. Irgendwann wird Mus daraus. Und um sich klarzumachen, wo da die impliziten Konvertierungen stattfinden: Option Strict On. Und eben selber korrigieren. Damit einem auch nach 2 Wochen noch klar wird: "Oh, da ist ja ein Kartoffel, die ich gerade versuche in einen Goldbarren zu verwandeln. Hm, ob das so klappt?" Und mit dem VB-NS: Die sind halt in den Standardeinstellungen bei VS noch aktiviert, was man abändern sollte. Sonst arbeitet man mit uralten VB6-Funktionen und gewöhnt sich nie an die "guten" VB.Net-Funktionen, die nicht nur dazu geschaffen wurden, um sie zu nutzen, sondern weil man damit auch meist mehr machen 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.
    @Petersilie VB versucht, falschen Code in Grenzen zu verstehen und so zu behandeln, wie VB der Meinung ist, wie Du es gemeint haben könntest.
    Das geht sicher in 80% der Fälle gut. Aber irgend wo eben nicht.
    Strict On: Einmal kannst Du einem String einen numerischen Wert zuweisen: Label1.Text = 42. VB macht daraus: Label1.Text = "42".
    Das geht meist gut.
    Namespace VisualBasic: VB gestattet Dir (VB6-Kompatibilitätsranz), eine Form nach VB6-Muster aufzurufen: Form2.Show(). Da fängt es an echt böse zu werden, denn wenn Du mit Threeading arbeitest und die konkrete Instanz dieser Form brauchst, kommst Du da nicht ran und Du wunderst Dich, dass Deine Aktion nicht ausgeführt wird, weil sie in einer anderen Instanz ausgeführt wird, die Du aber nicht zu sehen kriegst. Gugst Du hier.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @VaporiZed
    Nachdem die Form1 komplett geladen und angezeigt wird.
    Das, dachte ich, regelt das Form1_Shown() Event.
    Tut es aber anscheinend nicht, denn die Labels werden eben nicht angezeigt...
    Ich hatte es mal beim Start des Shown() Events mit Sleep versucht, aber das hat nur dazu geführt dass die Label noch länger nicht sichtbar sind.

    MSDN sagt:
    Tritt immer dann ein, wenn das Formular erstmalig angezeigt wird.

    msdn.microsoft.com/de-de/libra…ang=csharp#code-snippet-1

    Ich vermute also mal, das es dort um die Form als Form geht und nicht um die Controls auf der Form
    und er deshalb die Label nicht anzeigt.

    Ok vielen Dank :)
    Habe mir gerade im Forum auch nochmal die Beiträge zum Thema Option Strict und VB Namespace angeschaut.
    Werde meine Fehler die Tage ausmerzen ;)

    @RodFromGermany
    Danke für die Erklärung und den Link :)
    Werde meinen Code von VB6 befreien.
    @Petersilie: Lad mal bitte Dein Projekt bereinigt (ohne bin- und obj-Ordner) hoch. Ich kann den Fehler nicht nachvollziehen. Auch wenn ich Labels etc. auf meiner Hauptform habe, werden die vollständig angezeigt, bevor die fading-Form gezeigt wird. Werden bei Dir noch kiloweise Daten in Form1_Load und Form1_Shown in die Hauptform geladen?
    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.
    @VaporiZed
    Habe das ganze gerade mal ohne Debugger ausprobiert... da läuft es flüssig durch.
    Wenn ich es mit Debugger laufen lass, dann nicht.

    Ich lade Daten aus einer Textdatei in eine DataTable, aber das ist eigentlich alles.
    Viele Daten sind das auch nicht, vielleicht 16 oder 17 Zeilen.