Die Instanz von Klasse CDrawing sieht FormMain.C1 (eine Instanz von Klasse Cuboid) immer als ‘Nothing’

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Die Instanz von Klasse CDrawing sieht FormMain.C1 (eine Instanz von Klasse Cuboid) immer als ‘Nothing’

    Hallo,
    ich habe ein klassen-übergreifendes Problem.
    Ich habe nebst FormMain.vb noch 2 weitere Klassen, nämlich Cuboid und CDrawing. Beide sind initialisiert.

    Ich habe eben debuggt. In CDrawing.vb sieht der Compiler bei der Variable
    FormMain.C1 immer nur ‘Nothing’. Wie kann das sein?

    Was habe ich überhaupt vor
    Ich möchte einen Quader im Raum darstellen und projizieren. Dazu habe ich eine Klasse Cuboid mit x, y, z, Länge, Breite, Höhe, und eine List(of Vector3D). Die Klasse CDrawing hingegen soll den Sachverhalt berechnen und zeichnen. In FormMain findet nur der User-Input statt.

    In FormMain.vb:

    VB.NET-Quellcode

    1. Public NotInheritable Class FormMain
    2. Public Property C1 As Cuboid = Nothing
    3. Public y_Entfernung_Kamera As Double
    4. Public y_Entfernung_Kamera_Schirm As Double
    5. Public x_Entfernung_Kamera As Double
    6. Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
    7. Private D1 As CDrawing = Nothing
    8. Private Sub FormMain_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    9. Using FCC As New FormCreateCuboid
    10. If FCC.ShowDialog(Me) <> DialogResult.Yes Then Return
    11. C1 = New Cuboid(FCC.x, FCC.y, FCC.z, FCC.length_, FCC.width_, FCC.height_)
    12. D1 = New CDrawing()
    13. End Using
    14. End Sub
    15. Private Async Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    16. If C1 Is Nothing Then Return
    17. If e.KeyCode = Keys.W Then
    18. PictureBox1.Image = Nothing
    19. Await Task.Run(Sub() D1.process_async())
    20. PictureBox1.Image = CDrawing.displayedBitmap
    21. End If
    22. End Sub


    Und in CDrawing.vb's Public Sub process_async()-Methode ist FormMain.C1 immer Nothing.

    VB.NET-Quellcode

    1. If FormMain.C1 Is Nothing Then
    2. Return
    3. End If


    Ähm, ich glaube, das hat sich erledigt. Habe nun Public Shared Property C1 As Cuboid geschrieben.
    Kann das jemand erklären, warum das Shared sein muss? Die Logik möcht
    ' ich mal verstehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Wo wird FormMain in der Klasse CDrawing instanziiert?

    Ist das ein Fall von Warum »Form1.Show« und Co. einem irgendwann ins Bein schießen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo: jep
    Stichwort thread-dependent-property …
    Jeder Thread hat seine eigenen Form-Instanzen.
    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.

    Bartosz schrieb:

    Kann das jemand erklären, warum das Shared sein muss? Die Logik möcht' ich mal verstehen.
    Du denkst in VB6-Form-Nicht-Instanzen.
    Verstehe diesen Thread: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    und danach den von @VaporiZed .
    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!
    Nochmal für mich zum Verständnis: Wenn eine asynchrone Prozedur in einer Instanz von Klasse A etwas von FormMain abfragt, läuft das schief, weil jeder Thread eine eigene Instanz von FormMain kriegt – ja? Ok, deshalb schuf Shared Abhilfe, weil dann alle das Gleiche sehen.

    Mittlerweile habe ich in CDrawing eine Prozedur change_Values eingebaut, in der die FormMain die nötigen Variablen an CDrawing übergibt. Dann gab es komische Effekte. Aus 800 wurde plötzlich 8 und so weiter *. Deshalb musste ich (und konnte ich natürlich
    :) ) Shared wieder entfernen. Nun geht's.

    * weil y_Entfernung_Kamera auf 8 initialisiert wurde und später von Cuboid.vb geändert wird. Weil: Wenn es eine Vergrößerung gibt, muss die Strecke zur Kamera ja auch größer werden... Jedenfalls waren es pro Mausrad-Drehung mal 8, dann wieder 800, dann wieder 8, und so weiter. Naja, behoben ist es.

    Schönen Start in die Wochen morgen
    Lasst euch nicht ärgern

    Bartosz schrieb:

    Nochmal für mich zum Verständnis: Wenn eine asynchrone Prozedur in einer Instanz von Klasse A etwas von FormMain abfragt, läuft das schief, weil jeder Thread eine eigene Instanz von FormMain kriegt – ja? Ok, deshalb schuf Shared Abhilfe, weil dann alle das Gleiche sehen.
    Effektiv richtig. Das Problem ist eben, dass das mit dem FormMain-schreiben so möglich ist. In dem in Post#2 genannten Thread steht auch drin, wie das vermeidbar ist. Da kommt dann was mit ungültiger threadübergreifender Prozess, wenn man es trotzdem probiert. Ich hab gesehen, dass ich dafür den Post#2 in jenem Thread etwas ergänzen musste (Stichwort CreateInstance)
    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.