Deklaration und Wertzuweiseung im Array

  • VB.NET

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

    Deklaration und Wertzuweiseung im Array

    VB.NET-Quellcode

    1. Public Class Spatial_Working_Memory
    2. Dim Panelset() As Object = {Panel101, Panel102, Panel103, Panel104, Panel105, Panel106, Panel107, Panel108, Panel109}
    3. ...


    So funzt es nicht. Später im Code:

    VB.NET-Quellcode

    1. DirectCast(Panelset(panelcount), Panel).BackColor = Color.Black


    ...bekomme ich dann Error: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Dim Panelset() As Panel = ... bringts auch nicht

    Wie geht denn sowas am besten?


    Wenn ich es z.B. so mache, dann geht's:

    VB.NET-Quellcode

    1. Public Class Spatial_Working_Memory
    2. Dim Panelset() As Object
    3. ...
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Panelset(0) = Panel1
    6. Panelset(1) = Panel2
    7. Panelset(2) = Panel3
    8. Panelset(3) = Panel4
    9. Panelset(4) = Panel5
    10. Panelset(5) = Panel6
    11. Panelset(6) = Panel7
    12. Panelset(7) = Panel8
    13. Panelset(8) = Panel9
    14. ...


    dann geht's. Aber ich find's lästig so viel tippen zu müssen, das muss doch einfacher gehen. Oder?
    Hi vanao.

    Wenn ich mich recht erinnere, dann kannst du in einer Klasse keine Variablendefinition tätigen, bevor der Konstruktor aufgerufen wurde (es sei denn, es ist eine Shared-Variable, was hier aber nicht zutrifft).
    Ändere daher deinen Code folgend um:

    VB.NET-Quellcode

    1. Dim Panelset() As Panel
    und schreibe in den Sub New() folgendes:

    VB.NET-Quellcode

    1. Panelset = New Panel { Panel101, Panel102, ... }

    VB.NET-Quellcode

    1. Public Class Spatial_Working_Memory
    2. Public Sub New()
    3. End Sub
    4. End Class


    Die Sub New() muss manuell hinzugefügt werden.

    Immer wenn irgendwo so ein Code steht:

    VB.NET-Quellcode

    1. Dim Irgendwas As New Spatial_Working_Memory

    wird diese Sub aufgerufen.


    Aber was mich noch interessieren würde:

    VB.NET-Quellcode

    1. Dim Panelset() As Object = {Panel101, Panel102, ...}


    Warum nicht gleich als Panel deklarieren? Dann würde man sich später das DirectCast() sparen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    haiyyu schrieb:

    Wenn ich mich recht erinnere, dann kannst du in einer Klasse keine Variablendefinition tätigen, bevor der Konstruktor aufgerufen wurde

    Dochdoch, normal geht das schon.
    Nur wenn man die Controls eines Forms, etwa Panels, im Array haben will, geht das schief, weil das Form diese erst im DesignerCode, in InitializeComponents initialisiert.

    Folglich kann man solche Arrays auch erst nach dem Aufruf von InitializeComponents initialisieren, etwa im Form_Load.

    @vanao:
    Nikos Vorschlag ist für dich bes. interessant, denn VB generiert sogleich den Aufruf von InitializeComponents() hinein, wenn du sub new() in dein Form schreibst.
    Wie gesagt: nach diesem Aufruf kannst du dein Panel-Array befüllen.

    Und natürlich gebe ich Niko recht: Auf jeden Fall das Panel-Array auch als Panel() deklarieren, nicht als Object()
    Also ich find das nu wirklich nicht schlimm:

    VB.NET-Quellcode

    1. Public Class Spatial_Working_Memory
    2. Dim Panelset() As Panel
    3. Private Sub Spatial_Working_Memory_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    4. Panelset = New Panel() {Panel101, Panel102, Panel103, Panel104, Panel105, Panel106, Panel107, Panel108, Panel109}
    5. End Sub
    6. End Class

    Außer der bescheuerte Name von dem Form ;)
    Ach super! Danke dir!
    Ich wusste einfach nicht dass man das auch so schreiben kann, aber ich habe geahnt dass es sowas in der Richtung geben würde.

    P.S.: Das Array gleich als Panel zu deklarieren macht natürlich auch Sinn - ist erledigt.