Funktion für MDI-Form?

hhunderter

Erfahrenes Mitglied
Guten Tag,

im Internet habe ich schon folgenden Code gefunden der meinen ansprüchen entspricht:
Code:
        Dim kForm As Form
        Dim kformExistiert As Boolean = False
        For Each kForm In Me.MdiChildren
            If Not TypeName(kForm) = "MDIForm" Then
                If kForm.Name = "Prozessschaltbild" Then
                    '' Es gibt mind. 1 geöffnetes Browser-Fenster
                    kForm.Activate()
                    kformExistiert = True
                End If
            End If
        Next
        If Not kformExistiert Then
            kForm = New Prozessschaltbild
            kForm.MdiParent = Me
            kForm.Show()
        End If

nur will ich nicht für jedes MDI-Form diesen Code einsetzen sondern eine Funktion , wie bewerkstellige ich sowas?
 

Shakie

Erfahrenes Mitglied
Im My-Namespace gibt es das My.Forms-Objekt. Dieses bietet für jede Form in deiner Anwendung eine Instanz an.
Du könntest also probieren, deinen Code durch
Code:
My.Forms.Prozessschaltbild.MdiParent = Me
My.Forms.Prozessschaltbild.Show()
My.Forms.Prozessschaltbild.Activate()
zu ersetzen.
Ich habe es nicht getestet, aber es sollte funktionieren ;-)
Allerdings bin ich mir nicht sicher, ob das wirklich das von dir gewünschte Verhalten ist. Wird es höchstens eine Instanz von "Prozessschaltbild" geben, oder auch mehrere?
Was genau ist denn dein Ziel? Es wird mir aus deinem Code nicht klar. Willst du Singleton-Forms haben?
 
Zuletzt bearbeitet:

hhunderter

Erfahrenes Mitglied
es soll nur eine instanz geben deswegen ja mein code , ich will das ich die form zb. "Prozessschaltbild" duch verschiedene ersetzen kann ohne immer wieder soviel code zu schreiben also als funktion
 

hhunderter

Erfahrenes Mitglied
nochmal zur verständigung : ich habe mehrer sachen schon ausprobiert (
Code:
    Function MDI_Open(ByVal nowform As String, Anzahl As Integer)
        Dim kForm As Form
        Dim kformExistiert As Boolean = False
        'For Each kForm In Me.MdiChildren
        '    If Not TypeName(kForm) = "MDIForm" Then
        '        If kForm.Name = nowform Then
        '            '' Es gibt mind. 1 geöffnetes Browser-Fenster
        '            kForm.Activate()
        '            kformExistiert = True
        '        End If
        '    End If
        'Next
        If Not kformExistiert Then
            kForm = New nowform
            kForm.MdiParent = Me
            kForm.Show()
        End If
        Return True
    End Function
) bei mir haperts nur hier:
Code:
kForm = New Prozessschaltbild
wie kriege ich das hin das "Prozessschaltbild" eine variable sein kann?
 
Zuletzt bearbeitet:

hhunderter

Erfahrenes Mitglied
ich verstehe grad nur Spanisch kanste mir mal einen anstoß geben wie ichs mit meiner Funktion hinbekomme ?
wie geasgt will es so aufrufen können : MDI_Open("Prozessschaltbild", 1)
und dann soll meine Form "Prozessschaltbild" aufgerufen werden die 1 ist erstmal außen vor
 

Shakie

Erfahrenes Mitglied
ich verstehe grad nur Spanisch
Das hatte ich befürchtet.
kanste mir mal einen anstoß geben
Siehe Links in meinem vorherigen Post!
Hier die fertige Problemlösung:
Methode 1:
Code:
Private Sub ErstelleInstanz_GenerischeMethode(Of MeinFormType As {Form, New})(ByVal Anzahl As Integer)
        Dim NeueForm As New MeinFormType()
        ' Jetzt kannst du irgendwas mit NeueForm machen, zum Beispiel anzeigen:
        NeueForm.Show()
    End Sub
Aufruf:
Code:
ErstelleInstanz_GenerischeMethode(Of Form2)(1)
Methode 2:
Code:
    Private Sub ErstelleInstanz_ActivatorClass(ByVal MeinFormType As Type, ByVal Anzahl As Integer)
        'Dim NeuesObjekt As ob = Activator.CreateInstance(Of Form2)()
        Dim NeuesObjekt As Object = Activator.CreateInstance(MeinFormType)
        Dim NeueForm As Form = TryCast(NeuesObjekt, Form)
        If (NeueForm Is Nothing) Then
            MessageBox.Show("Der Typ '" + MeinFormType.Name + "' ist keine Form!", "Ungültiger Typ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            ' Jetzt kannst du irgendwas mit NeueForm machen, zum Beispiel anzeigen:
            NeueForm.Show()
        End If
    End Sub
Aufruf:
Code:
ErstelleInstanz_ActivatorClass(GetType(Form1), 1)
Methode 3:
Code:
    Private Sub ErstelleInstanz_GetConstructor(ByVal MeinFormType As Type, ByVal Anzahl As Integer)
        If Not GetType(Form).IsAssignableFrom(MeinFormType) Then
            MessageBox.Show("Der Typ '" + MeinFormType.Name + "' ist keine Form!", "Ungültiger Typ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Else
            ' Typ ist eine Form -- Constructor ermitteln            
            Dim LeeresTypeArray As Type() = {}
            Dim FormConstructor As System.Reflection.ConstructorInfo = MeinFormType.GetConstructor(LeeresTypeArray)
            ' Constructor aufrufen
            Dim NeuesObjekt As Object = FormConstructor.Invoke(Nothing)
            Dim NeueForm As Form = TryCast(NeuesObjekt, Form)
            If (NeueForm Is Nothing) Then
                MessageBox.Show("Fehler beim Erstellen einer Instanz des Typs '" + MeinFormType.Name + "'!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Else
                ' Jetzt kannst du irgendwas mit NeueForm machen, zum Beispiel anzeigen:
                NeueForm.Show()
            End If
        End If
    End Sub
Aufruf:
Code:
ErstelleInstanz_GetConstructor(GetType(Form2), 1)
Ach ja, könntest du demnächst bitte ordentliche Sätze schreiben, mit Kommasetzung und Groß- und Kleinschreibung und so Kram? Ich muss deine Sätze immer zwei mal lesen, bevor ich verstehe, wo dein Problem liegt.