Announcement

Collapse
No announcement yet.

Application: Liste aller WinForm-Instanzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Application: Liste aller WinForm-Instanzen

    Hallo,
    ich suche (bisher vergeblich) eine Liste aller erzeugten Formulare einer Anwendung. Gefunden habe ich Form.ActiveForm und ApplicationContext.MainForm, aber eine Liste Application.Forms oder FormCollection?
    Hintergrund: Wenn ein bestimmtes Formular aktiviert werden soll, will ich (analog zu Win32-FindWindow oder Screen.Forms von Delphi) prüfen, ob es schon existiert und dann aktivieren; nur wenn es noch nicht existiert, ist es zu erzeugen.
    Natürlich kann ich eine solche Liste in einem globalen Container selbst führen, aber warum das Rad neu erfinden...
    Gibt es eine solche Liste etwa nicht?
    Jürgen

  • #2
    Wie wärs mit dem <a href="http://de.wikipedia.org/wiki/Einzelst%C3%BCck_%28Entwurfsmuster%29">Singleton-Pattern</a&gt

    Comment


    • #3
      Hmmm...
      Die von Ihnen genannte Erläuterung bei Wikipedia klingt zwar sinnvoll, hilft mir aber nicht.
      * Auf diesem Weg (und mit der NET-SDK-Doku) gibt es keinerlei Hinweise auf die Umsetzung in C#.
      * Bei meiner Anwendung kommt es vor, dass eine Formularklasse mit mehreren Instanzen erzeugt wird, aber z.B. anhand des Form-Textes eindeutig identifiziert werden kann.
      Also nochmals: Muss ich eine solche Liste selbst erzeugen und überwachen?
      Danke! Jürge

      Comment


      • #4
        Ist es so schwer sowas selbständig nach C# umzusetzen?

        Auf einmal doch mehrere Instanzen dieser Klasse? Aber durch Erweiterung der getInstance-Methode um einen Parameter "FormText" und einer Verwaltungsliste sollte sowas auch einfach umzusetzen sein.

        Ansonten gibt es unter .NET auch eine Application-Class. Schau doch mal in der Hilfe nach was es da für Methoden/Properties gibt

        Comment


        • #5
          Hallo,
          > Ist es so schwer sowas selbständig nach C# umzusetzen?
          Ich sehe mich als Anwendungs-Programmierer; und für das, was im Wikipedia-Artikel steht, fehlt mir etwas das Verständnis.
          > mehrere Instanzen dieser Klasse
          Ja, aber jedes Formular - identifiert durch Form.Text - soll kein zweites Mal erzeugt werden.
          > Verwaltungsliste sowas einfach umsetzen
          Damit habe ich keine Probleme. Ich hatte nur gehofft/erwartet, dass es eine solche Liste bei den NET-Klassen sowieso gibt und ich sie nur nicht gefunden habe.
          > Application-Class
          Hier gibt es eben <u>keine</u> Liste von Forms o.ä.
          Also kümmere ich mich eben doch selbst um eine solche Liste. Mal sehen, ob ich daraus eine Klasse mache, falls auch andere Entwickler daran Interesse haben.
          Jürge

          Comment


          • #6
            Hallo,
            &gt;Ja, aber jedes Formular - identifiert durch Form.Text - soll kein zweites Mal erzeugt werden.

            Für das Problem gibt es im .NET Framework 2.0 bereits zwei vorgefertigte Lösungen, die allerdings nur für Visual Basic 2005 (aber nicht für C#) gültig ist.

            1. Variante: Visual Basic 2005 unterstützt Standardinstanzen, so dass die von VB6 her gewohnte Syntax zulässig ist. Ein Formular wird direkt aufgerufen - Form2.Show() - ohne dass sich der Entwickler darum kümmern muss, ob vorher bereits eine Instanz erzeugt wurde. Der VB-Compiler baut hinter den Kulissen den Singleton automatisch zusammen (MSIL-Code).

            2. Variante: Die <b>My</b>-Erweiterung stellt die <b>Forms</b>-Kollektion zur Verfügung:

            My.Forms.Form2.Show()

            &gt;Ich sehe mich als Anwendungs-Programmierer....

            Für diese Zielgruppe (die den größten Anteil an der Entwickler-Gemeinde ausmacht) sieht Microsoft als Sprache Visual Basic 2005 vor. Sehr viele Bequemlichkeiten gibt es nur in VB, auch wenn diese oftmals nur dadurch erreicht werden, dass die "reine Lehre" etwas verbogen werden muss. Aus diesem Grund können diese Bequemlichkeiten auch nicht in die (standardisierte) "reine Sprache" C# übernommen werden :-)

            Für C# könnte man <b>IEnumerable</b> implementieren, um dann über <b>foreach</b> auf die Kollektion zuzugreifen. Ich habe für eine derartige Verwaltungsklasse jedoch auch nur ein VB-Beispiel am Lager:

            <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">Module</span> FormsCollection</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Public</span> OSForms <span style="color: blue;">As</span> <span style="color: blue;">New</span> FormsCollectionClass()</p><p style="margin: 0px;"><span style="color: blue;">End</span> <span style="color: blue;">Module</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">Class</span> FormsCollectionClass : <span style="color: blue;">Implements</span> IEnumerable</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Private</span> c <span style="color: blue;">As</span> <span style="color: blue;">New</span> Collection()</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Sub</span> Add(<span style="color: blue;">ByVal</span> f <span style="color: blue;">As</span> Form)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; c.Add(f)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Sub</span> Remove(<span style="color: blue;">ByVal</span> f <span style="color: blue;">As</span> Form)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Dim</span> itemCount <span style="color: blue;">As</span> <span style="color: blue;">Integer</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">For</span> itemCount = 1 <span style="color: blue;">To</span> c.Count</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">If</span> f <span style="color: blue;">Is</span> c.Item(itemCount) <span style="color: blue;">Then</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; c.Remove(itemCount)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Exit</span> <span style="color: blue;">For</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">If</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Next</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">ReadOnly</span> <span style="color: blue;">Property</span> Item(<span style="color: blue;">ByVal</span> index) <span style="color: blue;">As</span> Form</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Get</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Return</span> c.Item(index)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Get</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Property</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Overridable</span> <span style="color: blue;">Function</span> GetEnumerator() <span style="color: blue;">As</span> _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; IEnumerator <span style="color: blue;">Implements</span> IEnumerable.GetEnumerator</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Return</span> c.GetEnumerator</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Function</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">End</span> <span style="color: blue;">Class</span></p></div&gt

            Comment

            Working...
            X