Countdown in der Art wie eine MessageBox Anzeigen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von PadreSperanza.

    Countdown in der Art wie eine MessageBox Anzeigen

    Ich habe eine Prozedur, die mehrere Dateien bearbeitet (immer andere Anzahl).
    Beim Start der Prozedur ist bekannt, wie viele Dateien zu bearbeiten sind.
    Ich würde da gerne einen Countdown anzeigen.
    Aber nicht an einer festen Stelle in der Form, sondern so wie eine MessageBox über der Form.
    Wie kann ich das am besten umsetzen?

    Elephant schrieb:

    Wie kann ich das am besten umsetzen?
    Bau Dir eine eigene Form dafür und zeige die nicht modal an (.Show()).
    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!
    Fast-Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Bin jetzt soweit das ich ein Variable habe die in Form2 ohne Fensterüberschrift, x zum schließen etc, angezeigt wird.

    Nur mit welchem Befehl schliesse ich aus Form1 die Form2 wieder?

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

    Elephant schrieb:

    Nur mit welchem Befehl schliesse ich aus Form1 die Form2 wieder?

    VB.NET-Quellcode

    1. frm.Close()
    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!
    Fast-Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Danke.

    Hier mal mein Beispiel Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Wert As Integer
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim Countdown As New Form2
    5. Countdown.[UebergabeWert] = Wert
    6. Wert = 31
    7. Label1.Text = Wert
    8. Countdown.Show()
    9. MessageBox.Show("weiter")
    10. Countdown.Close()
    11. MessageBox.Show("Ende")
    12. End Sub
    13. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Property [UebergabeWert] As Integer
    3. Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. Me.Text = Nothing 'Kein Namen in der Tielleiste zusammen mit der Zeile darunter garkeine Titelleiste mehr da
    5. Me.ControlBox = False 'Kein X da und die anderen (Strick, Quadrat auch nicht da)
    6. Label1.Text = UebergabeWert
    7. End Sub
    8. End Class


    Beiträge zusammengefügt ~VaporiZed

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

    Elephant schrieb:

    falls nochmal jemand nach so etwas sucht.
    What :?:
    Solch suboptimalen Code kannst Du doch niemandem anbieten.
    Option Strict On :!:
    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!
    Fast-Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed
    Da hast du leider recht.
    Ich habe das jetzt in Mein Programm eingebaut und da hab ich nach dem
    Countdown.Show()
    natürlich kein
    MessageBox.Show("weiter")
    denn das Programm soll ja weiter arbeiten.
    Das sieht jetzt so aus das sich ein Fenster öffnet aber nur mit einem weißen Rechteck wo das Label ist aber ohne Text.

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

    @Elephant Mach da ein kleines Projekt draus (Strict On natürlich) und entwickle Dir so Deine kleine MessageBox.
    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!
    Du erstellst also Dein SubForm, welches Du mit DeinSubForm.Show() (oder eben DeinSubForm.Show(Me)) anzeigst. Danach kannst Du im Hauptform darauf zugreifen und dessen Inhalt ändern, z.B. mit DeinSubForm.Label1.Text = $"Es wird Datei {aktuellerDateiIndex} von insgesamt {Gesamtdateizahl} verarbeitet." Während also das Hauptprogramm die Daten abarbeitet, musst Du also den Inhalt des SubForms aktualisieren. Das Problem: Die Anzeige gerät dabei ins Hintertreffen, da die Dateiabarbeitung größere Priorität als die Anzeigenaktualisierung hat. Das kannst Du ändern, indem zu z.B. dazu aufforderst, dass das SubForm neu gezeichnet wird: DeinSubForm.Refresh()
    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.

    VaporiZed schrieb:

    dazu aufforderst, dass das SubForm neu gezeichnet wird: DeinSubForm.Refresh()

    Danke, das hat es gelöst.
    Nun habe ich noch ein kleines Schönheitsproblem.
    Form1 benötigt nicht den ganzen Bildschirm, lässt sich also z. B. nach rechts unten verschieben.
    Form2 taucht aber links oben auf, also vielleicht völlig außerhalb von Form1.
    Mit Me.Location = New Point(1200, 700) kann ich ja eine absolute Position festlegen.
    Kann man Abfragen an welcher Stelle Form1 angezeigt wird, denn dann könnte ich mir damit einen Wert ausrechnen an dem Form2 erscheint.
    Entweder du setzt auf der zweiten From Owner = MainForm und setzt bei den Show Optionen "Center Owner".

    Oder du nutzt:

    VB.NET-Quellcode

    1. form2.Top = form1.Top
    2. form2.Left = form1.Left


    also wenn du das zum Beispiel als Parameter übergibst und Form2:

    VB.NET-Quellcode

    1. public New(top as Double, left as Double)
    2. Me.Top = top
    3. Me.Left = left
    4. ...


    oder wenn du es aus der HauptForm setzen willst:

    VB.NET-Quellcode

    1. Dim frm2 as Form2 = new Form2
    2. frm2.Top = Me.Top
    3. ...

    @Elephant Mach .CenterParent, das sieht immer gut aus, wenn das Child kleiner ist.
    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!
    Vielen Dank für eure Tipps, so bin ich zu einer Lösung gekommen.

    Vielleicht habe ich ja etwas falsch gemacht.
    Me.CenterToParent() in Form2 sorgt dafür, dass Form2 in der mitte des Bildschirms auftaucht, egal wo Form1 ist.
    Habe das jetzt so gelöst das ich in Form1 Location.X und Location.Y in je einer Variablen speichere.
    Und die Variablen an Form2 übergebe und dort die Mitte von Form1 mit Berücksichtigung der Größe von Form2 berechne.
    Damit dann in Form2 Me.Location = New Point(Xpos, Ypos) dafür sorge das Form2 in der Mitte von Form1 auftaucht.
    Normalerweise ist Me.CenterToParent schon richtig. Aber dafür musst du deiner Form auch explizit sagen, wer sein Parent ist. Wenn du also Form zwei erstellst, musst du ihm auch sagen, dass Form eins sein Parent ist:

    VB.NET-Quellcode

    1. Form2.Parent = Form1
    <- Ignorieren und zum Post von VaporiZed scrollen-

    Dann sollte das CenterToParent auch funktionieren. Setzt du es nicht, weiß dein Programm ja gar nicht, wer der Parent ist, wo er sich also zentrieren soll und nimmt stattdessen das Anzeigegerät als Ausgangspunkt

    EDIT: Kann auch sein, dass du nicht Parent, sondern ParentForm setzen musst, damit der Effekt erzielt wird.. Da bin ich mir gerade nicht mehr sicher. Bin in WinForms nicht mehr so stark unterwegs. Das Äquivalent in WPF ist "Owner" und da funktioniert es so. Aber deshalb löse ich das auch immer mit den Werten Top und Left

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

    VB.NET-Quellcode

    1. SubForm.StartPosition = FormStartPosition.CenterParent
    2. SubForm.Show(Me)

    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.

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

    Das Hilfreich kannst Du wieder zurückziehen, das war von mir tatsächlich nur ne ungeprüfte (und damit unwahre) Vermutung.
    SubForm.StartPosition = FormStartPosition.CenterParent - funktioniert nur mit ShowDialog. Bei SubForm.Show() muss man innerhalb des SubForms im Load- oder Shown-EventHandler CenterToParent() aufrufen, sonst klappt es nicht. Aber funktioniert auch nur, wenn man auch das Parent des SubForms festgelegt hat.
    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.