listigerteppich
Goto Top

VB.net Programm nach Abfrage beenden

Hallo Beisamen,

Ich arbeite an eionem VB.net Programm und habe das Problem, dass das Programm beim beenden nicht so reagiert wie ich es gerne hätte. Ich habe mir vorgestellt, dass das Programm per "Beenden"-Button und/oder per Druck auf "X" zu beenden ist. Es sollte jeweils eine Sicherheitsabfrage alá "Möchten Sie das Programm wirklich beenden?" vor der wirklichen Beendigung stattfinden.
Bisher reagiert mein Code auf die Abfrage entweder gar nicht oder nicht auf die gewünschte Weise.
mein bisheriger Code :

Private Sub cmdBeenden_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdBeenden.Click

 

        If MsgBox("Möchten Sie das Programm wirklich beenden?", MsgBoxStyle.YesNo, Me.Text) = MsgBoxResult.No Then  
                        Exit Sub
        End If

        Close()
        
    End Sub

    Private Sub frmCopy_FormClosing(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        Dim Cancel As Boolean = eventArgs.Cancel
        Dim UnloadMode As System.Windows.Forms.CloseReason = eventArgs.CloseReason
        'Programm nach Abfrage beenden  


        If MsgBox("Möchten Sie das Programm wirklich beenden?", MsgBoxStyle.YesNo, Me.Text) = MsgBoxResult.No Then  
            Cancel = True
            Exit Sub
        End If



        Dim sw As StreamWriter
        EPfad = Verzeichnis1.Path

        sw = New StreamWriter(Ini, False)
        sw.WriteLine(EPfad & Delim & "                                                    !MUSSbereitsEXISTIEREN! Einsprungsspfad für Datei-Explorer   
        sw.WriteLine(Datum & Delim & "                                                   Datumsformat der Ablageordner und Protokoll-Dateien (yyyy_MM_dd)")  
        sw.WriteLine(Profilload & Delim & "                                              Profilname des ZenDrum-Servers ")  
        sw.WriteLine(Zdrum & Delim & "                                                   Pfad")  
        sw.WriteLine(Xdrum_done & Delim & "                                        Done-Pfad  ")  
        sw.WriteLine(Xdrum_log & Delim & "                                            Log-Pfad  ")  
        sw.WriteLine(putty & Delim & "                                                        Putty-Pfad ")  
        sw.WriteLine(sam & Delim & "                                                        PDF-SAM-Pfad ")  
        sw.WriteLine(fallzahlenprot & Delim & "                                        Fallzahlenprotokoll-Pfad ")  
        sw.WriteLine(zendrum_druckdienst_apc & Delim & "                Druckdateien-Ablage Netzwerk ")  
        sw.WriteLine(datadir & Delim & "                                                    Druckdateien-Ablage Lokal ")  
        sw.WriteLine(savedir & Delim & "                                                   Sicherungspfad-Pfad der Druckdateien")  
        sw.WriteLine(logdir & Delim & "                                                      Log-Pfad für Filecopy")  
        sw.Close()


        Close()


    End Sub

Der streamwriter In der frmCopy_FormClosing ist für die Auslagerung bestimmter Dateipfade in eine .ini gedacht und hat mit dem Problem hoffentlich nichts zu tun.
War super wenn von euch eienr nen tipp hat :D

Content-Key: 138640

Url: https://administrator.de/contentid/138640

Printed on: April 25, 2024 at 03:04 o'clock

Mitglied: 76109
76109 Mar 19, 2010 at 11:25:16 (UTC)
Goto Top
Hallo listigerTeppich!

Bin kein VB-Net-Experte, aber so wie ich das sehe, dann setzt Du in Codezeile 22 zwar Deine interne Variable Cancel auf True aber nicht das eventArgs.Cancel

Gruß Dieter
Member: TsukiSan
TsukiSan Mar 19, 2010 at 12:02:07 (UTC)
Goto Top
Hallo listigerTeppich,

in VBS oder VB funktioniert das ganze in etwa so:
Frage = MsgBox( "Sind Sie sicher?",vbyesno,"....")  
If Frage = VbYes then 'Befehl  
If Frage = VbNo then 'Befehl  

Würde mich wundern, wenn's in .Net nicht ähnlich sein sollte.

Gruss
Tsuki
Member: listigerTeppich
listigerTeppich Mar 19, 2010 at 12:12:31 (UTC)
Goto Top
Hab das "eventArgs.Cancel = True" gesetzt....hat teilweise geholfen, Wenn ich die Beendenfrage mit "Nein"-Click beantworte, schliest er nur noch die Messagebox mit der Abfrage. So soll das ja auch sein, passt also


Wenn ich aber die Frage mit Klick auf "JA" bestätige passiert weiterhin erstmal nichts...auch nach 20 mal klicken auf ja passiert nichts...erst nach einem gefolgten Klick auf "Nein" schließt sich das Programm ganz.

das Schließen des Programmes geht (nach mehrmaligen) Tests auf folgende Weise:

X-Button:

mind 1x JA-Click gefolgt von einem Nein-Click

Beenden Button:

mind 2x-JA-Click gefolgt von einem Nein-Click


der "Nein-Click" bei der Frage "Möchten Sie das Programm wirklich beenden?" ist derzeit also immer erforderlich um das Programm zu beenden - Hilfe :D


Nachtrag: Hab die msgbox mal komplett raus ausm code genommen...wenn ich jetzt Beenden will, wirft das Programm ne Stackoverflow exception bei Line 31... Ka warum aber er sagt er läuft da inne Endlosschleife...weiss einer von euch warum das der Fall sein könnte?
Mitglied: 76109
76109 Mar 19, 2010 at 13:00:03 (UTC)
Goto Top
Hallo listigerTeppich!

Also, nach meiner Meinung müsste ab Codzeile 22 folgendes stehen:
        If MsgBox("Möchten Sie das Programm wirklich beenden?", MsgBoxStyle.YesNo, Me.Text) = MsgBoxResult.No Then  
            eventArgs.Cancel = True
        Else
            Exit Sub
        End If

Das Bedeutet:
Beim Ereignisaufruf enthält die Variable "eventArgs.Cancel" den Wert False. D. h. wenn der Wert unverändert bleibt, dann wird die Form geschlossen (Exit Sub). Im anderen Fall setzt Du die Variable "eventArgs.Cancel" auf True und bedeutet das alles beim alten bleibt, aber ohne Exit Sub, sonst bleibt zwar die Form geöffnet, aber der nachfolgende Code wird nicht ausgeführt. Bleibt allerdings die Frage ob der Code da überhaupt hingehört und nicht in eine andere z.B. Button-OK-Routine oder so?

Außerdem müsstest Du erst die Variable "eventArgs.CloseReason" auswerten. D.h. hier bekommst Du einen Statuscode, der besagt ob die Form durch den User oder durch ein anderes Ereignis geschlossen werden soll (siehe weiter unten). Hier musst Du erst prüfen, ob der User die Form schließen will oder oder die Form z.B. durch einen Beenden-Button geschlossen werden soll.

Ein weiters Problem, das Du noch berücksichtigen musst ist, dass diese Erreignis-Routine auch bei der Unload/Close-Anweisung aufgerufen wird. Also Statuswerte entsprechend auswerten.

In VBA gibt es z.B folgende Statuscodes:
vbFormControlMenu 0 Der Benutzer hat auf der UserForm im Systemmenü den Befehl Schließen gewählt.
VbFormCode 1 Die Unload-Anweisung wird durch Code aufgerufen.
VbAppWindows 2 Die aktuelle Windows-Betriebsumgebungssitzung wird beendet.
VbAppTaskManager 3 Die Anwendung wird vom Windows-Task-Manager geschlossen.

Gruß Dieter
Member: listigerTeppich
listigerTeppich Mar 19, 2010 at 15:37:53 (UTC)
Goto Top
Mh, ich bin jetz schon nen ganzen Schritt weiter... hab mitbekommen , dass die Sub "cmdBeenden_Click" falls die Frage mit "ja" beantwortet wird, die Sub frmCopy_FormClosing aufruft. Daher muss man auch 2x "JA" klicken wenn man per Beenden-Button schließen will.

Die Lösung des Problems wäre also, wenn ich in der Sub "cmdBeenden_Click" lediglich weiterleite zur Sub "frmCopy_FormClosing".

Kann mir einer sagen wie ich aus einer Sub eine andere Sub aufrufe, bzw. auf diese weiterleite ?
Mitglied: 76109
76109 Mar 19, 2010 at 16:08:06 (UTC)
Goto Top
Hallo listigerTeppich!

Zitat von @listigerTeppich:
Die Lösung des Problems wäre also, wenn ich in der Sub "cmdBeenden_Click" lediglich weiterleite zur Sub
"frmCopy_FormClosing".

Kann mir einer sagen wie ich aus einer Sub eine andere Sub aufrufe, bzw. auf diese weiterleite ?
Das brauchsr Du doch garnicht. In deinem Beenden-Click setzt Du nur die Form-Schließen-Anweisung und die FormClosing-Routine wird im Anschluß automatisch aufgerufen, wobei dann Deine Nachfrage getätigt wird. So sollte es zumindest sein?

Gruß Dieter
Member: listigerTeppich
listigerTeppich Mar 23, 2010 at 13:20:26 (UTC)
Goto Top
Jo, recht haste - funktioniert wunderbar.

Danke !
Mitglied: 76109
76109 Mar 23, 2010 at 18:32:19 (UTC)
Goto Top
Hallo listigerTeppich!

Zitat von @listigerTeppich:
Jo, recht haste - funktioniert wunderbar.
Freut michface-wink
Danke !
Gern geschehen!

Gruß Dieter