MDI Programm

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    MDI Programm

    Guten Abend ...



    kann mir bitte jemand einen Tipp geben, wie man von einer MDI-Parent-Form
    eine Function oder Sub auf einer Child-Form erreichen/ausführen kann?



    Vielleicht zur näheren Erklärung: es gibt eine MDI-Mutter-Form. Es können
    mehrere Kind-Formen (gleiche Form mit unterschiedlichen Inhalt) als
    Kopien gestartet werden. Auf der Kopie der Kind-Form befindet sich jeweils ein
    Button zur Weiterverarbeitung. Jede Kind-Form für sich alleine arbeitet
    korrekt. Zusätzlich möchte ich aber in einer Toolbar (auf der
    Mutter-Form) einen Button anbieten, der den entsprechenden Button auf
    der aktiven Child-Form anspricht (also den Code dahinter startet).

    Die Funktion bzw. Sub in der Child-Form als Public zu definieren reicht leider nicht.

    Schon mal Danke im voraus für Ideen und Vorschläge
    Mit

    VB.NET-Quellcode

    1. Dim childs() = Me.MdiChildren
    kannst Du eine Liste der aktuellen Child-Fenster abrufen.
    Dort suchst Du Dir das richtige raus und kannst dann drauf zugreifen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für Deinen Hinweis ... aber leider komme ich damit auch nicht weiter.
    Nehmen wir an, in meiner Mutterform steht die (unfertige) Routine:

    Dim Subfenster() As Form = Me.MdiChildren

    For x = 0 To Subfenster.Length - 1
    '???
    Next

    Die Sub die ich erreichen will (in der Childform) nennen wir

    Public Sub VonAussenNeu()
    '(hier wird was gemacht)
    End Sub

    (Ein Bild erklärt das Problem vielleicht näher. Ich möchte von der Toolbar "Button Neu" auf die activeform zugreifen (aber nicht im Sinne von Eigenschaften verändern oder Steuerelemente auslesen) sondern direkt eine Sub [activeform.VonAussenNeu] ausführen)
    Bilder
    • Zwischenablage01.jpg

      98,6 kB, 1.027×810, 171 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hoernchen“ ()

    genau ... so ist mein Plan: auf der activeform den button starten/auslösen (zur Not über Umweg über eine extra Sub in der Child-Form um dort PerformClick zu schreiben).
    Wenn ich also in der Mutter-Form getestet habe, ob eine Childform vorhanden ist, müßte doch rein theoretisch die Anweisung:
    Call ActiveMdiChild.vonaussneu()
    reichen????

    .Net sagt aber stur: von "aussenneu" ist kein Member von System.Windows.Forms.Form
    Bitte (gewöhn dich dran) poste vollständige Methoden, und richtig eingerückt, und Bitte VB-Tag benutzen - aber richtig

    @Topic: Glückwunsch! du proggst offensichtlich mit Option Strict On!

    Dass heißt, du beabsichtigst, Datentypen voneinander zu unterscheiden.
    Nun wird der ActiveMdiChild nur als Basisklasse geliefert, weil der MDIParent weiß ja nur, dasses irgendein Form ist, nicht welche Art Form genau.
    Aber du kannst den Typ des Forms testen, und bei Erfolg darauf casten, und dann liegt der ActiveMdiChild korrekt typisiet vor, und hat dann auch den Member "aussenneu".

    Testen und Casten kann man auch in einem Schritt durchführen, mit dem TryCast-Schlüsselwort - mach dich auf MSDN schlau darüber.
    Wenn ich so schreiben würde, springe ich zwar in den richtigen IF-Teil aber die SUB ist immer noch kein Member. Habe ich vielleicht bereits in der Child-Form ein Fehler ... also mit Schlüsselwort "Public"?

    VB.NET-Quellcode

    1. Dim Test As Form = TryCast(Me.ActiveMdiChild, fOption)
    2. If Test Is Nothing Then
    3. Stop
    4. Else
    5. Call Test.vonaussenneu()
    6. End If
    fast.

    VB.NET-Quellcode

    1. Dim Test As fOption= TryCast(Me.ActiveMdiChild, fOption)
    2. If Test Is Nothing Then
    3. Stop
    4. Else
    5. Call Test.vonaussenneu()
    6. End If


    VB.NET-Quellcode

    1. Dim Test As Form = TryCast(Me.ActiveMdiChild, fOption)
    ergibt keinen Sinn, denn erst wird der ActiveChild auf fOption gecastet, nur um dann doch wieder an eine Variable vom Typ Form zugewiesen zu werden.
    wow... eine sehr hilfreiche Antwort.
    Da ich ja sofort im MSDN geblättert habe bin ich eben auf diesen Codeschnipsel gekommen.


    OK... gewonnen" Und ich nehme alles zurück.
    Die Zeile muss heissen:

    VB.NET-Quellcode

    1. Dim Test As fOption = TryCast(Me.ActiveMdiChild, fOption)


    und Nachtrag: es funktioniert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hoernchen“ ()

    Hoernchen schrieb:

    Die Zeile muss heissen:
    Für den Fall, dass Du mehrere Forms als ChildForms hast:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim activeChild As Form = Me.ActiveMdiChild
    3. If TypeOf (activeChild) Is Form2 Then ' das hier macht es
    4. Dim xx As Form2 = DirectCast(activeChild, Form2)
    5. xx.VonAussenNeu()
    6. End If
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!