Formhandling (MdiContainer)

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    Formhandling (MdiContainer)

    Hi,

    eine Frage.
    Wie bekomme ich es hin das mein Toolstripmenüitem fix an einem punkt bleibt?
    Beim maximieren einer Form in meiner Form wird das ToolStrip verschoben- wieso?

    ...anhänge sind dabei, Bild 1 Zeigt die Form in der Form und Bild 2 die maximierte Form.

    Grüße
    Bilder
    • Toolstrip1.png

      9,08 kB, 345×349, 188 mal angesehen
    • Toolstrip2.png

      6,49 kB, 407×274, 183 mal angesehen
    Option Strict On!
    Offensichtlich hängt das Menü am Container, das wird halt so angezeigt.
    Soll es am MdiChild hängen?
    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!
    Nein, deswegen irritiert es mich das nun das ToolStripMenü "eins" nach unten rutscht.
    Mir wäre es lieb wenn mein Menüband "oben" fix unter der "MainForm" bleibt.

    Ich habe schon versucht das Menüband in ein Panel einzupflegen, das ging leider (irgendwie) gar nicht.

    EDIT:
    Sorry, habe dich falsch verstanden.

    Also; Das stimmt, ja. Das Menüband ist ja in Form1, aber wenn ich die Form2 einlade und maximiere, möchte ich, dass das Menüband weiterhin "fix" bleibt, also nicht nach unten wandert..
    Option Strict On!

    Drahuverar schrieb:

    also nicht nach unten wandert
    Das ist bei MDI so ein Problem.
    Menüs vom Container werden da dem Child zugeordnet, wenn dies maximiert ist.
    Kann sein, dass es da eine besondere Property gibt, die dies verhindert. Musst Du mal gezielt nach suchen.
    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!
    Also ist die Parent-Form ohne Border und die Child Form mit Border?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Schamash schrieb:

    Child Form mit Border?
    Nein.
    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!
    Merkwürdig, in einem "neuen" Projekt passiert folgendes:(siehe Bild)...das ist ja mal angenehmer-wieso aber ist das bei dem anderen Projekt so?Kann es daran liegen das ich einige Controls darauf angelegt habe?...ich geh der Sache mal auf den Grund...
    Bilder
    • Toolstrip3.png

      19,82 kB, 587×307, 165 mal angesehen
    Option Strict On!
    Das ist normal bei MDI-Anwendungen und mit Bordmitteln nicht zu unterbinden.
    Ein Maximiertes MDI-Child ist gar kein eigenes Fenster im eigentlichen Sinne mehr, sondern wird quasi zum Client-Bereich des MDI-Parents.
    Wie gesagt: Das ist Windows-Standard und lässt sich nicht ändern.

    Wenn dir das nicht gefällt, wirst du dir ein eigenes System mit Client- und Parent-Fenstern zusammenzimmern müssen, wovon ich aber eher abraten würde. Zum einen sind Anwendungen, die in ihrem Handling dem gewohnten Standard entsprechen mMn zu bevorzugen und zum anderen müsstest du das Rad fast komplett neu erfinden - mit allen Kinderkrankheiten und Gefahren, besondere Konstellationen auf den Rechnern anderer User zu übersehen oder Fehler einzubauen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Hmm,

    Ich habs gerade nachgebaut.
    Zuerst hatte ich das Ergebniss wie im Anfangsbeitrag.
    Anschließend hab ich den MenuStrip gelöscht und wieder neu erstellt dann hatte ich das Ergebnis wie @Drahuverar vor 5 min
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @Schamash
    Dann bin ich ja froh, dass ich nicht der einzige bin.
    Ich kann dieses Problem jetzt nicht mehr nachempfinden, irgendwas stimmt da wohl "intern" nicht.

    @Arby
    Okay. Generell ist das ja eine feine Sache, scheint aber auch einige Probleme mit sich zu ziehen..
    Ich mache mir mal eine kleine Beispielanwendung und beobachte dieses Verhalten mal bei anderen Rechnern. (Nicht das ich verschiedene Darstellungen habe..,)
    Option Strict On!
    Wenn ich nun eine Form aufmache,
    möchte ich ja auch überprüfen ob diese schon offen ist.

    Wie kann ich das denn Handhaben?
    IsHandleCreated ist denke ich schon..okay für mich, aber leider starte ich meine Anwendung über eine DLL, weswegen eigentlich die erste Form (MainForm) ja schon ein Kind ist, so zusagen. Nun habe ich Probleme bei dieser einfachen Angelegenheit:

    VB.NET-Quellcode

    1. Dim new_Window As New TestForm
    2. If new_Window.IsHandleCreated = True Then
    3. MsgBox("kk")
    4. Else
    5. new_Window.MdiParent = Me
    6. new_Window.Show()
    7. End If


    ...weil ich die immer wieder "neu" erstelle funktioniert diese abfrage wohl nicht...
    Also:

    VB.NET-Quellcode

    1. Dim _Window As TestForm
    2. If _Window.IsHandleCreated = True Then
    3. MsgBox("kk")
    4. Else
    5. _Window.MdiParent = Me
    6. _Window.Show()
    7. End If


    Da gibt's erstmal ne saubere Ausnahme und ich kann mein Programm abschießen.

    "System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Option Strict On!
    @Drahuverar Dies sollte eigentlich völlig ausreichen.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(object sender, EventArgs e)
    2. Dim new_Window As New TestForm
    3. new_Window.MdiParent = Me
    4. new_Window.Show()
    5. 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!

    Drahuverar schrieb:

    erscheint wieder die Form in meinem MdiContainer
    Völlig korrekt, genau das ist der Sinn von MDI.
    Wenn Du das nicht willst, mach kein MDI und gugst Du hier.
    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!
    Dann lager die Objektvariable für die MDI-Child-Form aus der Methode in die Klasse aus und prüfe sie vorher ab.

    VB.NET-Quellcode

    1. Private frmChild As Form
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If frmChild Is Nothing OrElse frmChild.IsDisposed Then
    4. frmChild = New Form1
    5. frmChild.MdiParent = Me
    6. frmChild.Show()
    7. End If
    8. End Sub
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    und prüfe sie vorher ab.
    MDI funktioniert anders, da genügt ein Flag oder halt Nicht-MDI.
    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!

    Drahuverar schrieb:

    Flag
    ist ein Boolean, das einen speziellen Zustand merkt / signalisiert.
    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!
    @Arby
    Stimmt,...außerhalb :S
    Da muss man auch mal drauf kommen.. ;)
    Vergesse so etwas immer.
    Aber das ist ein Ansatz mit dem ich mir nun etwas "weiterführendes" bauen kann.

    Ich danke euch vorerst mal. Es kann sein das sich noch 1-2 Fragen auftun, weswegen ich diesen Beitrag noch offen lasse.

    Edit:
    Mal als "hirnspielerei":
    Ich mache mir nun eine Textbox und erstelle mir darüber "Formen"

    VB.NET-Quellcode

    1. Private frmChild As Form
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If frmChild Is Nothing OrElse frmChild.IsDisposed Then
    4. frmChild = New Form
    5. frmChild.Name = Textbox1.Text
    6. frmChild.Text = Textbox1.Text
    7. frmChild.MdiParent = Me
    8. frmChild.Show()
    9. End If
    10. End Sub


    Jetzt würde ich gerne eine List Of anlegen, die "frmChild" beinhaltet, um zu überprüfen, ob diese Form schon angelegt ist, wenn ich meine List Of durchsuche.
    Könnten sich hier Probleme auftun?
    ~Komme gerade nicht zum testen. (ansonsten melde ich mich später nochmal ^^)
    Option Strict On!

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