Zugriff auf Instanzmember

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

    Zugriff auf Instanzmember

    Hi,

    ich weiß, der Titel ist nicht passend, aber mir fällt nichts ein.

    Um auch gleich auf den Punkt zu kommen: "=" erwartet (Objektinitialisierer)
    Der Code:
    Klasse 1:

    VB.NET-Quellcode

    1. Class myControl
    2. Public Property myPos As New myPosition With {.Left = -1, Right = -1, Top = -1, Bottom = -1}
    3. Public Structure myPosition
    4. Public Left As Integer
    5. Public Right As Integer
    6. Public Top As Integer
    7. Public Bottom As Integer
    8. End Structure
    9. End Class

    Das is der Aufbau, nun wenn ich aber folgenden Code ausführe (später irgendwann^^)

    VB.NET-Quellcode

    1. Auflistung.Add(New myControl() With {.myPos.Top = 123, .myPos.Left = 213})

    Kommt der oben genannte Fehler.

    Kann mir jemand den Fehler ausmerzen (mit Klasse gehts übrigens auch nicht.)
    Geht das auch ohne?
    Also dass ich ohne neue Instanz Sachen ändern kann?
    À la:

    VB.NET-Quellcode

    1. 'Am Anfang:
    2. myPos.Bottom = 123
    3. myPos.Left = 231
    4. 'Später
    5. myPos.Right = 123
    6. myPos.Left = 234

    Wobei das ansich kein Problem wäre...da das ja relative Positionen sind und das ein Menü darstellt..okay.

    Aber gibts trotzdem ne andere Möglichkeit, weil

    VB.NET-Quellcode

    1. Auflistung.Add(New myControl() With {.myPos.Top = 123, .myPos.Left = new myPosition() With {.Left = 23, .Right = 234, .Bottom = 34, .Top = 23}})
    irgendwie "unschön" aussieht (ja ich lege Wert auf das Aussehen des Codes^^)
    Du kannst auch parameterisierte Konstruktoren benutzen (nur der Konstruktor ohne Parameter ist nicht erlaubt). Sowas z.B.:

    VB.NET-Quellcode

    1. Public Structure myPosition
    2. Public Left As Integer
    3. Public Right As Integer
    4. Public Top As Integer
    5. Public Bottom As Integer
    6. Public Sub New(ByVal left As Integer, ByVal right As Integer, ByVal top As Integer, ByVal bottom As Integer)
    7. Me.Left = left
    8. Me.Right = right
    9. Me.Top = top
    10. Me.Bottom = bottom
    11. End Sub
    12. End Structure


    Gruß
    ~blaze~
    Nein, eig. kann ich das nicht.
    Da ich ja einen relativen Abstand habe zu allen Kanten und wenn ich da nun mit einem Rectangle (X, Y, Width, Height) komme, wirds leider nichts.
    Deshalb funktioniert die aktuelle Methode deutlich besser.
    Insgesamt sieht die Struktur so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Enum PositionElement
    2. Relative = 0
    3. Absolute = 1
    4. End Enum
    5. Public Structure Position
    6. Public Left As Integer
    7. Public Right As Integer
    8. Public Top As Integer
    9. Public Bottom As Integer
    10. Public Sub New(ByVal left As Integer, ByVal right As Integer, ByVal top As Integer, ByVal bottom As Integer)
    11. Me.Left = left
    12. Me.Right = right
    13. Me.Top = top
    14. Me.Bottom = bottom
    15. End Sub
    16. End Structure
    17. Public Class n1000Control
    18. 'Ausgelassen
    19. Public Property Location As Point = New Point(0, 0)
    20. Public Property Positioning As PositionElement = PositionElement.Absolute
    21. Public Property Position As New Position(-1, -1, -1, -1)
    22. Public Property Width As Integer = 200
    23. Public Property Height As Integer = 100
    24. 'Ausgelassen
    25. Public ReadOnly Property Size As Size
    26. Get
    27. Return New Size(Width, Height)
    28. End Get
    29. End Property
    30. Public ReadOnly Property Rect As Rectangle
    31. Get
    32. Return New Rectangle(Location, Size)
    33. End Get
    34. End Property
    35. End Class

    Deswegen funktioniert dein Ansatz nicht wirklich.
    Außer du kannst mich eines besseren belehren.
    Ich habe hier ja einmal eine absolute und eine relative Positionsangabe, die ich jeweils anders behandle.
    Eigentlich ist mir nicht ganz klar, was Dein Problem ist. Nur ist hier der Fehler:

    AliveDevil schrieb:

    VB.NET-Quellcode

    1. Public Property myPos As New myPosition With {.Left = -1, Right = -1, Top = -1, Bottom = -1}

    VB.NET-Quellcode

    1. Public Property myPos As New myPosition With {.Left = -1, .Right = -1, .Top = -1, .Bottom = -1}
    Da muss überall ein Punkt davor.
    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!
    Meinst Du so was:

    VB.NET-Quellcode

    1. Class myControl
    2. Public Structure myPosition
    3. Public Left As Integer
    4. Public Right As Integer
    5. Public Top As Integer
    6. Public Bottom As Integer
    7. Public Sub New(ByVal f As Boolean) ' der ist do blöd und will hier einen Parameter haben.
    8. With Me
    9. .Left = -1
    10. .Right = -1
    11. .Top = -1
    12. .Bottom = -1
    13. End With
    14. End Sub
    15. End Structure
    Besser ist es vielleicht, Du machst gleich eine Klasse draus.
    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!
    naja, du siehst ja die Globale Struktur der "Position", das ist alles das was du da hast mit myPosition.
    Dann habe ich in n1000Control eine Deklaration dafür.
    Nun möchte ich nicht jedesmal die Position neu deklarieren, sondern direkt darauf zugreifen.
    ~blaze~ sagte schon richtig, dass ich dafür direkt eine Variable nehmen solle, und keine Property.