![]() |
[C#] Zweite Form nur einmal aufrufen
Folgendes Problem: Gemäß einem Beispiel im .NET-Framework SDK habe ich folgende Codezeilen versucht, um aus meiner Hauptform eine zweite Form zu öffnen:
Code:
Klappt auch. So weit, so gut. Aber die Hauptform reagiert in dem Fall immer noch auf den Shortcut des Menüeintrags (Einfg), so dass ich diese zweite Form eben mehrfach öffnen konnte. Ich habe mir im Moment damit beholfen, den o.g. Code wie folgt einzuklammern
aForm = new AddingUnit();
if (aForm.ShowDialog(this) == DialogResult.OK) { // noch nix da } aForm.Dispose();
Code:
Jetzt tut es zwar das, was ich will, aber geht das nicht auch generell einfacher?
if (aForm == null)
{ // der Code von eben aForm = null; } Ach ja: Falls es von Wichtigkeit ist, ich fummle mit der Visual C# Express 2005er-Beta und dem .NET-Framework 2.0 Beta herum. |
Re: [C#] Zweite Form nur einmal aufrufen
eine "hübschere" Implementierung eines Resourcenschutzblockes ist das da:
Code:
In einem absoluen Notfall kannst du danach...
using(aForm = new AddingUnit())
{ if (aForm.ShowDialog(this) == DialogResult.OK) { // noch nix da } }
Code:
... aufrufen. (Ist aber nicht "hübsch")
GC.Collect();
GC.WaitForPendingFinalizers(); Oder ein abgeschwächtes Singleton (bei einem "richtigen" singleton springt dir der Designer auf's Dach ;) )
Code:
Nachtrag:
class AddingUnit :Form
{ private static AddingUnit fInstance; public static AddingUnit CreateInstance() { if (fInstance == null) fInstance = new AddingUnit(); return fInstance; } ... } Das 2. verhindert aber nur Instanzen n > 1.
Code:
aForm = AddingUnit.CreateInstance();
if (aForm.ShowDialog(this) == DialogResult.OK) { // noch nix da } |
Re: [C#] Zweite Form nur einmal aufrufen
Das kann ich mit Framework 1.1 und dem CSB 1.0 nicht nachvollziehen:
Winforms-Anwendung, Mainmenü auf Form geklatscht, Eintrag erstellt und den Shortcut auf "Ins" gestellt. Zweite Winform erzeugt und diese im Klick-Event des Menüeintrages auf der ersten Form per ShowModal() aufgerufen. Nach einmaligem Drücken der Einfg-Taste hat sich das zweite Fenster problemlos geöffnet, aber kein zweites Mal, die erste Form war nicht mehr in den Vordergrund zu holen und auf diverseste Klicks auf den Menüeintrag hat auch nichts regaiert (naja, die titelleiste der zweiten Form hat geblinkt ;-)). |
Re: [C#] Zweite Form nur einmal aufrufen
*g* Ich hatte dich zwar erst falsch verstanden, aber mit dem pseudo-singleton dürftest du die Lösung haben. ;)
Es wird ja bei mehrfachen Aufrufen von AddinUnit.CreateInstanz() immer wieder die gleiche Instanz übergeben. ;) |
Re: [C#] Zweite Form nur einmal aufrufen
Mein Beitrag bezog sich nicht auf deinen, Robert, als ich gepostet und probiert habe, war deiner noch gar nicht da ;-)
|
Re: [C#] Zweite Form nur einmal aufrufen
:mrgreen: Und ich meinte Mathias. (Ich hatte ihn wirklich falsch verstanden. *g* )
|
Re: [C#] Zweite Form nur einmal aufrufen
Häh? :roteyes:
|
Re: [C#] Zweite Form nur einmal aufrufen
Zitat:
Zitat:
Zitat:
|
Re: [C#] Zweite Form nur einmal aufrufen
Einfach das mit in deinen Form descendant einbauen:
Code:
Kiek dir mal genau an was das macht. ;)
class AddingUnit :Form
{ private static AddingUnit fInstance; public static AddingUnit CreateInstance() { if (fInstance == null) fInstance = new AddingUnit(); return fInstance; } ... } Damit ist das:
Code:
... exakt das gleiche wie:
aForm = AddingUnit.CreateInstance();
Code:
Wenn du dieses abgeschwächte Singleton in deine Form-ableitung packst, kannst du immer nur eine Instanz bekommen, egal wie oft du sie aufrufst. ;)
aForm = AddingUnit.CreateInstance();
aForm = AddingUnit.CreateInstance(); aForm = AddingUnit.CreateInstance(); aForm = AddingUnit.CreateInstance(); aForm = AddingUnit.CreateInstance(); aForm = AddingUnit.CreateInstance(); aForm = AddingUnit.CreateInstance(); also statt:
Code:
janz einfach:
aForm = new AddingUnit();
Code:
Edit: Kann man sich eigentlich wirklich sooft vertippen? :gruebel:
aForm = AddingUnit.CreateInstance();
|
Re: [C#] Zweite Form nur einmal aufrufen
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz