x-Button des Windows abfragen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von LucaWelker.

    x-Button des Windows abfragen

    Hi,

    in der linken oberen Ecke der Windows gibt es den Cancel Button (weißen Kreuz auf rotem Grund), um das Fenster zu schließen.

    Wie kann ich im Form-Closing Event abfragen, ob mein Dialog auf diese Weise beendet wurde? Irgendwie finde ich dazu nix passendes!

    Oder gibt es ein Ereignis "Drücken des Cancel Buttons"? Auch da bin ich nicht fündig geworden.
    Im Form Closing-Event kannst du dir die Enumerationen des Event-Args "e" anschauen. Da ist alles was du brauchst.
    Nachher kannst du das abfangen und damit machen was du willst z.b. ne MessageBox mit "Wirklich Schließen" oder so.

    Bsp.:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    2. If MessageBox.Show("Wollen Sie das Programm wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then e.Cancel = True
    3. End Sub

    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Peter329 schrieb:

    Ereignis
    Frag e.CloseReason ab:
    Bilder
    • Close.png

      22,38 kB, 969×273, 258 mal angesehen
    • Close2.png

      20,88 kB, 1.025×221, 267 mal angesehen
    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!
    Also ich hab das mal ausprobiert:

    Private Sub frmRename_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing MsgBox(e.CloseReason) MsgBox(e.Cancel)

    Aber egal ob ich mit dem Cancel Button oder über Me.Close() aussteige - ich erhalte zurück:

    e.CloseReason = 3
    e.Cancel = False

    Mehr Auswahlmöglichkeiten finde ich in der Enumeration aber nicht. Ich würde das aber gern auseinanderhalten.
    Es gibt soweit ich weiß keinen Unterschied zwischen Close() und dem roten X-Button.
    Wenn das Programm allerdings abstürtzt müsstest du einen andere CloseReason erhalten.

    Aber wieso musst du zwischen den beiden Unterscheiden können?
    lg.

    LucaWelker
    Also mein Programm stürzt nicht ab. Hier ist das super einfache Coding:



    Private Sub frmRename_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

    MsgBox(e.CloseReason)
    MsgBox(e.Cancel)
    End Sub

    Private Sub cmdEnter_Click(sender As System.Object, e As System.EventArgs) Handles cmdEnter.Click
    strPromptInput = txtInput.Text.Trim()
    Me.Close()
    End Sub


    Für den Fall, dass der Cancel Button gedrückt wird, möchte ich einfach im Form_Closing Event

    strPromptInput = ""

    setzen.

    Das ist schon alles!

    Peter329 schrieb:

    Das ist schon alles!
    1. Machma Option Strict On.
    Meinst Du so was:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    2. If MessageBox.Show("Wirklich abbrechen?", "Nachfrage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then
    3. e.Cancel = True
    4. strPromptInput = ""
    5. End If
    6. End Sub
    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!
    Och Leute ... natürlich kann ich eine Zeile kopieren.

    Die Anweisung

    strPromptInput = ""

    darf im FormClosing Event aber nur ausgeführt werden, wenn der Cancel Button gedrückt wurde. Nicht aber bei "normalem" Ende, da muss die Eingabe natürlich erhalten bleiben. Und genau die Abfrage suche ich!

    Ich hab mir jetzt mit einem Schalter geholfen. Den setze ich auf True in der FormLoad Prozedur ... und in der cmdEnter Prozedur schalte ich den wieder aus. Damit habe ich eine Unterscheidung in der FormClosing Prozedur.

    "Und wenn man nicht mehr weiter kann, dann bringt man halt nen Schalter an!"

    Ich hätte das halt gern vermieden. Trotzdem vielen Dank an alle Ratgeber!
    Dann müsste das doch auch so gehen:

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    2. If MessageBox.Show("Wollen Sie das Programm wirklich beenden?", "Beenden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
    3. e.Cancel = False
    4. TextBox1.Clear()
    5. Else
    6. e.Cancel = True
    7. End If
    8. End Sub
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Ach so stimmt ja ... hier im Forum ist der Begriff "Schalter" ja nicht erlaubt! Also ich hab natürlich ein FLAG eingefügt.

    Also Flags sind im allgemeinen nicht erwünscht, weil sie das Debugging erschweren. Man muss ja immer erst mal feststellen, wie die gesetzt sind und bei zahlreichen Flags kann das abendfüllend werden.

    Aber schlau wie ich nun mal bin hab ich eine ganz einfach Lösung ohne (echtes) Flag gefunden, die ich künftig in solchen Fällen verwenden werde. Die Rückgabevariable wird zu Beginn in der Load Prozedur auf den Leerstring gesetzt und nur in der Enter Prozedur befüllt. Und damit kann ich in der rufenden Prozedur entsprechend reagieren. Das scheint mit eine saubere Lösung zu sein, die auch meinen ästhetischen Ansprüchen genügt.

    Nebenbei: Das neue Forum finde ich ein bissl gewöhnungsbedürftig. Wie kann man denn Leuten jetzt eine PN schicken? Und wie setze ich die obligate "Hilfreich" Bewertung?

    oops: @Snaptu

    Hab gerade deinen Beitrag entdeckt!

    Nee, das funktioniert eben leider nicht ... denn (siehe oben) e.Cancel ist IMMER "false" selbst wenn man den Cancel Button gedrückt hat.

    Man kann das Ganze doch super leicht nachvollziehen ... das Coding dazu hab ich doch oben eingestellt!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Also Flags sind im allgemeinen nicht erwünscht, weil sie das Debugging erschweren. Man muss ja immer erst mal feststellen, wie die gesetzt sind und bei zahlreichen Flags kann das abendfüllend werden.

    Alle Variablen sollen aussagekräftige Namen haben, dann ist es klar, was sie machen. Und sie sollen nicht für 20 Funktionen und unterschiedliche Bedeutungen missbraucht werden, sonst kommt man wirklich nicht mehr durch. Für jeden Zwecke eine andere Variable, normalerweise reichen 2-3.


    Peter329 schrieb:

    Wie kann man denn Leuten jetzt eine PN schicken?

    Du gehst aufs Profil des Users und wählst oben rechts das Symbol "Konversation starten".

    Peter329 schrieb:

    Und wie setze ich die obligate "Hilfreich" Bewertung?

    Indem du auf Daumenhoch rechts unten am Beitrag klickst. Wenn du mit Maus drangehst, werden sie sichtbar.
    Guten morgen zusammen,

    Peter329 schrieb:

    Nee, das funktioniert eben leider nicht ... denn (siehe oben) e.Cancel ist IMMER "false" selbst wenn man den Cancel Button gedrückt hat.

    Ganz kurz hierzu vielleicht noch etwas :)

    VB.NET-Quellcode

    1. e.cancel

    ist immer false da dieser Wert angibt ob das Event abgebrochen werden soll oder ist. Aus diesem Grund kannst du mit

    VB.NET-Quellcode

    1. e.cancel = true
    auch das Schließen abbrechen.

    Der für dich wichtige Wert ist - wie du ja weiter oben selbst schon gesagt hast - der

    VB.NET-Quellcode

    1. e.CloseReason
    .
    Allerdings funktioniert der für dich ja auch nicht weil es keine Unterscheidung zwischen dem x-Button und dem Schließen per Funktion gibt.
    msdn.microsoft.com/de-de/libra…losereason(v=vs.110).aspx
    Hier findest du eine kurze Auflistung der Werte die für das Enum möglich sind und wann sie verwendet werden, vielleicht findest ja da noch etwas hilfreiches.

    Ansonsten wäre die Lösung mit einem Flag in diesem Fall keines Weges schlechter Code, diesen Weg wäre ich ebenfalls gegangen :)
    Die Lösung mit dem String finde ich persönlich nicht ganz so schön da du dich jetzt immer darauf verlassen musst dass diese Variable nur aus der einen Methode gefüllt wird. Sollte irgendwann mal eine andere Methode kommen die diesen String befüllt welche sich aber im FormClosing anders verhalten soll bekommst du ein Problem :) Deshlab greif m.M.n. lieber wieder zu dem Flag, gibt ihm nen ordnetlichen Namen und gut is :)

    lg.
    lg.

    LucaWelker