Announcement

Collapse
No announcement yet.

alle Formulare aus My.Forms auflisten

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

  • alle Formulare aus My.Forms auflisten

    Hallo,

    ich möchte aus My.Forms alle Formulare (Namen) auslesen.
    ich weiss nicht wie ich in einer Schleife alle Formulare in My.Forms zugreifen kann.

    Das folgende geht nicht:

    for each frm in My.Forms
    debug.print (frm.Name)
    next

    Danke Herbert

  • #2
    Hallo Herbert,

    zunächst grundsätzlich:
    Das folgende geht nicht:
    Das ist keine wirkliche Fehlermeldung: Wird der Fehler zur Compilierung oder zur Laufzeit angezeigt, welche Fehlermeldung gibt es?

    My.Forms ist ein Objekt, das in seinen Eigenschaften Zugriff auf die Formulare bietet, z.B. durch My.Forms.MainForm. Du kommst wahrscheinlich besser voran mit My.Application.OpenForms-Eigenschaft, wie auch das Beispiel in der SDK-Doku zeigt:
    Code:
            For Each f As Form In My.Application.OpenForms
                If Not f.InvokeRequired Then
                    ' Can access the form directly.
                    formTitles.Add(f.Text)
                End If
            Next
    Jürgen

    Comment


    • #3
      Hallo Jürgen

      Danke für deine Antwort.
      Die Fehlermeldung bei
      For Each frm in MY.Forms
      ist: Fehler 2 Der Ausdruck ist vom Typ "TestProjekt.My.MyProject.MyForms" und ist keine Auflistung.

      In deinem Beispiel
      For Each f As Form In My.Application.OpenForms
      erhalte ich nur die Forms die momentan geöffnet sind. Ich brauche aber alle Forms vom Projekt.
      Das Objekt MY.Forms enthält alle Formulare die ich zur Laufzeit auslesen möchte.

      Wenn MY.Forms nicht augelesen werden kann, gibt es eine andere Möglichkeit alle Forms von meinen Projekt aufzulisten (den Namen in eine Liste eintragen)

      Comment


      • #4
        Hallo,

        während My.Application.OpenForms eine Kollektion ist, dient der Sonderfall My.Forms "nur" dazu, beim ersten Zugriff auf ein Element eine Instanz des Formulars zu erzeugen (der Pseudo-Code wird im Artikel http://www.microsoft.com/germany/msd....mspx?mfr=true vorgestellt). Durch den "Trick" soll das alte VB6-Verhalten auch in VB2005 verfügbar sein, um direkt ein Formular zu verwenden, ohne vorher eine Instanz zu erzeugen. Hinter den Kulissen erzeugt Visual Studio eine Hilfsklasse, in der für jedes im Projekt enthaltene Formular eine öffentliche Eigenschaft implementiert wird. Die Eigenschaften einer Klasse können jedoch nicht in einer For Each-Abfrage ausgewertet werden (sondern nur über Reflection). Das könnte als Beispiel so aussehen:

        Code:
        Imports System.Reflection
        
        Public Class Form1
        
            Private Sub Button1_Click(ByVal sender As System.Object, _
              ByVal e As System.EventArgs) Handles Button1.Click
                ' Prinzip von My.Forms demonstrieren
                My.Forms.Form3.Show()
            End Sub
        
            Private Sub Form1_Load(ByVal sender As System.Object, _
              ByVal e As System.EventArgs) Handles MyBase.Load
                ' Liste aller Klassen, deren Namen mit dem Präfix "Form" beginnt, zusammenstellen
                Dim aDummy As New Form2()
                Dim myAssembly As [Assembly]
                myAssembly = aDummy.GetType().Assembly
                For Each myType As Type In myAssembly.GetTypes
                    If myType.IsClass Then
                        If myType.Name.StartsWith("Form") Then
                            ListBox1.Items.Add(myType.Name)
                        End If
                    End If
                Next
            End Sub
        End Class
        Zuletzt editiert von Andreas Kosch; 12.05.2007, 11:08.

        Comment


        • #5
          Danke Andreas
          ich habe nun die Lösung:
          in meinen Beispiel sind alle Formulare die ich auflisten will von FormDefault geerbt (BaseType):

          Dim myAssembly As Reflection.Assembly = My.Forms.GetType().Assembly
          For Each myType As Type In myAssembly.GetTypes
          . If myType.BaseType.Name.Equals(FormDefault.Name) Then
          . . Debug.Print(myType.Name)
          . End If
          Next


          Danke nochmals Herbert

          Comment

          Working...
          X