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 :
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
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138640
Url: https://administrator.de/forum/vb-net-programm-nach-abfrage-beenden-138640.html
Ausgedruckt am: 07.04.2025 um 10:04 Uhr
8 Kommentare
Neuester Kommentar

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
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

Hallo listigerTeppich!
Also, nach meiner Meinung müsste ab Codzeile 22 folgendes stehen:
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:
Gruß Dieter
Also, nach meiner Meinung müsste ab Codzeile 22 folgendes stehen:
1
2
3
4
5
2
3
4
5
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

Hallo listigerTeppich!
Gruß Dieter
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?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 ?
Gruß Dieter

Hallo listigerTeppich!
Freut mich
Gruß Dieter
Freut mich
Danke !
Gern geschehen!Gruß Dieter