mehrere Forms umschalten

  • VB.NET

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

    mehrere Forms umschalten

    Hallo :)

    ich möchte zwischen mehreren Forms "umschalten". Derzeit mache ich das wie folgt:


    Button auf Form1:

    Private Sub Button_Wechsel_Click(...)
    Me.hide()
    Form2.Show()
    End Sub

    Dabei tauchen jedoch mehrere kleine Probleme auf (alle Google-Treffer zum Thema beschäftigen sich hauptsächlich mit Datenaustausch zwischen Forms, direkt zum Problem habe ich nichts gefunden...):

    1. Wenn ich danach das zweite Form schließe, beendet sich nicht das Programm - Me.hide ist offensichtlich nicht das richtige Mittel um das erste Form verschwinden zu lassen. Was wäre besser? Me.Close() nimmt gleich die ganze Anwendung mit...

    2. Wie sorge ich dafür das sämtliche Forms immer die Position und Größe ihres Vorgängers "erben"...

    3. Ich möchte das beim Starten der Anwendung einmalig eine bestimmte Prozedur ausgeführt wird. Bisher habe ich nur die Möglichkeit das beim Laden des ersten Forms zu machen, diese Lösung ist aber ungünstig da der User das erste Form immer mal wieder aufsucht, dann aber nicht jedesmal besagte Prozedur ausgeführt werden soll.
    (passt nicht ganz in den Kontext hier, ich möchte euch aber nicht mit zu vielen Billigthreads nerven...)

    Danke für eure Antworten

    lg Christian

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

    cl10k schrieb:

    1. Wenn ich danach das zweite Form schließe, beendet sich nicht das Programm - Me.hide ist offensichtlich nicht das richtige Mittel um das erste Form verschwinden zu lassen. Was wäre besser? Me.Close() nimmt gleich die ganze Anwendung mit...

    Me.Hide ist definitiv das richtige Mittel um die Form zu verbergen. Me.Close nimmt nur dann die ganze Anwendung mit wenn das in den Projekteigenschaften so eingestellt ist (Anwendung schliessen wenn Startform geschlossen wird o.ä.). Unabhängig davon kannst Du die Anwendung immer mit Application.Exit aus dem Code heraus beenden.

    cl10k schrieb:

    2. Wie sorge ich dafür das sämtliche Forms immer die Position und Größe ihres Vorgängers "erben"...

    Was bitte sehr ist ihr Vorgänger ? Wenn Du meinst dass Form2 die gleiche Position einnimmt wie Form1 , so musst Du das manuell setzen. Die Position durch die Property .Location, die Grösse über die Property .Size

    cl10k schrieb:

    Ich möchte das beim Starten der Anwendung einmalig eine bestimmte Prozedur ausgeführt wird.

    Das Load Event wird nach dem Me.Hide nicht wieder aufgerufen wenn Du sie mit Me.Show wieder anzeigst, nach dem Me.Close schon.
    Zum Übergeben der Größe, Position oder was auch immer an die nächste Form könntest du die Show-Sub der Formen überschreiben und dann da die Werte als Parameter mitgeben (FormXY.Show(Size, Location, Windowstate...). Nur nicht vergessen innerhalb der überschriebenen Sub nochmal Me.Show aufzurufen....
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Ich muss zum Thema Forms Close bzw Hide nochmal nachhaken.

    Bis jetzt nutze ich Me.Close. Das hat allerdings den Nachteil, dass ich die Zustände der Kontrollelemente immer speichern muss um dem User beim Zurückkehren auf ein Form die bereits gemachten Eingaben zu setzen.

    Me.Hide erscheint mir da eigentlich wesentlich stressfreier, ABER ich habe keine Ahnung wie ich die Anwendung richtig beende, wenn der User auf das "X" im Fenster klickt. Ich möchte eigentlich keinen extra Button ala "Beenden" auf jedem Form plazieren müssen.

    Ich bräuchte eine Einstellung nach dem Muster: Wenn der User IRGENDEIN Form beendet soll auch die komplette Anwendung geschlossen werden.
    Sry, in diesem Zusammenhang tut sich dann noch ein weiteres Problem auf.

    Bisher hatte ich beim Wechsel zwischen Forms Me.Close und Form.Show benutzt. Die Geometrie des zu schließenden Forms habe ich gespeichert und dann an das neu geöffnete Form über das Load Event übergeben. Das klappte ohne jegliches Flackern.

    Jetzt versuche ich etwas ähnliches, nur das ich Me.Hide für das alte Form1 benutze und noch auf dem Form1 folgende Befehle ausführe

    Form_Hoehe = Me.height
    Form_Breite = Me.width
    Form Position_X = Me.Left
    Form Position_Y = Me.Top
    Form_Status = Me.WindowState
    Me.Hide
    Form2.Show
    Form2.height = Form_Hoehe
    Form2.width= Form_Breite
    Form2.Left= Form Position_X
    Form2.Top= Form Position_Y
    Form2.WindowState = Form_Status

    Das Problem ist hierbei ein ärgerliches Flackern. Form2 wird kurzzeitig erst an der Default Position gezeichnet und dann erst auf die gewünschten Koordinaten verschoben.
    Ich habe bereits DoubleBuffer und Form2.SuspendLayout und -.Resumelayout versucht jedoch ohne Erfolg.

    Ich würde die Geometrie gern direkt bei Form2.Show als Parameter übergeben damit dieser erste Default Zeichenvorgang gleich richtig erfolgt, habe dazu jedoch nichts gefunden.

    Der Tipp vom Vatter direkt das Form2 Event "Show" für die Geometrie zu missbrauchen funktioniert auch nicht weil dieses Event nur einmalig ausgeführt wird.
    Setze die Form2.Startposition auf manual:

    VB.NET-Quellcode

    1. ' Set form2 Size
    2. Form2.Size = Me.Size
    3. ' define start position manually
    4. Form2.StartPosition = FormStartPosition.Manual
    5. Form2.Location = Me.Location
    6. ' play Hide and Show
    7. Me.Hide()
    8. Form2.Show()