Code ausführen wenn Form beendet wird - Destruktor funktioniert nicht
-
Ich habe eine Klasse von Form abgeleitet. Wenn ich die Form schließe (mit dem Standard-Schließen-Button rechts oben), möchte ich die aktuelle Fensterposition in eine Datei schreiben. Wollte das mit einem Destruktor lösen, aber das funktioniert nicht. Und nach dem was ich darüber hier gelesen und gegoogled habe, scheint das sowieso der falsche Weg zu sein (Destruktor wird anscheinend vom GC aufgerufen). Wie könnte man das sonst lösen. Zum Verständnis der Code, wie ich das machen wollte (in C++ müsste das im Prinzip so funktionieren):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace HelloWinCs { public partial class HelloWinCs : Form { private string iniFile = "HelloWinCs.ini"; public HelloWinCs() { InitializeComponent(); this.Location = new System.Drawing.Point(420, 480); try { FileStream FsIni = new FileStream(iniFile, FileMode.Open, FileAccess.Read); // Enter code for reading and setting window position here FsIni.Close(); } catch (FileNotFoundException e) { this.Location = new System.Drawing.Point(580, 480); } } ~HelloWinCs() { int dummy=1; FileStream FsIni; if (File.Exists(iniFile)) { FsIni = new FileStream(iniFile,FileMode.Open,FileAccess.ReadWrite); } else { FsIni = new FileStream(iniFile,FileMode.CreateNew,FileAccess.ReadWrite); } // Enter code for writing current window position here FsIni.Close(); } private void SayHello_Click(object sender,EventArgs e) { MessageBox.Show("Hello, world!", "Hello with C#", MessageBoxButtons.OK, MessageBoxIcon.Information); // this.Close(); // Application.Exit(); } } }
-
Der Destruktor wird auch nicht aufgerufen. Das beste ist du haengst dich an das Closing-Event.
-
@Firefighter: Danke für den Hinweis, habe heute mit einem befreundeten Studenten gesprochen, der hat das gleiche vorgeschlagen.
Hätte ich eigentlich selbst darauf kommen können... Bin halt in .NET noch blutiger Anfänger. Wenn ich es nicht hinbekomme, werde ich mich noch mal melden
Edit:
Yep, habe es gefunden
FUNKTIONIERT (der Doppelklick auf das FormCloses-Ereignis im Form-Designer fügt alles wunderbar ein). Dann noch alles aus dem ehemaligen Destruktor in die Funktion einfügen, und es funktioniert
Jetzt muss ich nur noch den Code schreiben, um die aktuelle Fenster-Position zu ermitteln, und in die Datei zu schreiben (das sollte ich aber hinkriegen).
So sieht es jetzt aus und funktioniert
(im Debugger getestet):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace HelloWinCs { public partial class HelloWinCs : Form { private string iniFile = "HelloWinCs.ini"; public HelloWinCs() { InitializeComponent(); this.Location = new System.Drawing.Point(420, 480); try { FileStream FsIni = new FileStream(iniFile, FileMode.Open, FileAccess.Read); // Enter code for reading and setting window position here FsIni.Close(); } catch (FileNotFoundException e) { this.Location = new System.Drawing.Point(580, 480); } } private void SayHello_Click(object sender,EventArgs e) { MessageBox.Show("Hello, world!", "Hello with C#", MessageBoxButtons.OK, MessageBoxIcon.Information); // this.Close(); // Application.Exit(); } private void HelloWinCs_FormClosed(object sender, FormClosedEventArgs e) { FileStream FsIni; if (File.Exists(iniFile)) { FsIni = new FileStream(iniFile, FileMode.Open, FileAccess.ReadWrite); } else { FsIni = new FileStream(iniFile, FileMode.CreateNew, FileAccess.ReadWrite); } // Enter code for writing current window position here FsIni.Close(); } } }
-
Freut mich, wenn dir das geholfen hat.
-
johan schrieb:
Wollte das mit einem Destruktor lösen, aber das funktioniert nicht. Und nach dem was ich darüber hier gelesen und gegoogled habe, scheint das sowieso der falsche Weg zu sein (Destruktor wird anscheinend vom GC aufgerufen)
Nur noch der Vollständigkeit halber: Das Teil heißt Finalizer und wird vom GC aufgerufen.. aber du weißt nicht wann. Man sollte den Begriff Destruktor wirklich meiden, weil man sonst falsche Annahmen über den Finalizer macht
Übrigens, mach das mit FileStream lieber so:
using (FileStream FsIni = new FileStream(iniFile, FileMode.Open, FileAccess.Read)) { // Enter code for reading and setting window position here } //Der FileStream wird durch using korrekt "Disposed" und Close() wird automatisch aufgerufen
Mehr zum Thema using/Dispose findest du hier: http://msdn.microsoft.com/de-de/library/yh598w02(VS.80).aspx
-
Servus,
und ergänzend zu GPC -> Mach noch anstatt FileMode.Open und FileMode.CreateNew, einfach ein FileMode.OpenOrCreate und ein FileAccess.Write.
Gruß
Hellsgore