Problem mit der Hauptform

  • VB.NET

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

    Problem mit der Hauptform

    Hi,

    ich habe ein Projekt, welches über application.run( New StartForm) mit der ersten Form gestartet wird. Durch ein Button gelange ich auf ein zweites Form und rufe Hide() für das erste From auf. Dadurch wird unschtbar wie gewollt. Allerdings benötige ich auf der zweiten Form ein zurück Button mit dem ich das zweite From schließe(was auch funktioniert) und das erste From wieder sichtbar mache. Genau da liegt das Problem. Ich habe keine Ahnung wie ich das anstelle. Ich habe schon recht viel versucht aber ich kann einfach nicht auf das erste Form zugreifen um visible = True zusetzten

    Ich hoffe ihr könnt mir helfen

    Danke schonmal

    Gruß
    Jan
    du musst dem zweiter zweiten Form eine Refrenz auf die erste Form mitgeben.
    zb.:

    VB.NET-Quellcode

    1. public Class 2teForm
    2. public ersteForm as form
    3. Public Sub New(Byval _ersteForm as Form)
    4. ersteForm=_ersteForm
    5. End Sub
    6. End Class


    Somit kannst du die erste Form dann mit:

    VB.NET-Quellcode

    1. ersteForm.show()

    wieder sichtbar machen.

    mfg.skyscater
    Danke skyscater genau das habe ich gesucht!!! - Muss natürlich noch InitializeComponent() in das New (nur der vollständigkeits halber) ;)

    Habe aber nun ein weiteres Problem:

    VB.NET-Quellcode

    1. Form1.Show()
    2. Me.Close()


    Das verursacht dass zwar ds From1 ansatzweißewieder zuerkennen ist allerdings schließt sich das Programm danach komplett.

    Mit Me.Hide() geht es. Das Problem dabei ist, dass wenn ich auf dem nun wieder sichtbaren Form1 wieder Form2 aufrufe erstelle ich ja ein neues Form2. Somit werden bei jedem Zurück ein neues unnötiges Form2 produziert. Man könnte nun in Form1 abrufen ob Form2 schon existiert und das dann wieder sichtbar machen aber gibt es da nicht eine andere Lösung?
    Sorry,
    ich finde dieses Design äußerst fragwürdig...
    Zum einen ist es zwar blöderweise möglich aber funktioniert oftmals nicht, eine Farm mit dem Klassennamen anzusprechen. Normalerweise muß immer eine Instanz (Dim bla as Formblub) erzeugt werden, auf die mit dem Objektnamen (hier bla) zugegriffen wird. Mit Formblub.Show, wird u.U. eine neue Instanz erzeugt, was großes Durcheinander mit sich bringt. Es ist überhaupt unsauber, von einer untergeordneten Klasse aus auf die aufrufende Klasse zuzugreifen.
    Besser ist in so einem Fall die Verwendung eines Dialoges innerhalb eines Using-Blocks. Da kann die Instanz der Form2 mit .Showdialog aufgerufen werden. Die InstanzvonForm2 ist dann im Vordergrund und verhindert ein Anklicken der Hauptform.
    Außerdem gibt es in den Projekteinstellungen einen Haken, ob die Anwendung mit Schließen des Startformulars oder mit der letzten Form beendet werden soll.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Der Using block ist eine schöne Sache! kannte ich vorher noch nicht. Bei mir ist allerdings Form1 nicht das Hauptform im Sinne von, dass da der Hauptteil des Programm drin steckt. Ich habe mehrer Forms inklusive Form1 mit dessen Hilfe man durch Auswählen auf das finale Form kommt(es gibt insgesammt ca. 30). Es geht bei dem Projekt um Datenerfassung und die Vorwahl dient zur exakten Experimentauswahl. Ich muss also falls man sich irrt immer wieder zurück und bei den finalen Forms muss ich auch noch zurück zum Anfang gelangen können.

    Eigentlich müsste doch sowas öffter vorkommen als nur in meinem Projekt. Aber ich finde leider nichts

    Eggord schrieb:

    mit dessen Hilfe man durch Auswählen auf das finale Form kommt(es gibt insgesammt ca. 30).
    Vielleicht solltest Du Dir mal das TabControl ansehen (gibt es auch ohne Reiter). Da hast Du deutlich weniger administrativen Aufwand.

    Vatter schrieb:

    Zum einen ist es zwar blöderweise möglich aber funktioniert oftmals nicht, eine Farm mit dem Klassennamen anzusprechen.
    Das ist leider so ein VB-Sch...ade. VB erzeugt hierbei implizite Instanzen der jeweiligen Form, C# macht das ordentlich.
    @Eggord: Wenn Du dann Daten zwischen expliziten und impliziten Formen austauschen willst, kommt Grütze bei raus. Diese ist dann weder grün noch rot sondern Nothing.
    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!

    Vatter schrieb:

    Zum einen ist es zwar blöderweise möglich aber funktioniert oftmals nicht, eine Farm mit dem Klassennamen anzusprechen.
    Das habe ich gemerkt. Bei einem Test Projekt wo ich verschiedene Sachen vonvb.net ausprobiert habe konnte Form2 einfach mit dem klassennamen aufrufen ohne ein Objekt zu erstellen und die einzelnen Forms auch schließen oder unsichtbar machen. Das funzt bei meinem richtigen Projekt leider nicht. Ohne vielmehr zum Glück -> jetzt bin ich gezwungen richtig zu programmieren ;)

    @RodFromGermany: Cool ich wusste nicht dass man die Reiter wegbekommt! Schöne Sache! Danke für die Info! Aber du meinst ich sollte auch die finalen Forms im TabControl designen? Das wäre ganz schön viel und groß. So wären ja alle Experimente immer gleichzeitig geladen und man muss immer hin und her switchen. Ich würde die lieber in eigenen Forms belassen-ich finde da kann man dann auch schöner experimente hinzufügen und entfernen . Allerdings werde ich die Vorauswahl mit dem Tabcontrol ohne Reiter machen. So habe ich die Auswahl in einem Form, was ich gut finde und es ist wie ich finde nicht so aufwendig wie UserControl. Die werde ich aber bei den finalen Controls gut verwenden können.

    Aber ein Problem bleibt leider noch bestehen. Beim Schließen von Form 2 und sichtbar machen von Form 1 schließt das komplette Programm auch wenn ich Form 2 mit ShowDialog() aufrufe.

    Ich hoffe ihr könnt mir dabei nochmal helfen.

    @All: DANKE nochmal. Durch euch ist der Aufbau doch schon viel schöner geworden!
    Du kannst User-Controls bauen und jedem einzelnen Tab sein eigenes User-Control geben.
    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!
    Ja ich möchte ungern mit insgesamt 40 Tabs rumhantieren. Da sehe ich mich schon fluchen :P . Beim ständigen hin und her schalten für das programmieren würde ich glaub ich wahnsinnig werden.

    Hast du vielleicht eine Lösung für das Fenster Problem. Ist ja auch für spätere Projekte interessant
    Egal, Du sein Chefe.
    Glaubst Du, dass Du mit 40 Forms glücklicher wirst?
    Das Aufklappen einer von zig Tabs ist ein 4-Zeiler. Und da ist instanzmäßig alles sauber, was ich bei Deinen zig Forms noch nicht sehe.
    Wenn dann in einem Monat die 41. Form dazukommt, sprechen wir uns wieder. :thumbsup: :thumbsup: :thumbsup:
    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!
    Hm...ja wahrscheinlich hast du recht. Über instanzieren habe ich keine ahnung. Dann folge ich deinem Rat mal^^ Falls ich alle finalen Designs als UserControls mache kann ich die doch alle dynamisch, je nachdem was der user wählt in einem Tab öffnen. oder habe ich da ein Denkfehler? Wenn ich genau bedenke sind UserControls mit den einzelnen Experimenten sogar ganz nützlich.

    Trotzdem bleibt das Problem mit dem Schließen der zweiten Form.
    Probier mal dies:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Using dlg As New Form2
    4. Me.Hide()
    5. dlg.ShowDialog()
    6. Me.Show()
    7. End Using
    8. End Sub
    9. End Class
    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!
    nope. klappt nicht. Hier mal die Codes von beiden Forms:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Windows.Forms
    3. Public Class StartForm
    4. Public Sub New()
    5. '
    6. ' Required for Windows Form Designer support
    7. '
    8. InitializeComponent()
    9. End Sub 'New
    10. ' The main entry point for the application.
    11. <STAThread()> _
    12. Shared Sub Main()
    13. Try
    14. 'Dim Main As New StartForm
    15. 'Main.Show()
    16. Application.Run(New StartForm)
    17. Catch ex As Exception
    18. MessageBox.Show(ex.Message.ToString(), "Error")
    19. End Try
    20. End Sub 'Main
    21. Public Sub Sichtbar()
    22. Me.Visible = True
    23. End Sub
    24. Private Sub schliessen_Click(sender As System.Object, e As System.EventArgs) Handles schliessen.Click, schliessen.Click
    25. Try
    26. Application.Exit()
    27. Catch ex As Exception
    28. MessageBox.Show(ex.Message.ToString(), "Error")
    29. End Try
    30. End Sub
    31. Private Sub StartForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    32. schliessen.Select()
    33. End Sub
    34. Private Sub DatenAufnahme_Click(sender As System.Object, e As System.EventArgs) Handles DatenAufnahme.Click
    35. Dim AuswahlExperimentGrob As New ExperimentAuswahlGrob(Me)
    36. Me.Hide()
    37. AuswahlExperimentGrob.ShowDialog()
    38. Me.Show()
    39. End Sub
    40. End Class


    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class ExperimentAuswahlGrob
    3. Public StartFormRef As Form
    4. Public Sub New(ByVal _ersteForm As Form)
    5. StartFormRef = _ersteForm
    6. InitializeComponent()
    7. End Sub
    8. Private Sub Me_FormClosing(sender As Object, e As FormClosingEventArgs) _
    9. Handles Me.FormClosing
    10. Application.Exit()
    11. End Sub
    12. Private Sub schliessen_Click(sender As System.Object, e As System.EventArgs) Handles schliessen.Click
    13. Close()
    14. End Sub
    15. Private Sub back_Click(sender As System.Object, e As System.EventArgs) Handles back.Click
    16. StartFormRef.Show()
    17. Me.Close()
    18. End Sub
    19. End Class
    Schmeiß fast alles raus.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class StartForm
    2. Private Sub schliessen_Click(sender As System.Object, e As System.EventArgs) Handles schliessen.Click
    3. Application.Exit()
    4. End Sub
    5. Private Sub DatenAufnahme_Click(sender As System.Object, e As System.EventArgs) Handles DatenAufnahme.Click
    6. Using AuswahlExperimentGrob As New ExperimentAuswahlGrob()
    7. Me.Hide()
    8. AuswahlExperimentGrob.ShowDialog()
    9. Me.Show()
    10. End Using
    11. End Sub
    12. End Class

    VB.NET-Quellcode

    1. Public Class StartForm
    2. Private Sub schliessen_Click(sender As System.Object, e As System.EventArgs) Handles schliessen.Click
    3. Application.Exit()
    4. End Sub
    5. Private Sub DatenAufnahme_Click(sender As System.Object, e As System.EventArgs) Handles DatenAufnahme.Click
    6. Using AuswahlExperimentGrob As New ExperimentAuswahlGrob()
    7. Me.Hide()
    8. AuswahlExperimentGrob.ShowDialog()
    9. Me.Show()
    10. End Using
    11. End Sub
    12. End Class
    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!
    Au man ich bin soooo Blöd!!
    Wer das:

    VB.NET-Quellcode

    1. Private Sub Me_FormClosing(sender As Object, e As FormClosingEventArgs) _
    2. Handles Me.FormClosing
    3. Application.Exit()
    4. End Sub


    In seine Form schreibt und sich dann wundert, dass alles geschlossen wird ist echt blöd^^

    Rod du hast übrigens zweimal die StartForm gepostet.

    Ohne den oben geschrieben Code funktioniert sowohl meine erste Lösung als auch die von Rod! Allerdings ist das mit dem UsingBlock besser!
    Danke nochmal...Habt mir sehr geholfen! :thumbsup: :thumbsup: :thumbsup:

    Eggord schrieb:

    Rod du hast übrigens zweimal die StartForm gepostet.
    Sorry. :D
    die Form ExperimentAuswahlGrob war sowieso fast leer.

    VB.NET-Quellcode

    1. Public Class ExperimentAuswahlGrob
    2. Private Sub schliessen_Click(sender As System.Object, e As System.EventArgs) Handles schliessen.Click
    3. Close()
    4. End Sub
    5. End Class
    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!