Aufrufe von Formen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Digtro_77.

    Aufrufe von Formen

    Hallo.

    Ich habe 2 Formen, die geöffnet werden können.
    In der ersten Form rufe ich Form 2 so auf:

    VB.NET-Quellcode

    1. Private Hinweise_öffnen As New Hinweise_Fehlersuche
    2. ' ****************************************************************************************************
    3. ' Zusätzliche Hinweise für die Fehlersuche / Prüfmodus einblenden
    4. ' ****************************************************************************************************
    5. Private Sub BT_Hinweise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Hinweise.Click
    6. If Hinweise_öffnen Is Nothing OrElse Hinweise_öffnen.IsDisposed Then
    7. Hinweise_öffnen = New Hinweise_Fehlersuche
    8. End If
    9. If Not Hinweise_öffnen.Visible Then
    10. Hinweise_öffnen.[Anzeigebilder] = State_Zustand_Statemachine ' Aktuellen Statezustand an Form übergeben
    11. Hinweise_öffnen.ShowDialog()
    12. ' Hinweise_öffnen = Nothing
    13. System.GC.Collect()
    14. End If
    15. End Sub


    In diesem Aufruf verpacke ich auch noch eine Übergabe, welche in der aufzurufenden Form folgend deklariert ist:

    VB.NET-Quellcode

    1. Public Class Hinweise_Fehlersuche
    2. ' Übergabe an Form
    3. Public Property [Anzeigebilder] As Statemachine


    Die Übergabe an die Form und der Aufruf funktionieren.

    Ich bin jetzt also in Form (2) und möchte von hier aus, eine Weitere öffnen.

    Dies mache ich wieder so:

    VB.NET-Quellcode

    1. Private WithEvents Zoom As Hinweis_Groß
    2. Private Sub PB_Hinweis1_Click(sender As Object, e As EventArgs) Handles PB_Hinweis1.Click
    3. If Zoom Is Nothing OrElse Zoom.IsDisposed Then
    4. Zoom = New Hinweis_Groß
    5. End If
    6. If Not Zoom.Visible Then
    7. Zoom.[Bildübergabe] = Bildübergabe
    8. Zoom.ShowDialog(Me)
    9. 'Zoom = Nothing
    10. System.GC.Collect()
    11. End If
    12. End Sub


    Komisch ist hierbei, dass eben keine Bildübergabe stattfindet - im Debugger läuft er lediglich bis
    Zoom = New Hinweis_Groß
    (Bild - ja, da ist ein Breakpoint, deswegen wechselt er trotzdem von dort direkt zur Form)

    und öffnet dann die Form, ohne die Variable zu übergeben.

    Was mache ich hier denn nu schon widda falsch ?
    Bilder
    • Form.png

      18,3 kB, 511×280, 63 mal angesehen
    @Digtro_77 Sieht aus, als würde er im Konstruktor von Hinweis_Groß knallen.
    Öffne Hinweis_Groß.Designer.vb dort Sub InitializeComponent() und setze in die erste Zeile dort einen Haltepunkt.
    Kommentiere diese Zeile aus:

    VB.NET-Quellcode

    1. <System.Diagnostics.DebuggerStepThrough()> _
    Starte das Debugging und stelle fest, welche Zeile da nicht funktioniert.
    Debuggen, Fehler finden und beseitigen

    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!
    :/

    Er hängt immer bei der Übergabe des Wertes...
    Der Wert soll nicht vorhanden sein, obwohl dieser hinterlegt wurde.

    In der Bildübergabe hinterlege ich den Pfad von der 2.ten Form, den er in der 3.ten
    Form in einem großen Fenster anzeigen soll.

    Packe ich den zu übergebenden Pfad in eine Public-Var, die ich in einem Modul hinterlege, so klappt es.

    Aber bei der Übergabe über das Property sagt er, dass der Pfad nicht da ist (null).

    Hier auf Form 2:

    VB.NET-Quellcode

    1. If Not Zoom.Visible Then
    2. Zoom.[Bildübergabe] = Zoom_Bild
    3. Zoom.ShowDialog(Me)
    4. 'Zoom = Nothing
    5. System.GC.Collect()
    6. End If


    Hier auf Form 3:

    VB.NET-Quellcode

    1. Public Class Hinweis_Groß
    2. ' Übergabe an Form
    3. Public Property [Bildübergabe] As String
    4. Private WithEvents Pic1 As New PictureBox With {.Parent = Me, .Dock = DockStyle.Fill}
    5. Private Corner As New PointF(0, 0)
    6. Private MouseDownPt, MouseMovePt, MouseDownCornerPt As New PointF
    7. Private SourcePic As New Bitmap(Bildübergabe)
    8. Private ScaleWidth As Double = SourcePic.Width
    9. Private ScaleRatio As Double
    10. Private Sub Hinweis_Groß_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. Text = "MW Zoom - LMB Drag"
    12. Form2_Resize(0, Nothing)
    13. MsgBox(Bildübergabe)
    14. End Sub

    @Digtro_77 Poste das bereinigte Projekt (ohne obj, bin, vs-Verzeichnisse) als ZIP und beschreibe, was wir tun müssen, um den Effekt zu reproduzieren.
    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!
    Ok...

    Also, man kann über die beiden Button die Bilder in die Picturebox laden (dazu die Pfade der Bilder anpassen, bzw. Bilder einsetzen).

    Ist das Bild dann angezeigt, so "Klick" man darauf und es öffnet sich ein Zoom-Fenster.

    Für das Bild im Zoom-Fenster ist die Übergabe gedacht.
    Dies funktioniert so nicht, aber wenn ein fester Pfad eingetragen wird 1A...
    Dateien
    • Picture.zip

      (16,46 kB, 62 mal heruntergeladen, zuletzt: )

    VB.NET-Quellcode

    1. Dim frm As New Form2
    2. If frm Is Nothing OrElse frm.IsDisposed Then
    3. frm = New Form2
    4. End If
    5. If Not frm.Visible Then
    6. frm.[Bildübergabe] = Zoom_Bild


    Das Problem liegt bei dem New. Dadurch wird ein neues Form erstellt und die Klassenvariablen initialisiert. Dementsprechend wird diese Zeile aufgerufen: Private SourcePic As New Bitmap(Bildübergabe). Zu diesem Zeitpunkt ist aber Bildübergabe noch Nothing. Die Zuweisung des Werts an jene Variable erfolgt erst später. Deshalb kracht es. Deklariere nur die Variable SourcePic und gib ihr den Wert erst im Form_Load-EventHandler. Auch ScaleWidth darf ihren Wert erst in jenem EventHandler erhalten.
    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.
    Ja, das habe ich beim Debuggen gemerkt, dass der Wert noch nicht geladen wurde und er NOTHING ist.

    Die Frage, für die ich mich wohl ziemlich schämen muss, ist:

    "Wie kann ich das jetzt richtig machen ?"
    Wie geschrieben. Form2 inhaltlich ändern:

    VB.NET-Quellcode

    1. Private SourcePic As Bitmap = Nothing
    2. Private ScaleWidth As Double
    3. Private ScaleRatio As Double
    4. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. SourcePic = New Bitmap(Bildübergabe)
    6. ScaleWidth = SourcePic.Width
    7. Text = "Bestückung Zoom"
    8. Form2_Resize(0, Nothing)
    9. 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.
    @Digtro_77 Diese ganze Prozedur ist Tinnef:

    VB.NET-Quellcode

    1. ' Durch Klick auf das Bild wird dieses im Zoom-Fenster geöffnet
    2. Public Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    3. Dim frm As New Form2
    4. If frm Is Nothing OrElse frm.IsDisposed Then
    5. frm = New Form2
    6. End If
    7. If Not frm.Visible Then
    8. frm.[Bildübergabe] = Zoom_Bild
    9. frm.ShowDialog()
    10. frm = Nothing
    11. System.GC.Collect()
    12. End If
    13. End Sub
    Machst Du

    VB.NET-Quellcode

    1. Public Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    2. Using frm As New Form2
    3. frm.[Bildübergabe] = Zoom_Bild
    4. frm.ShowDialog()
    5. End Using
    6. End Sub
    und feddich.
    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!
    Ich habe mir deinen Beitrag (Hinweis) zu den Aufrufen zu Herzen genommen und damit probiert.

    Im Endgültigen Code ist es mit dem "Using".

    Aber danke für den Hinweis - das ist ja so jetzt auch für alle hier...

    Cool, dass du dich hier so sehr engagierst - SUPER und vielen Dank!


    Ps. "Tinnef" hab ich immer als "Tünnef" gesprochen - wieder was dazu gelernt :D