Selbstgehäkeltes mdi-modul - passt das so?

  • VB.NET

Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Selbstgehäkeltes mdi-modul - passt das so?

    Guckguck,

    ich hatte im Tutorial-Bereich ja bereits ein Beispiel-Projekt für das Mdi-Handling via TabControl bereitgestellt.
    Darin hatte ich alles, was die MdiParent/Child/TabControl betrifft in die main-form gepackt. Ich wollte das gerne separieren und habe
    dafür nun ein eigenes Modul erstellt, was alles abhandelt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Module Mdi
    2. Private _tabControl As TabControl
    3. Private _mdiParent As Form
    4. Public Sub ShowMdiChild(mdiTab As TabControl, mdiParent As Form, mdiChild As Form, dts As DataSet) 'dts ist optional - Mdi arbeitet auch ohne
    5. _tabControl = mdiTab
    6. _mdiParent = mdiParent
    7. MdiHandle() ' Initialisierung der Handle-Methoden
    8. With mdiChild
    9. If .Visible Then
    10. .BringToFront()
    11. Else
    12. dts.Register(.Self, True) ' Optional nur mit den Helpers von ErfinderDesRades
    13. ControlStyling.StyleControls(.Self) ' Optional: eine Erweiterung von ErfinderDesRades
    14. .MdiParent = _mdiParent
    15. .Show()
    16. End If
    17. End With
    18. End Sub
    19. ''' <summary>
    20. ''' Registriert die Handle-Methoden für die Steuerung der Child-Forms
    21. ''' </summary>
    22. Private Sub MdiHandle()
    23. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiOpenHandle
    24. AddHandler _tabControl.SelectedIndexChanged, AddressOf MdiActivateHandle
    25. End Sub
    26. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
    27. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
    28. End Sub
    29. Private Sub MdiOpenHandle(sender As Object, e As EventArgs)
    30. Dim Parent = DirectCast(sender, Form)
    31. If Parent.ActiveMdiChild Is Nothing Then
    32. _tabControl.Visible = False
    33. Else
    34. Parent.ActiveMdiChild.WindowState = FormWindowState.Maximized
    35. Dim tp As New TabPage(Parent.ActiveMdiChild.Text)
    36. If Parent.ActiveMdiChild.Tag Is Nothing Then
    37. tp.Tag = Parent.ActiveMdiChild
    38. tp.Parent = _tabControl
    39. _tabControl.SelectedTab = tp
    40. Parent.ActiveMdiChild.Tag = tp
    41. AddHandler Parent.ActiveMdiChild.FormClosed, AddressOf MdiClose
    42. End If
    43. If Not _tabControl.Visible Then _tabControl.Visible = True
    44. End If
    45. End Sub
    46. Private Sub MdiActivateHandle(sender As Object, e As EventArgs)
    47. Dim tabControl = DirectCast(sender, TabControl)
    48. If tabControl.SelectedTab IsNot Nothing AndAlso tabControl.SelectedTab.Tag IsNot Nothing Then TryCast(tabControl.SelectedTab.Tag, Form).Select()
    49. End Sub
    50. End Module


    Der Aufruf erfolgt dann über:
    ShowMdiChild(TabControlFürMdi, ParentForm, My.Forms.ChildForm, DataSet)
    also konkret für mein Projekt:
    ShowMdiChild(tabMDI, Me, My.Forms.frmMitarbeiter, dts)

    kann man das so machen? Gibt's sinnvolle Abkürzungen? Ist mein erstes Projekt in die Richtung - so wäre es aber universell einsetzbar und kann
    einfach als Modul zu einem Projekt hinzugefügt werden... :)
    Wenn das so passt, würde ich das Tutorial ggf. noch anpassen
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Was kann denn Dein Projekt, was ein TabControl mit und ohne Reiter bzw, ein "normales" MDI nicht kann?
    Erst wenn wir das wissen, können wir Deinen Code beurteilen. ;)
    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!
    Naja, nix weiter. Ich wollte damit sicherstellen, dass ich die komplette MDI-Steuerung (so wie ich sie gern hätte) für jedes Projekt direkt griffbereit hab
    ohne jedesmal den kompletten Code auf die mainform basteln zu müssen :)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    die komplette MDI-Steuerung
    beinhaltet bei Dir was?
    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!
    Das Öffnen und Schließen der Childs, sowie das Handling des TabControls
    (neue Tabs bei ChildÖffnen erstellen, gleiches wieder entfernen wenn das Child geschlossen wird und das richtige Child anzeigen wenn
    im TabControl selektiert wird)

    Wie gesagt, das musste vorher alles in der Parent-Form hinterlegt werden, nun befindet sich das in einem separaten Modul (das kann man
    in andere Projekte mitnehmen) und braucht nur noch einen Aufruf.

    EDIT: es geht auch mehr darum, ob mein geschriebener Code soweit passend ist. Ich hab vorher noch nix bzw. wenn dann nicht viel mit
    Addhandler etc. gemacht
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    RodFromGermany schrieb:

    Was kann denn Dein Projekt, was ein TabControl mit und ohne Reiter bzw, ein "normales" MDI nicht kann?
    Es hat son bischen eine hybride Navigation. Einerseits kann man ChildForms anzeigen - das kann man zB über MenuItem auslösen.
    Andererseits kann man dann mit den TabReitern zwischen den aktuell offenen ChildForms wechseln.
    Und man kann die ChildForms auch wieder schliessen - dabei werden ChildForms korrekt entladen.

    Beim StandardTab sind alle Tabs immer da und geladen. Dassis nachteilig bezüglich Resourcen und User-Orientierung, wenn man wirklich viele Tabs benötigt (wovon die meisten vmtl. eher selten).
    Achso - ausserdem mergt sich das ChildForm-Menü automatisch ins MainMenü - dassis auch ganz nettes Feature.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Achso, ja das hatte ich vergessen zu sagen - bzw. ich dachte es sei (zumindest Rod) klar, was Mdi ist ;) Sorry
    Das mit dem MenuStrip-Merge ist ultrapraktisch und an sich mag ich die Navigation von Mdi in dem Zusammenhang sehr. Man hat vor allem den Vorteil, dass sich alles in einem Fenster abspielt und kann trotzdem
    für jede childForm z.B. auch ein Form.Load-Handle abgreifen, ohne das für ein spezielles Tab zu erledigen (wenn man ohne Mdi mit TabControl für seine Anzeigen arbeitet).
    Der ganze Kram wird in meinem Hauptprojekt neben einem TreeView ablaufen, der wird sogar ausgeblendet sobald man ein Child öffnet, dann hat man mehr Platz :)


    Ich war grad nochmal am Code dran und hab u.a. den Aufruf noch ein wenig vereinfacht, der geht nun wie folgt:

    VB.NET-Quellcode

    1. Me.ShowMdiChild(Of frmUebersicht)(tabMDI, dts, True)

    der "neue" Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module TabbedMdi
    3. Private _tabControl As TabControl
    4. Private _mdiParent As Form
    5. ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets </summary>
    6. <Extension>
    7. Public Sub ShowMdiChild(Of TChild As {Form, New})(mdiParent As Form, mdiTab As TabControl, Optional dts As DataSet = Nothing, Optional CtrlStyling As Boolean = False)
    8. _tabControl = mdiTab
    9. _mdiParent = mdiParent
    10. RegisterMdiHandle() ' Registrierung der Handle-Methoden
    11. Dim Child = New TChild
    12. With Child
    13. If .Visible Then
    14. .BringToFront()
    15. Else
    16. #If False Then ' Erweiterung zum Einklappen eines TreeViews bei Aufruf einer Child
    17. Tree.Visible = False
    18. Tree.Dock = DockStyle.None
    19. #End If
    20. If Not dts Is Nothing Then dts.Register(.Self, True) ' Optional nur mit den Helpers von ErfinderDesRades
    21. If CtrlStyling = True Then ControlStyling.StyleControls(.Self) ' Optional: eine Erweiterung von ErfinderDesRades
    22. .MdiParent = _mdiParent
    23. .MinimizeBox = False ' Optional: Minimize-Boxen auf Child-Forms sind unnötig
    24. .Show()
    25. End If
    26. End With
    27. End Sub
    28. ''' <summary> Registriert die Handle-Methoden für die Steuerung der Child-Forms </summary>
    29. Private Sub RegisterMdiHandle()
    30. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiOpenHandle
    31. AddHandler _tabControl.SelectedIndexChanged, AddressOf MdiActivateHandle
    32. End Sub
    33. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
    34. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
    35. End Sub
    36. Private Sub MdiOpenHandle(sender As Object, e As EventArgs)
    37. Dim Parent = DirectCast(sender, Form)
    38. If Parent.ActiveMdiChild Is Nothing Then
    39. _tabControl.Visible = False
    40. Else
    41. Parent.ActiveMdiChild.WindowState = FormWindowState.Maximized
    42. Dim tp As New TabPage(Parent.ActiveMdiChild.Text)
    43. If Parent.ActiveMdiChild.Tag Is Nothing Then
    44. tp.Tag = Parent.ActiveMdiChild
    45. tp.Parent = _tabControl
    46. _tabControl.SelectedTab = tp
    47. Parent.ActiveMdiChild.Tag = tp
    48. AddHandler Parent.ActiveMdiChild.FormClosed, AddressOf MdiClose
    49. End If
    50. If Not _tabControl.Visible Then _tabControl.Visible = True
    51. End If
    52. End Sub
    53. Private Sub MdiActivateHandle(sender As Object, e As EventArgs)
    54. Dim tabControl = DirectCast(sender, TabControl)
    55. If tabControl.SelectedTab IsNot Nothing AndAlso tabControl.SelectedTab.Tag IsNot Nothing Then TryCast(tabControl.SelectedTab.Tag, Form).Select()
    56. End Sub
    57. End Module
    58. [/spoiler][spoiler]


    Ich denke, das kann sich sehen lassen - läuft auch alles so, als wär's direkt auf der Form gecodet. Ich komm' halt von überall aus dran jetzt :)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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

    @tragl Auch wenn ich mal auch für den @ErfinderDesRades spreche: ich denk schon, dass wir wissen, was MDI ist. ;)
    Wenn ich Deinen Code in ein neues Projekt einfüge, kommen diese Fehler:

    Kannst Du das mal auflösen?
    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!

    RodFromGermany schrieb:

    Kannst Du das mal auflösen?

    ähm, jou. Das is natürlich der Code, der auf meine Anwendung zugeschnitten ist (mit DataSet und ControlStyling). Wollte einen "Universellen" im Tutorial posten wenn klar ist, dass der was taugt ;)
    Hier die "universelle" Fassung, die bei dir auch laufen sollte:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module TabbedMdi
    3. Private _tabControl As TabControl
    4. Private _mdiParent As Form
    5. ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets </summary>
    6. <Extension>
    7. Public Sub ShowMdiChild(Of TChild As {Form, New})(mdiParent As Form, mdiTab As TabControl)
    8. _tabControl = mdiTab
    9. _mdiParent = mdiParent
    10. RegisterMdiHandle() ' Registrierung der Handle-Methoden
    11. Dim Child = New TChild
    12. With Child
    13. If .Visible Then
    14. .BringToFront()
    15. Else
    16. .MdiParent = _mdiParent
    17. .MinimizeBox = False ' Optional: Minimize-Boxen auf Child-Forms sind unnötig
    18. .Show()
    19. End If
    20. End With
    21. End Sub
    22. ''' <summary> Registriert die Handle-Methoden für die Steuerung der Child-Forms </summary>
    23. Private Sub RegisterMdiHandle()
    24. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiOpenHandle
    25. AddHandler _tabControl.SelectedIndexChanged, AddressOf MdiActivateHandle
    26. End Sub
    27. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
    28. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
    29. End Sub
    30. Private Sub MdiOpenHandle(sender As Object, e As EventArgs)
    31. Dim Parent = DirectCast(sender, Form)
    32. If Parent.ActiveMdiChild Is Nothing Then
    33. _tabControl.Visible = False
    34. Else
    35. Parent.ActiveMdiChild.WindowState = FormWindowState.Maximized
    36. Dim tp As New TabPage(Parent.ActiveMdiChild.Text)
    37. If Parent.ActiveMdiChild.Tag Is Nothing Then
    38. tp.Tag = Parent.ActiveMdiChild
    39. tp.Parent = _tabControl
    40. _tabControl.SelectedTab = tp
    41. Parent.ActiveMdiChild.Tag = tp
    42. AddHandler Parent.ActiveMdiChild.FormClosed, AddressOf MdiClose
    43. End If
    44. If Not _tabControl.Visible Then _tabControl.Visible = True
    45. End If
    46. End Sub
    47. Private Sub MdiActivateHandle(sender As Object, e As EventArgs)
    48. Dim tabControl = DirectCast(sender, TabControl)
    49. If tabControl.SelectedTab IsNot Nothing AndAlso tabControl.SelectedTab.Tag IsNot Nothing Then TryCast(tabControl.SelectedTab.Tag, Form).Select()
    50. End Sub
    51. End Module


    Aufruf dann über die Parent-Form via Me.ShowMdiChild(Of ChildForm)(TabControl)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    @RodFromGermany: Konntest du was mit dem neuen Code anfgangen?
    Mir ist grad noch aufgefallen, dass sich Childs mehrfach erstellen lassen - das soll so nichts sein, mal gucken wie ich das gefixed bekomme,
    mit der alten Methode (Code auf Parent-Form) war das nicht so :(
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Ich hab ein wenig rumgespielt.

    Sinnigerweise werden nach zwei hinzugefügten und wieder weggenommenen Childs zwei Mal Child-Button in der Titelzeile des MDI-Parent angezeigt.
    Da musst Du noch ein wenig experimentieren, dass das "globale" MDI-Handling läuf wie erwartet.
    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!

    RodFromGermany schrieb:

    Da musst Du noch ein wenig experimentieren, dass das "globale" MDI-Handling läuf wie erwartet.

    ja, das hängt leider damit zusammen, dass es überhaupt möglich ist 2 oder mehrere der gleichen Childs zu öffnen... ich krieg grad das <X
    weil es absolut nicht hinhauen will:
    EDIT: es lassen sich nun keine Childs mehr doppelt und noch mehr öffnen (ich hatte ein Handle vergessen -> Zeile 27) jetzt ist nur noch das "Problem", dass bei erneutem öffnen wollen des Childs
    das vorhandene nicht selektiert und angezeigt wird

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module TabbedMdi
    3. Private _tabControl As TabControl
    4. Private _mdiParent As Form
    5. ''' <summary> Anzeigen einer ChildForm - Optional mit ControlStyling und Registrierung des DataSets </summary>
    6. <Extension>
    7. Public Sub ShowMdiChild(mdiParent As Form, Child As Form, mdiTab As TabControl)
    8. _tabControl = mdiTab
    9. _mdiParent = mdiParent
    10. RegisterMdiHandle() ' Registrierung der Handle-Methoden
    11. With Child
    12. If .Visible Then
    13. .BringToFront()
    14. Else
    15. .MdiParent = _mdiParent
    16. .MinimizeBox = False ' Optional: Minimize-Boxen auf Child-Forms sind unnötig
    17. .Show()
    18. End If
    19. End With
    20. End Sub
    21. ''' <summary> Registriert die Handle-Methoden für die Steuerung der Child-Forms </summary>
    22. Private Sub RegisterMdiHandle()
    23. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiOpen
    24. AddHandler _mdiParent.MdiChildActivate, AddressOf MdiActivate
    25. AddHandler _tabControl.SelectedIndexChanged, AddressOf MdiActivate
    26. End Sub
    27. ''' <summary> Stellt beim Schließen des Childs sicher, dass die entsprechende TabPage entfernt wird </summary>
    28. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
    29. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
    30. End Sub
    31. ''' <summary> Öffnen bzw. Selektieren der Childform </summary>
    32. Private Sub MdiOpen(sender As Object, e As EventArgs)
    33. If _mdiParent.ActiveMdiChild Is Nothing Then
    34. _tabControl.Visible = False
    35. Else
    36. _mdiParent.ActiveMdiChild.WindowState = FormWindowState.Maximized
    37. Dim tp As New TabPage(_mdiParent.ActiveMdiChild.Text)
    38. If _mdiParent.ActiveMdiChild.Tag Is Nothing Then
    39. tp.Tag = _mdiParent.ActiveMdiChild
    40. tp.Parent = _tabControl
    41. _tabControl.SelectedTab = tp
    42. _mdiParent.ActiveMdiChild.Tag = tp
    43. AddHandler _mdiParent.ActiveMdiChild.FormClosed, AddressOf MdiClose
    44. End If
    45. If Not _tabControl.Visible Then _tabControl.Visible = True
    46. End If
    47. End Sub
    48. Private Sub MdiActivate(sender As Object, e As EventArgs)
    49. If _tabControl.SelectedTab IsNot Nothing AndAlso _tabControl.SelectedTab.Tag IsNot Nothing Then TryCast(_tabControl.SelectedTab.Tag, Form).Select()
    50. End Sub
    51. End Module


    Zum Vergleich hier nochmal der urspr. Code, welcher auf die Parent-Form gelegt werden kann, der funzt einwandfrei!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub ShowMdiChild(frm As Form)
    3. With frm
    4. If .Visible Then
    5. .BringToFront()
    6. Else
    7. .MdiParent = Me
    8. .Show()
    9. End If
    10. End With
    11. End Sub
    12. Private Sub MdiOpen(sender As Object, e As EventArgs) Handles Me.MdiChildActivate
    13. If Me.ActiveMdiChild Is Nothing Then
    14. TabControl1.Visible = False
    15. Else
    16. Me.ActiveMdiChild.WindowState = FormWindowState.Maximized
    17. Dim tp As New TabPage(Me.ActiveMdiChild.Text)
    18. If Me.ActiveMdiChild.Tag Is Nothing Then
    19. tp.Tag = ActiveMdiChild
    20. tp.Parent = TabControl1
    21. TabControl1.SelectedTab = tp
    22. Me.ActiveMdiChild.Tag = tp
    23. AddHandler Me.ActiveMdiChild.FormClosed, AddressOf MdiClose
    24. End If
    25. If Not TabControl1.Visible Then TabControl1.Visible = True
    26. End If
    27. End Sub
    28. Private Sub MdiClose(sender As Object, e As FormClosedEventArgs)
    29. TryCast(TryCast(sender, Form).Tag, TabPage).Dispose()
    30. End Sub
    31. Private Sub MdiActivate(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged, Me.MdiChildActivate
    32. If TabControl1.SelectedTab IsNot Nothing AndAlso TabControl1.SelectedTab.Tag IsNot Nothing Then TryCast(TabControl1.SelectedTab.Tag, Form).Select()
    33. End Sub
    34. Private Sub btnChild_Click(sender As Object, e As EventArgs) Handles btnChild1.Click, btnChild2.Click, btnChild3.Click
    35. Select Case True
    36. Case sender Is btnChild1 : ShowMdiChild(My.Forms.childForm1)
    37. Case sender Is btnChild2 : ShowMdiChild(My.Forms.childForm2)
    38. Case sender Is btnChild3 : ShowMdiChild(My.Forms.childForm3)
    39. End Select
    40. End Sub
    41. End Class

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „tragl“ ()

    @tragl OK.
    5 Icon-Sätze noch bei 3 offenen Child-Views.
    Es lässt sich jede Child-Klasse in nur einer Instanz öfnen, das ist doch ein wesentliches MDI-Feature.
    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!

    RodFromGermany schrieb:

    5 Icon-Sätze noch bei 3 offenen Child-Views


    Also da stimmt bei dir was nicht, bei mir gibt's generell nur einen Icon-Satz - egal wieviele Childs offen sind.
    Ich hab dir mal ein Testprojekt mit dem aktuellen Code angehangen, der Code auf der Parent-Form ist auskommentiert.

    Wie gesagt, das Einzige was aktuell nicht funzt ist das Zeigen/Auswählen des bereits offenen Childs wenn man es erneut öffnen möchte.
    Dateien
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    @tragl Unklar. Ich habe Deinen Code aus Post #12 verwendet, nur meine GUI sieht etwas anders aus...
    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!
    @tragl Bötöschön:
    Dateien
    • MdiModul.zip

      (21,18 kB, 62 mal heruntergeladen, zuletzt: )
    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!
    @RodFromGermany
    jo unglaublich, scheint ein Bug zu sein - ohne MenuStrip macht er die Faxen mit den Icons, mit Menustrip nicht.
    Siehe Anhang

    LG
    Dateien
    • MdiModul00.zip

      (21,51 kB, 61 mal heruntergeladen, zuletzt: )
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Doch nicht ganz.
    Füge ich meiner MainForm ein Menü hinzu, scheint es zu klappen.
    Füge ich der ChildForm ebenfalls ein Menü hinzu, spinnt er wieder.
    Das ist ein etwas älterer Code von Dir mit nur einer Child-Klasse.
    TestMdiHandling.zip
    Beim C++ MFC MDI-Handling war es so, dass die MainForm bei einem Child-Vollbild das Child-Menü in der MainForm angezeigt wurde, das passiert hier nicht.
    Ob das nun ohne Dein TabControl bei .NET passiert oder nicht, habichnich probiert.
    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!

    RodFromGermany schrieb:

    Füge ich der ChildForm ebenfalls ein Menü hinzu, spinnt er wieder.


    Ich hab' doch sogar allen 3 Childforms in deinem Projekt ein Menu hinzugefügt, der merged immer das menu des aktiven Childs mit dem der Hauptform zusammen.
    Was ich noch gemacht hatte, war das TabControl oben angedockt und links ein Panel für die Buttons - dann ist der "freie" Bereich für die Childs sozusagen fest vorgegeben.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: