Form Sauberer laden

  • VB.NET
  • .NET (FX) 4.0

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    N bisken wenig Info. Passiert mit der ProgressBar vor dem Nutzen des Programms was? Hast Du Code im Form_Shown-EventHandler?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    xX-Nick-Xx schrieb:

    das alles gleichzeitig geladen wird, wie könnte ich das am besten machen?

    Gleichzeitig geht nicht (sofern nicht async, und dass ist beim Laden von Controls kritisch). Nur nacheinander.

    Was passiert alles bei dir beim Laden? Und wann genau lädst du? Zeig doch mal deinen entsprechenden Code, dann braucht hier keiner rum raten.

    horstfh schrieb:

    Setze an den Anfang von Form_Load die Zeile Me.show
    Was soll das bringen?
    "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
    Wie gesagt, er zeit erst die form an und dann den rest (Label,Progressbar etc) kann man dich nicht irgendwie Synchron laden?

    EDIT:
    Das mein ich (Siehe Bild)

    Code:

    VB.NET-Quellcode

    1. ​If MyBar.Value = 300 Then
    2. Mod_Studio.Show
    3. Timer1.Enabled = False
    Bilder
    • Unbenannt.png

      18,14 kB, 912×594, 171 mal angesehen

    Dafuq? Sorry, aber der Code sagt gar nix aus. Wo wird jener Code aufgerufen? In welcher Sub? Was ist MyBar.Value? Was macht der Timer? Ist Mod_Studio Dein FormName? Warum muss man sowas per Show explizit zeigen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Pascalony und Vaporized

    Die Form wird geladen und nach dem kompletten Laden gezeigt.
    Mit der Zeile

    Me.Show

    wird der Zeigen-Vorgang vorgezogen

    Ihr solltet Euch die Mühe machen mit einem kleinen Programm mit
    einer Schleife die Wirkung zu überprüfen
    Nehmt doch mal

    For M = 1 To 1000000000000 : Next

    in Form_Load. Deaktiviert die von mir vorgeschlagene Zeile. Bitte etwas Geduuuuld!!!
    Und dann mit aktivierter Zeile.

    Man sollte nicht nur klug reden. Besser ist ausprobiern.

    Gute Nacht!
    Hi Nick,

    Die Zeile

    Quellcode

    1. Me.Show

    in der Form_Load-Prozedur einfügen.

    Habe zum Test ein neues Projekt erstellt und dann die Zeile auskommentiert eingefügt:

    Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. ' Me.Show()
    3. For M = 1 To 10000000000: Next
    4. End Sub


    Starten. Dann kannst Du warten.

    Ohne Kommentarzeichen ist die Form direkt da.

    Gruß Horst

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

    @xX-Nick-Xx Was passiert vom Show() / ShowDialog()-Befehl im Konstruktor, im .Load- und im .Shown-Event?
    Hantierst Du mit großen Datenmengen oder so was?
    Das schiebe in einen Thread, dann wird die Form sofort angezeigt.
    =====
    @horstfh Was soll das?
    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!

    RodFromGermany schrieb:



    @xX-Nick-Xx Was passiert vom Show() / ShowDialog()-Befehl im Konstruktor, im .Load- und im .Shown-Event?
    Hantierst Du mit großen Datenmengen oder so was?
    Das schiebe in einen Thread, dann wird die Form sofort angezeigt.
    =====


    Sein Bild zeigt, dass es wohl um umfangreichere Grafikaktionen geht.

    @horstfh Was soll das?


    Siehe meine Antwort vorher.

    Gruß Horst
    @horstfh

    Dein Code erzwingt, dass die Form angezeigt wird, bevor diese fertig geladen wurde. Die Controls sind nicht komplett drauf (nur weiße Kästen) und das ganze Teil hängt während das Laden noch nicht abgeschlossen wurde. Was passiert, wenn ich im Shown-Event auch noch Dinge mache? Das ist doch keine Lösung. Ganz im Gegenteil finde ich es so schlimmer als vorher.

    @xX-Nick-Xx
    Wenn du im Load-Event deiner Form irgend welche Dinge tust, wird das alles gemacht bevor deine Form angezeigt wird. Poste dich mal bitte die gesamte Methode (inkl. Signatur) die das "Laden" macht.

    Mein Vorgehen:
    1. Wichtige Daten laden
    2. Form anzeigen
    3. Ggf. Daten bei Bedarf nachladen

    Rechenintensive Dinge werden nach Möglichkeit async ausgeführt, teils ohne await, je nach Fall.
    "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

    horstfh schrieb:

    Siehe meine Antwort vorher.
    Jou.
    Was soll das?
    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!
    Oftmals werden Controls deutlich schneller geladen, wenn doubleBuffered aktiviert ist. Auch wird alles gleichzeitig dargestellt und nicht nach und nach aufgebaut.

    Sollte bei dir auch helfen:
    docs.microsoft.com/en-us/dotne…ng-for-forms-and-controls
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Hi,
    Die Frage wurde gestellt: Was solls?
    Nun. Nick will eine Progressbar anzeigen, wohl damit der Benutzer nicht ohne eine Info länger warten muss.
    Da kam mir die Idee mit der Anzeige der Form.
    Das führte zu vielen Bemerkungen.
    Das Einzige was mich nachdenken ließ war der Hinweis von MrMo:
    Dein Code erzwingt, dass die Form angezeigt wird, bevor diese fertig geladen wurde. Die Controls sind nicht komplett drauf (nur weiße Kästen) und das ganze Teil hängt während das Laden noch nicht abgeschlossen wurde. Was passiert, wenn ich im Shown-Event auch noch Dinge mache? Das ist doch keine Lösung. Ganz im Gegenteil finde ich es so schlimmer als vorher.

    Hier jetzt ein kleines Programm mit 30 Button auf der Form. Dazu ein Label mit "Bitte warten" und die Progressbar.
    Spoiler anzeigen

    Public Class Form1
    Private LaufMax As Integer = 5000
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Show()
    Me.Refresh()
    ButtonAktivieren(False)
    ProgressBar1.Maximum = LaufMax
    For M = 1 To LaufMax
    Application.DoEvents()
    ProgressBar1.Value = M
    ProgressBar1.Refresh()
    Next
    Label1.Visible = False
    ProgressBar1.Visible = False
    ButtonAktivieren(True)
    ButtonHandlerAdd()
    End Sub

    Sub ButtonAktivieren(OK As Boolean)
    For Each ctrl As Control In Me.Controls
    'If TypeOf (ctrl) Is Button Then
    ctrl.Enabled = OK
    'End If
    Next
    End Sub

    Sub ButtonHandlerAdd()
    For Each ctrl As Control In Me.Controls
    If TypeOf (ctrl) Is Button Then
    AddHandler ctrl.Click, AddressOf ClickButtons
    End If
    Next
    End Sub

    Private Sub ClickButtons(ByVal sender As Object, ByVal e As EventArgs)
    Dim BTN As Button = DirectCast(sender, Button)
    Select Case BTN.Text
    'Case "Button1"
    ' Aktion
    Case Else
    MsgBox(BTN.Text & " wurde geklicked!")
    End Select
    End Sub

    End Class


    Jetzt kann die Diskussion weiter gehen!

    Gruß
    Horst

    horstfh schrieb:

    Application.DoEvents()


    Das ist ein absolutes No-Go.

    horstfh schrieb:

    MsgBox(BTN.Text & " wurde geklicked!")


    Nicht so schlimm wie DoEvents() aber MessageBox wäre hier besser.
    Generell ist es kein sauberer Code die geladene Form im Load-Event aufzurufen, zu refreshen und danach noch Controls einzeln zu refreshen. Abgesehen davon refresht du die Progressbar extrem oft (5000 Mal!!!!), sollte das nicht flackern/schlechte Performence bringen?
    Wie @ThuCommix gesagt hat, wäre das Problem mit WPF zu lösen denke ich.