Frage zu Klassendefinition

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von cubetoon.

    Frage zu Klassendefinition

    Hallo liebes Forum,
    ich benötige eine (für mich) nicht ganz einfache Klasse, die Informationen in Arrays hält.
    Problem hierbei ist, dass die Klassen geschachtelt sein müssen, da ich eine Art Baumstruktur mit Oberbegriff und Subparamtern habe.

    Als Structure sieht das ganze so aus:

    Public Structure Attribs
    Public Name As String
    Public Value As String
    End Structure

    Public Structure Tasks
    Public Name As String
    Public Attribs() As Attribs
    End Structure

    Problem hier ist jedoch, dass ich Arrays in der Definition ja nicht dynamisch vergrößern bzw. verkleinern kann.

    Dim myTask(9) As Tasks
    ReDim myTask(x).Attribs(4)

    Nun stell ich mich da echt zu blöd an. Stelle mir ein Konstruct in der art myTask.Add(Name as String) und myTask.AddAttrib(Name as String, Value as String) vor. Das ganze dann natürlich auch mit Get damit man z.B eine Listbox oder Combobox via Request füllen kann. Ich weiss also schon ziemlich genau, wass ich brauche, kenne den Weg dorthin aber nicht!

    Hoffe, ich drücke mich nicht zu umständlich aus und vielleicht kann das ja jemand mal schnell aus dem Handgelenk schütteln oder mir einen Tip geben wie ich weiter komme.
    Vielen Dank,
    cubetoon
    hm... Ich bin mir zwar nicht sicher, ob das dein problem ist aber mit redim kannst du einen Array vergrößern bzw. verkleinern:
    Redim Preserve Arrayname(anzahl)
    bzw. bei dir
    Redim Preserve Tasks.Attribs(Neue Anzahl)
    Wobei Preserve dafür steht, dass der Array nicht geleet wird, was ja bei dim normalerweise üblich ist.
    Mit Ubound kannst du herausbekommen, was die momentan höchste Zahl ist.
    Um am Ende eins hinzuzufügen machst du einfach:
    x = ubound(Tasks.Attribs)
    Redim Preserve Tasks.Attribs(x+1)
    und wenn du jetzt einen Wert setzen willst (z.b. Value), schreibst du Tasts.Attribs(x+1).Value = "Neuer Wert".

    Ich hoffe das mit Redim und Ubound hat sich unter .net nicht geändert.
    Nochmal vielen Dank Mad Andy, jetzt bin ich schon vieeel weiter!


    Quellcode

    1. Class Tasks
    2. Private strName As String
    3. Shared strValue(1, 0) As String
    4. Public Property Name() As String
    5. Get
    6. Return strName
    7. End Get
    8. Set(ByVal Value As String)
    9. strName = Value
    10. End Set
    11. End Property
    12. Shared Sub Add(ByVal Name As String, ByVal Value As String)
    13. Dim intMembers As Int32
    14. intMembers = UBound(strValue, 2)
    15. If strValue(0, 0) = "" And strValue(1, 0) = "" Then
    16. strValue(0, 0) = Name
    17. strValue(1, 0) = Value
    18. Else
    19. ReDim Preserve strValue(1, intMembers + 1)
    20. strValue(0, intMembers + 1) = Name
    21. strValue(1, intMembers + 1) = Value
    22. End If
    23. End Sub
    24. Shared Sub ClearAttribs()
    25. ReDim strValue(1, 0)
    26. End Sub
    27. End Class



    Das ist soweit okay, die Klasse Tasks instanziert die Klasse Attributes um einem Task beliebig viele Attribute zuordnen zu können. Die Tasks sind wiederum ein Array, welches (tesweise) auf Knopfdruck gefüllt wird.

    Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim myTask() As Tasks
    3. Dim x As Integer
    4. Dim y As Integer
    5. For x = 0 To 1
    6. ReDim Preserve myTask(x)
    7. myTask(x) = New Tasks
    8. myTask(x).ClearAttribs()
    9. For y = 0 To 4
    10. myTask(x).Add("Name " + x.ToString + y.ToString, "Value " + x.ToString + y.ToString)
    11. Next y
    12. Next x
    13. End Sub




    Das funktioniert woweit perfekt, hat jedoch einen Haken - jeder neue Task in dem Array - also ab Nummer 1 (wir beginnen ja bei 0 - hat bereits die Attribute von der vorhergehenden Task übernommen. Und das obwohl ja die Klassenlehre sagt, dass Klassen nur Gerüste für zukünftige Objekte sind. Aber wo merkt sich mein Programm hier die Werte von der Arraydimension, die ihn gar nicht betrifft?

    Habe zuerst versucht die Klassen ineinander zu schachteln, mit eben beschriebenen Problem. Dann getrennt behandelt wie hier gezeigt - kein Erfolg. Was mache ich falsch? Da fehlt doch auch kein NEW mehr?
    Viele Grüße,
    derzunächst doch wieder mit Strukturen arbeitende - obwohl ich doch endlich mal objektorientiert programmieren wollte!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cubetoon“ ()

    wenn du willst, dass der array leer ist, mach einfach redim arrayname(0) (ohne preserve!!) Dann hat der array genau 1 feld und dass is leer. Beim hinzufügen überprüfst du dann das ubound leer ist, wenn ja, schreibst du in das ubound wenn nicht, machst du redim preserve array(ubound+1).

    Ich hoffe, das dir das weiterhilft. (Ich hab dein Problem nicht ganz verstanden... könnte an dem viiiieeelen code liegen)
    danke für deine antwort.sorry, war gerade länger nicht online.

    glaube mein quelltext war wirklich etwas oversized, hab ihn noch mal auf das wesentliche verkleinert.

    gerade da liegt mein problem ... wenn ich mit redim array(0) das array neu initialisiere wird auch das array des anderen objektes mitgelöscht.

    ich habe also zwei objekte, beide abgeleitet von der klasse tasks mit:

    DIM myTask() as Tasks

    und

    myTask(0) = New Task bzw.
    myTask(1) = New Task

    Fülle ich nun das in der Klasse enthaltene Array strValue mit werten und erstelle dann ein neues Objekt mit myTask(1) = New Task werden dort die alten Werte des Array übernommen. Lösche ich, gleich nach der Erstellung des neuen Objektes diese "alten" Werte, sind diese auch in der Variablen myask(0) verschwunden. Ich bekomme als aus irgend einem (sicherlich logischen) Grund kein neues sondern ein bestehendes Objekt zugewiesen.

    Was mache ich falsch?