[C#] verhindern dass der Garbarge Collector mein objekt einsammelt

Darkas

Erfahrenes Mitglied
Hi!

Ich habe folgendes Problem: ich habe ein NotifyIcon, dass alleine läuft, und von dem aus Fenster geöffnet werden können. Das funktioniert auch gut. Ich will die Fenster jedoch im speicher behalten. Also habe ich meiner Klasse alle Forms hinzugefügt. Wenn man ein Fenster öffnen will, wird dieser Code ausgeführt:
Code:
if(form1 == null)
    form1 = new Form1();
form1.Show();
Beim ersten mal klappt das natürlich wunderbar, beim zweiten mal tritt jedoch die ObjectDisposedException auf. Ich kann aber das Fenster nicht jedes mal neu initialisieren, da genau das gleiche noch benötigt wird. Kennt jemand da vielleicht eine lösung?
 
ich glaube, dein problem ist, das nach dem klicken von X oder dergleichen die form immer geschlossen wird (dekonstruktor, form.Dispose()), dadurch ist die form natürlich nach dem schließen null

was wäre, wenn du statt dem schließen die Form einfach nur versteckst (form.Hide())?
 
aus irgendeinem Grund klappt das nicht. Anscheinend wird das Fenster automatisch eingesammelt. Ich hab das ganze mit dem FormClosing und FormClosed probiert, aber keins von beiden klappt. Gibt es nicht eine möglichkeit das schließen von einem Fenster zu verhindern?
 
mach dir mal einen button oder ein menü, dort machst du nur form.Hide()

wenn du da klickst, sollte die form noch immer verfügbar sein (nur versteckt), du kannst auf daten zugfreien, und mit form.Show() zeigst du sie wieder an

und das X zum schließen für den anfang mal nicht anzeigen lassen oder so

aber normalerweise gibts doch auch die möglichkeit, die aktion zu überschreiben, die aufgerufen wird wenn close ('X') gedrückt wird (weiß ich leider nicht so genau)
dort wird .Dispose() aufgerufen (nehme ich jetzt mal an), dann ist die form natürlich weg


vielleicht kann dir ja ein C# kenner mehr weiterhelfen

aber das ist schon normal, wenn das fenster geschlossen wird, das du dann darauf nicht mehr zugreifen kannst
 
Hi

Das Event FormClosing abonieren, FormClosingEventArgs.Cancel auf true setzen und anschließend this.Hide aufrufen (oder this.Visible auf false setzen).

@Proko
Was hat das mit C# zu tun? :confused: Das Prinzip ist in jeder Sprache das selbe
 

Neue Beiträge

Zurück