Problem bei Zugriff auf Property

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Duster.

    Problem bei Zugriff auf Property

    Hallo Zusammen,

    ich glaub ich hab da ein ziemlich simples Proble´m, für mich als Anfänger aber trotzden verwirrend.
    Ich möchte aus meinem Hauptprogramm auf die Property eines von mir erstellten Objekts zugreifen. Dieses Objekt habe ich zuvor mit vielen anderen Objekten in eine Liste vom Typ Objekt geschoben. Versuche ich zuzugreifen bekomme ich die Fehlermeldung :
    "Option Strict lässt spätes Binden nicht zu".
    Ich weiß dass Fehler die sich auf das "Late Binding" beziehen mit dem falschen Casten zusammen hängen!
    Aber aufddie Lösung komm ich trotzdem nicht! :(

    Das stark vereinfachte Programm habe ich angehäng und hier der relevante Code:

    Hauptprogramm:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private _cmdDrawState As Boolean = False
    4. Private _lines as new Lines()
    5. Private ReadOnly _linesPenData as New PenData()
    6. Private _linesCoords as Point()
    7. Private ReadOnly _gfxObject as New List(Of Object)
    8. Private _currentGfxObject as New Object()
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. InitializeLists()
    11. InitializeShape()
    12. _currentGfxObject = _gfxObject.Item(0)
    13. TxtTest01.Text = _currentGfxObject.GetType().ToString()
    14. TestSub(_currentGfxObject)
    15. End Sub
    16. Public Sub TestSub(gfxObject As Object)
    17. 'TxtTest02.Text = gfxObject.TestProperty.ToString() ' Fehler: Option Strict läßt
    18. ' spätes Binden nicht zu
    19. End Sub
    20. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    21. MyBase.OnPaint(e)
    22. _cmdDrawState = True
    23. _lines = New Lines(e, _linesPenData, _linesCoords)
    24. End Sub
    25. Private Sub InitializeLists()
    26. Dim gfxObjects () As Object = { _lines }
    27. _gfxObject.AddRange(gfxObjects)
    28. End Sub
    29. Public Sub InitializeShape()
    30. With _linesPenData
    31. .Alpha = 255
    32. .Red = 0
    33. .Green = 0
    34. .Blue = 255
    35. .Width = 10
    36. end With
    37. _linesCoords = {New Point(550, 220), New Point(800, 220),
    38. New Point(800, 220), New Point(800, 400),
    39. New Point(800, 400), New Point(550, 400)}
    40. End Sub
    41. End Class


    Die Klasse:

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Friend Class Lines
    3. Inherits Shape
    4. #Region "CLASS MULTILINES"
    5. #Region "MultiLines Private Variables"
    6. Private ReadOnly _e As PaintEventArgs
    7. Private ReadOnly _penData As PenData
    8. Private ReadOnly _coordinates As Point()
    9. #End Region
    10. #Region "Line Properties"
    11. ' Das ist die relevante Property
    12. Friend Overrides Property TestProperty As Boolean = True
    13. #End Region
    14. #Region "MultiLines Constructors"
    15. Public Sub New()
    16. End Sub
    17. Public Sub New(e As PaintEventArgs, penData As PenData, coordinates As Point())
    18. _e = e
    19. _penData = penData
    20. _coordinates = coordinates
    21. DrawMultiLines(_e, _penData, _coordinates)
    22. End Sub
    23. #End Region
    24. #Region "MultiLines Functions"
    25. Private Function DrawMultiLines(e As PaintEventArgs, penData As PenData, coordinates As Point()) As PaintEventArgs
    26. Dim linesPen As Pen
    27. linesPen = GeneratePen (penData)
    28. e.Graphics.DrawLines(linesPen, coordinates)
    29. linesPen.Dispose()
    30. Return e
    31. End Function
    32. #End Region
    33. #End Region
    34. End Class


    Vielen Dank für Eure Hilfe vorab,
    Duster
    Dateien

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

    Richtig deklarieren: nicht als Object, sondern als das, was es ist: Shape, oder Lines, oder was da bei dir rumfährt.
    Und das an allen beteiligten Stellen: die Liste, das Methoden-Argument, Variablen, ...

    Der Compiler will wissen, was ein Objekt kann. Das teilt ihm die Deklaration mit.
    Wenn da nur steht: As Object, dann ist ihm nur bekannt, was die Object-Klasse kann.
    Wenn da steht: As Shape, erst dann ist ihm bekannt, was du in die Shape-Klasse reinprogrammiert hast.
    @ErfinderDesRades
    Ich dachte ich könnte Objecte die ich als as Object deklriert habe als Container für andere Objekte nehmen und reinschieben was ich will?
    In die Liste _gfxObject vom Typ as Object schiebe ich in meinem Programm Line, Lines Rectangle, Ellipse Objekte rein die jeweils vom Typ line, Lines etc. sind.
    Ich dachte ich kann dann über den Index der Liste (_gfxObject as Object) auf das zugehörige Property (gfxObject.TestProperty) des jeweiligen Typs zugreifen?
    Ich dachte das wäre der Sinn (oder zumindest einrer davon) von Listen?

    Gibt es da sonst eine Möglichkeit?

    Vielen Dank für Deine Hilfe,
    Duster
    Nee, Du kannst gerne ne List(Of X) machen, wobei X ein gemeinsamer Basistyp von Line, Shape usw. ist. Aber Object ist immer zu unspezifisch. Dann schiebt man da noch ne TextBox, n String und ne Boolean-Variable in die Liste rein und schon geht gar nix mehr. Der Sinn von Listen ist es, gleiche Objekt eines spezifischens Typs zu gruppieren, nicht alles mögliche zu Eintopf zu verarbeiten.
    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.

    Duster schrieb:

    Ich dachte ich könnte Objecte die ich als as Object deklriert habe als Container für andere Objekte nehmen und reinschieben was ich will?
    ja, reinschieben kann man in ein Objekt, was man will.
    Nur beim Rausholen weiss dann der Compiler natürlich nicht mehr automatisch, wasses ist :P
    Und Strict On meckert da, weil rausholen und iwas mit machen ist höchst gefährlich - kann ja alles mögliche drinne sein.