Form in Form positionieren

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Form in Form positionieren

    Hallo,

    ich möchte gerne, wie die Überschrift es schon aussagt eine Form in der Hauptform automatisch positionieren.

    Ich habe eine Hauptform (Form1), MenuStrip1 (Menüleiste), ToolStrip1 (diverse Formaufrufe).

    mit dem folgendem Code, kann ich bereits eine Form aufrufen, aber ich schaffe es nicht die "neue" Form in die obere linke Ecke zu positionieren, also direkt unterhalb der ToolStrip-Leiste und dem linken Rand von Form1. Außerdem kann ich anschließend auch nicht mehr den ToolStripButton auf Form1 nicht mehr betätigen, weil die "neue" Form den Focus hat. Ich möchte aber nachdem ich eine neue Form öffne noch andere neue Forms öffnen und diese sollen dann immer an den rechten Rand des vorher erzeugten Forms andocken.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim i As Integer = 0
    3. Private Sub ToolStripButton1_Click(ByYal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
    4. Dim myform(10) As Form
    5. i = i + 1
    6. myform(i) = New Form
    7. With myform(i)
    8. .Width = 100
    9. .Height = 100
    10. .MaximizeBox = False
    11. .MinimizeBox = False
    12. .ShowInTaskbar = False
    13. .ShowIcon = False
    14. .Text = "Meine Form " & i
    15. .Show(Me) '.ShowDialog(Me)
    16. End With
    17. End Sub
    18. End Class


    Ich hoffe es ist klar was ich meine. Hat jemand eine Idee?

    Danke
    newbie

    Edit:
    Das mit dem Focus hat sich erledigt die myform.ShowDialog war "Dialog" zu viel.

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

    Überlegmal, ob ein TabControl nicht das bessere UI-Design wäre, und tu die Sachen vom 2. Form dann auf TabPage2.

    Aber wenndes unbedingt toll findest:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    2. Dim frm As New Form
    3. frm.StartPosition = FormStartPosition.Manual
    4. With Me.Bounds
    5. frm.Location = New Point(.Right, .Top)
    6. End With
    7. frm.Show(Me)
    8. End Sub
    Hallo,

    danke für eure Antworten. Die MDI Variante scheint mir am bessten geeignet zu sein.
    Funktioniert auch soweit.

    Mein Projekt sieht vor, dass ich unterschiedliche ChildForms x-mal aufrufen kann. Dabei sollen die Inhalte der ChildForm einer "sorte" die selben Steuerelemente haben.
    Nun stellt sich die nächste Frage. Wie bekomme ich diese in die ChildForm? Ich habe natürlich vorher versucht, aber vergebens.
    Normal ist man ja gewohnt in eine Form Steuerelemente zu plazieren und diese zu bearbeiten, wenn jetzt auf einmal die Form noch garnicht existiert ist das etwas schwierig.
    Meine Versuche unter anderem so aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim i As Integer = 0
    3. Private Sub ToolStripButton1_Click(ByYal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click
    4. Dim myform As Form
    5. Dim status as Label
    6. i = i + 1
    7. myform = New Form
    8. With myform
    9. .Width = 200
    10. .Height = 200
    11. .MaximizeBox = False
    12. .MinimizeBox = False
    13. .ShowInTaskbar = False
    14. .ShowIcon = False
    15. .Text = "Meine Form " & i
    16. .Show()
    17. End With
    18. status = New Label
    19. With status
    20. .Text = "Status: "
    21. .Show()
    22. End With
    23. End Sub
    24. End Class


    Es kommt zwar keine Fehlermeldung, aber das Label wird auch nicht dargestellt.

    Was mache ich falsch?

    MfG
    newbie
    du mußt es natürlich den Controls des Forms zufügen.

    Aber du sagst ja selbst:
    Normal ist man ja gewohnt in eine Form Steuerelemente zu plazieren und diese zu bearbeiten, wenn jetzt auf einmal die Form noch garnicht existiert ist das etwas schwierig.


    Es ist ziemlich irrsinnig, ein ordentliches Form komplett per Code zu gestalten. Irrsinnig zu proggen, und bei Änderungen wird das immer wüster.
    Man tut ja Panels drauf, Splitcontainer, Labels, Button, Listboxen, BindingSources, DataGridviews, und bei letzteren muß man jede Column konfigurieren, und das ganze Zeug muß korrekt gedockt sein, in der richtigen Reihenfolge - da kriegt man entweder den Vogel, oder das Ergebnis sieht besch...eiden aus.
    Ich hatte das mal bei einem Programm gemacht, bei dem der Inhalt der Forms sehr stark von anderen Daten abhängig war und ich somit bestimmt 20 verschiedene Forms hätte basteln müssen.
    Da hab ich einfach die Forms vom code designen lassen. Das eigentliche programm war in drei tagen fertig, das "designen" hat mich zwei monate gekostet!

    Absoluter irrsinn!
    ohhh man...

    ihr könnt einem ja Mut machen :)

    ErfinderDesRades schrieb:

    du mußt es natürlich den Controls des Forms zufügen.

    kannst du mir auch veraten wie das geht?


    Ich glaube euch das, seid mir bitte nicht sauer, aber ich möchte das wenigstens einmal gemacht haben bzw. eigene Erfahrungen sammeln. Eigentlich sollen in die ChildForms nicht soviel zeug rein nur Labels und Buttons. Das Problem ist mir fallen im moment keine vernüpftigen Alternativen ein.

    Übrigens das eigentliche Programm ist bei mir auch schon fertig, hat ca. eine Woche gedauert.
    Kurz gesagt habe ich, einen OPC-Server/Client in einem geschrieben mit Hilfe von LibNoDave, dass ganze ist mir aber zu statisch, da ich beruflich sehr viel mit SPS zu tun habe wollte ich mir das ganze als eine dynamische Version erstellen. Vergleichbar mit PLC-Sim (von SIEMENS).
    Der Vorteil ist, dass ich später nicht die teuren Linzensierten Proggs von der o.g. Firma brauche um mal schnell auf eine SPS mit meinem privat Notebook zu schauen/steuern, da ich ja TCP-over-IP verwende und wahlweise USB-MPI Adapter und somit kein PG brauche mit einer MPI Schnittstelle.

    MfG
    newbie
    Von solchen echten Fachanwendungen habe ich keine Ahnung. Du solltest auf jeden Fall aufpassen, dass du deinen Code richtig ordentlich dokumentierst, damit du dich auch später wieder einlesen kannst.
    Ich habe mir bei menem Programm damals dazu ein eigenes kleines Buch geschrieben (ca. 70 Seiten) damit ich weis was wann wo ausgeführt werden soll.
    Auch würde ich an deiner Stelle so viel wie möglich Module erstellen, das Ordnet das Chaos ein wenig, und der Form selbst nur den Code zum ausführen der Subs in den Modulen geben. Dadurch wird es verhältnismäßig übersichtlich. Geb den Subs eindeutige Namen also nicht "public sub ack_1" sondern z. B. "public sub buttonreihe_2_erstellen".
    Hat mir sehr geholfen.
    Wenn du später in deinem Programm etwas ändern willst ist dies enorm wichtig.
    Hallo nochmal,

    danke für eure Tipps, die werde ich beherzigen.

    Vitox schrieb:

    Me.Controls.Add(Form5)

    Das klappt iwie nicht. Komme nicht ganz klar, könnte ich evtl. ein Beispiel in Verbindung mit meinem Code haben bitte.
    Sry leute, wahrscheinlich ist es eigentlich ganz einfach, aber ich habs noch nicht raus.

    MfG
    newbie
    Also für das Form innerhalb einer Form habe ich ein Tutorial gemacht: [VB 2010] Form in Form positionieren

    Da damit aber keine neue Form erstellt wird, sondern nur eine im Designer erstellte Form hinzugefügt wird, gebe ich dir nochmal den Code, den du brauchst:

    VB.NET-Quellcode

    1. ' Form als frm definieren.
    2. Dim frm As New Windows.Forms.Form
    3. ' Toplevel eigenschaft von frm ausschalten
    4. frm.TopLevel = False
    5. 'Form richtig zurechtruecken
    6. frm.StartPosition = FormStartPosition.Manual
    7. frm.Location = New Point(10, 10)
    8. 'Groesse der Form definieren
    9. frm.Height = 100
    10. frm.Width = 100
    11. ' frm anzeigen
    12. frm.Show()
    13. ' frm in die jetzige Form einfügen
    14. Me.Controls.Add(frm)
    15. 'Label erstellen
    16. Dim l As New Label
    17. 'Text des Labels festlegen
    18. l.Text = "sonstwas"
    19. 'Label der Form hinzufuegen
    20. frm.Controls.Add(l)
    21. 'Label anzeigen
    22. l.Show()
    Dazu habe ich eine kleine Schönheitsanmerkung: Variablen sollte man meiner Meinung nach immer am Anfang des Blocks deklarieren, in dem sie vorkommen. Z.B.:
    (hat jetzt nichts mit dem Thema zu tun)

    VB.NET-Quellcode

    1. Dim int As Integer = 123
    2. If int = 10 Then
    3. Dim intern As Integer
    4. Dim abc As String
    5. MessageBox(intern.ToString())
    6. abc = "abc"
    7. MessageBox(abc)
    8. End If


    Damit wird bei Verschachtelung 1. die Performance verbessert, 2. der Speicherverbrauch verringert und generell die Codeübersichtlichkeit gefördert.

    Gruß
    ~blaze~
    Auch wenn der Thread mit Form im Form positionieren überschrieben ist, will Newbie keine in einer ControlCollection eingebettete Form, sondern er meint MDI.

    Zu Forms in Forms kann ich noch höchstens meinen Senf abgeben, dassichdas für eine Abartigkeit halte. Weil dadurch spezifische Funktionalität eines Forms unterbunden ist, und wenn man die nicht braucht, soll man UserControl nehmen, das ist dafür da.