Zweites Form soll gleiche Tabelle abbilden

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Ja sicher habe ich diese Dinge schonmal benutzt, aber unterscheiden musste ich sie ja noch nie. Deswegen frug ich ja nach der Erklärung.

    Das heißt nun allerdings, dass sich ein Dialog bei mir tatsächlich nicht anbietet, weil ich das Hauptform ja bedienen will. Oder ist das auch noch möglich? Events könnten ja auch nur Timer.Ticks sein oder ähnliches.

    Naja die Dinge für die ich best Practice suche scheinen bei mir selten überhaupt notwendig zu sein.
    Wenn Du keinen Dialog brauchst, sondern ein zweites Form, auf dem Du parallel zum Hauptform arbeiten willst, dann verwende eben Show. Steht ja in RfGs Dialoge richtig instanziieren drin, wie es damit geht.
    Also z.B.

    VB.NET-Quellcode

    1. 'im Hauptform
    2. Private frmFilter As frmFilter = Nothing
    3. Private Sub BtnErstelleNeuesFilterForm_Click(sender As Object, e As EventArgs) Handles BtnErstelleNeuesFilterForm.Click
    4. If frmFilter IsNot Nothing AndAlso Not frmFilter.IsDisposed Then Return 'Form wird noch angezeigt -> kein neues Form erstellen
    5. frmFilter = New frmFilter 'Form neu erstellen …
    6. 'sonstiger Code
    7. frmFilter.Show(Me) '…und anzeigen
    8. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Darf ich hierzu nochmal fragen ob das so richtig durchdacht ist.

    Ich habe eine Windows Form Anwendung in den Einstellungen als Einzelinstanz festgelegt. Bei Starten sollen zwei Forms geöffnet werden, das Startform befindet sich auf einem anderen Bildschirm als Form2. Beide starten maximiert. Wird eines der beiden Forms geschlossen soll auch das andere geschlossen werden. Die Forms sind jedoch nicht identisch.
    Beim Debuggen springt er wenn ich Form1 schließe, zuerst in den Dispose von Form2. Ich schätze weil die Anwendung geschlossen wird macht er als erstes alle anderen Fenster zu? Daher hätte ich das Disposen von Form2 wieder entfernt, weil das macht er sonst ja zweimal.
    Dazu kommt der Owner von Form2 wird nothing sobald Form2 disposed wird, daher kann ich Form1 nicht auch schließen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Form2neu As Form2
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    4. Form2neu = New Form2
    5. Form2neu.Show(Me)
    6. End Sub
    7. Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
    8. If Not Form2neu Is Nothing Then Form2neu.Dispose()
    9. End Sub
    10. End Class


    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
    3. Dim startLocation As New Point((Screen.AllScreens(1).WorkingArea.Left + 100), (Screen.AllScreens(1).WorkingArea.Top + 100))
    4. Location = startLocation
    5. WindowState = FormWindowState.Maximized
    6. End Sub
    7. Private Sub Form2_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
    8. If Not Owner Is Nothing Then Owner.Dispose()
    9. End Sub
    10. End Class

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

    Du könntest prüfen:

    VB.NET-Quellcode

    1. If FormX.Disposing OrElse FormX.IsDisposed Then
    - also wenn es gerade entsorgt wird oder schon entsorgt wurde …
    Ich stell mir aber gerade die Frage: Wenn die beiden eben nicht MainForm und SubForm sind - denn so klingt es zumindest - warum dann beide so aufrufen? Du kannst ja auch das Anwendungsframework in den Projekteinstellungen deaktivieren, als Startpunkt eine Sub Main festlegen, diese in einem neuen Modul anlegen und beide Forms nebeneinander aufrufen. Kommunizieren die beiden Forms miteinander oder sollen sie nur dieselben Daten haben? Weil: Das Schließen des einen kann man auch mit dem Schließen des anderen verbinden. Dann wär auch die Programmstruktur logischer als mit MainForm-SubForm.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein die Forms kommunizieren nicht. Sie sollen nur gemeinsam laufen oder auch nicht. Und nicht mehr als einmal.

    Ich probiere es mal mit der Sub Main. Anwendungsframework aktivieren steht da, ok wenn das aus ist, dann brauche ich eine Sub Main wie bei einer Konsolenanwendung? Muss die auch in ein Modul?
    Einzelinstanzanwendung wird dann aber ausgegraut
    Nur für die Sub Main (und für deren Drumherum) brauchst Du das Modul.
    In der MainSub instanziierst Du beide Forms, fügst die FormClosing-EventHandler hinzu, rufst das erste Form mit Show und das zweite mit ShowDialog auf (sonst wird das Programm sofort beendet).
    Ja, das mit der Einzelanwendung hab ich aus den Augen verloren, aber dafür kannst Du Dir selber was basteln. Ich hab dafür eine einfache, auch netzwerkweite Lösung: Eine leere Datei in einem Netzwerkordner per Stream öffnen (Dim DeinFileStream = IO.File.Open(Dateipfad, IO.FileMode.OpenOrCreate)) und erst beim Programmende den Stream schließen. Bei Absturz wird der Stream auch geschlossen. Wird von einer weiteren App-Instanz versucht, diese Datei zu öffnen, gibt's ne Exception, die man abfangen kann. Dann weiß man, dass ne andere Instanz der App auf dem PC oder im Netzwerk bereits läuft und kann die weitere Instanz (in der ja die Exception kam) schließen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab noch zwei Problemchen so:
    Form1 kann ich nicht mehr schließen, wird blockiert wegen ShowDialog. Genauso das minimieren.
    Wenn ich entsprechend Form2 schließe ruft Form2 kein Disposed Event auf.


    VB.NET-Quellcode

    1. Module ModuleStart
    2. Private WithEvents Form1neu As Form1
    3. Private WithEvents Form2neu As Form2
    4. Sub Main()
    5. Dim StopStream as FileStream
    6. Try
    7. StopStream = IO.File.Open("pfad",IO.FileMode.OpenOrCreate)
    8. Catch
    9. Exit Sub
    10. End Try
    11. Form1neu = New Form1
    12. Form2neu = New Form2
    13. Form1neu.Show()
    14. Application.Run(Form2neu)
    15. End Sub
    16. Private Sub UndTschuess(sender As Object, e As CancelEventArgs) Handles Form1neu.Closing, Form2neu.Closing
    17. RemoveHandler Form1neu.Closing, AddressOf UndTschuess
    18. RemoveHandler Form2neu.Closing, AddressOf UndTschuess
    19. Select Case DirectCast(sender, Form).Name
    20. Case "Form1"
    21. Form2neu.Dispose()
    22. Case "Form2"
    23. Form1neu.Dispose()
    24. End Select
    25. End Sub
    26. End Module

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Also dann für beide Forms?
    Start ist kein Member von Application bei mir. Korrektur schlägt Restart und StartupPath vor.

    Ich schätze mal ein MainForm gibt es auch nicht mehr wenn ich es so mache. Die Forms sind beide gleichwertig

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    MyFault :S
    ich korrigiere EdRs Vorschlag: Application.Run(DeinForm)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab es oben mal ergänzt Post 27. Es scheint auch zu funktionieren. Wo die Datei liegt müsste keinen Unterschied machen oder weil du Netzwerkordner schriebst? Ich schätze dann kann die Anwendung im gesamten Netzwerk nur einmal geöffnet sein.

    Hoffe ist jetzt so richtig gemacht

    Sollte ich wissen was eine Standardnachrichtenschleife ist, wenn ich das so nutze?

    Ich habe als Startobjekt Sub Main festgelegt, aber es steht auch das ModuleStart Modul zur Auswahl. Macht das einen Unterschied?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Wenn Du mit WithEvents arbeitest, brauchst Du kein RemoveHandler.
    Wenn Du das netzwerkweit sperren willst, musst Du auch eine Datei in einem von allen PCs zugänglichen Netzwerkordner haben.
    Nö, Du musst nicht wissen, was ne/die Standardnachrichtenschleife ist. Kannst Du aber gerne recherchieren. Schadet nicht.
    Module Start als Auswahl? Komisch. Nee, Sub Main bitte.
    Und dann noch so Kleinigkeiten wie

    VB.NET-Quellcode

    1. Application.EnableVisualStyles()
    2. Application.SetCompatibleTextRenderingDefault(True)
    für die Optik.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Im Tut und als ich nach Beispielen zu Veranschaulichung gesucht hab, wurde SetCompatibleTextRendering(False) als die bevorzugte Wahl angegeben.
    Wird False der Default sein? Dann wäre es gleich mit dem weglassen der Zeile? Oder ist True der Default?

    die Removehandler hab ich reingetan, weil er müsste ja das Event vom anderen Form feuern, weil ich ja immer jeweils das andere Form schließe und dann wäre das doch eine Endlos-Rekursion.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Im Tut und als ich nach Beispielen zu Veranschaulichung gesucht hab, wurde SetCompatibleTextRendering(False) als die bevorzugte Wahl angegeben.
    Also ich hab das so abgeschrieben von generiertem Code, wenn das AnwendungsFramework aktiviert ist.
    Den Sinn hatte ich nicht erfassst.
    Heute beim nochmal Nachlesen von VPZs Link scheint mir True die bessere Option.
    Es gibt nämlich zwei verschiedene Arten Texte zu malen: System.Drawing.Graphics.DrawString() und System.Control.TextRenderer.DrawText(). Die gezeichneten Texte sehen geringfügig unterschiedlich aus, aber das Graphics ist wohl moderner und performanter.
    Vor allem (naja, eiglich eher in Spezialfällen) ists kompatibel zu Graphics.MeasureString() - damit misst man den Platz, den ein zu zeichnender Text einnehmen wird.
    Und da nervts schon, wenn die Messung abweicht von der tatsächlichen Darstellung, wie sie ggfs. per TextRenderer ausfällt.
    Aber müsste ich mal testen - diese Deutung erschliesst sich mir erst heute.