Array einer Struktur initialisierung

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Array einer Struktur initialisierung

    hallo

    ich habe bisher nur in C Programmiert und möchte auf visual basic umsteigen, jz habe ich folgendes Problem:
    in C sehen verschachtelte Strukturen mehr oder weniger so aus:
    struct feld{
    void* zeiger
    int wert}

    struct symbole{
    int a
    int b}maschi

    static struct feld reti[]={
    maschi.a,1000,
    maschi.b,5000}

    wie schreibt man obiges in VB?
    Bitte um Hilfe
    :thumbup: Du bist cool ich mag dich ;) :D

    Du hattest doch gefragt:
    wie schreibt man obiges in VB?


    Und meine Antwort war einfach nur schlecht und nicht für einen Neuling gedacht, deswegen bitte ich um Verzeihung.
    Hier ist eine bessere und verständlicher:

    Möchtest du deinen Code in VB anzeigen lassen, so verwende doch bitte vor deinem Code das VB-Tag
    [.vb] <-- Hiermit wird gesagt: ! Achtung ! Es folgt VB Code

    Ist dein Code beendet und der Rest deines Textes soll nicht mehr in VB stehen, dann verwende doch bitte das VB-Tag
    [./vb] <-- Hiermit wird gesagt: ! Achtung ! Es folgt kein VB-Code mehr.

    Und wenn du die nun schreibst, dann musst du die Punkte die ich verwendet habe weglassen damit dir auch der Code angezeigt werden kann.
    Ich hoffe ich Dummkopf habe mich nun besser ausgedrückt

    Grüßle Marco

    EDIT:
    Und wenn ich dich richtig verstanden habe wegen den Structure, dann ist das glaube ich hier für dich was:
    Structure

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

    in VB kann man innerhalb einer Structure-Definition keine innere Structure definieren.

    du kannst allerdings innerhalb einer Structure definieren, dass eine annere Structure enthalten sein soll.

    ZB ist in der RectAngle-Structure eine Point-Structure enthalten und eine Size-Structure.

    Aber definiert sind alle 3 STructures auf gleicher Ebene, nämlich im System.Drawing-Namespace.

    fugo schrieb:

    in C sehen verschachtelte Strukturen

    Vlt erklärst du lieber, was du machen willst ...

    BTW: "Structures" im .Net Framework sind nicht der Knaller (boxing, unboxing, etc) und MS empfiehlt, sie nur dann einzusetzen, wenn nur sehr wenig Daten "gespeichert" werden müssen und wenn es auf absolut maximale Performance ankommt. In allen anderen Fällen nimmt man Klassen.
    Gilt im übrigen für ALLE .Net Sprachen!
    Ich habe mehrere Strukturen/Klassen (z.b mit 10,15,20,25,.... Variablen)
    Nun möchte ich EINE globale Struktur erstellen, die soll eine beliebige Struktur in eine txt schreiben.

    In C hat das folgendermaßen ausgesehen.

    C-Quellcode

    1. struct retisymbol
    2. {
    3. char symname[56];
    4. double xkos, ykos;
    5. }reti;
    6. struct maschine
    7. {
    8. char symname[56];
    9. double xpos, ypos;
    10. }masch;
    11. struct FELD
    12. {
    13. void *vptr;
    14. int dix;
    15. char ftext[81];
    16. };
    17. static struct FELD symbmask[]=
    18. {
    19. reti.symnum, 0, "aaaaaa",
    20. &reti.xkos,1,"bbbbbbbb",
    21. &reti.ykos,2,"cccccccc"
    22. };
    23. static struct FELD maschmask[]=
    24. {
    25. masch.symnum, 0, "aaaaaa",
    26. &masch.xpos,1,"bbbbbbbb",
    27. &masch.ypos,2,"cccccccc"
    28. };
    29. void outfile(struct FELD *masknam, int feldanz)
    30. {
    31. for (i=0;i<feldanz;i++)
    32. {
    33. fprintf(FILE, masknam[i].ftext)
    34. fprintf(FILE, masknam[i].dix)
    35. fprintf(FILE, masknam[i].vptr)
    36. }
    37. }
    38. void main(int argc,char **argv)
    39. {
    40. outfile(symbmask,3);
    41. outfile(maschmask,3);
    42. }


    Soviel ich weiß gibt es in VB keine Pointer, stimmt das?
    Das ist eigentlich mein Hauptproblem.
    und kann man den obigen Code auch in VB realisieren?
    DANKE

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

    Sorry hab mich verschrieben, ich meinte EINE globale Funktion nicht Struktur.
    Ich kenn mich mit der Serialization nicht aus, wird da nur der Wert in das File geschrieben oder kann man auch folgendes in das File schreiben?

    Beispiel
    Position X: 50
    Position Y: 60
    .....

    und kann man das File auch mit dem Editor öffnen und nachsehen was drin steht?

    ich mehrere verschiedene txt Dateien.
    Beispiel:

    erste Datei: symbol.txt

    Symbol Name : TEST
    Position X[mm] :45
    Position Y[mm] :50
    ...

    zweite Datei: Wert.txt
    Länge[mm] :600
    Beschreibung : nur ein Test
    ...

    ich möchte mit einer Funktion sämtliche Werte aus den Datei lesen und die Werte der jeweiligen Struktur zuweisen.
    Gleiches beim schreiben.

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

    der soap formatter ist auch nicht das richtige für mich.

    ich möchte eine beliebige Dateiendung, z.b .txt oder .mph oder .sqm, einstellen können.

    und in der Datei sollen meine Datensatz folgendermaßen angezeigt werden.

    [txt]
    Info : Maske für Typ1
    ID : 10000

    Symbol 1
    Xpos : 1000
    Ypos : 500
    Speed : 10
    Accel : 12

    Symbol 2
    Xpos : 100
    Ypos : 600
    Speed : 100
    Accel : 120

    Symbol 3
    Xpos : 600
    Ypos : 800
    Speed : 20
    Accel : 22
    ..

    [/txt]

    Das Hauptproblem ist allerdings das ich nicht immer die selbe Datenstruktur habe, manchmal kann ein Symbol 10 Parameter ein anderes mal 30 Parameter besitzen.

    Mit nur einer Datenstruktur würde mit dem StreamReader oder Writer es ohne Probleme funktionieren.
    Ich habe mal eine Klasse für dein Problem geschrieben.
    Ich hoffe das sie dir hilft ;)

    Klasse

    VB.NET-Quellcode

    1. Public Class PropertyManager
    2. Private name_ As New List(Of String)
    3. Private value_ As New List(Of String)
    4. Private collectList_ As New List(Of PropertyManager)
    5. Private listIndex_ As Integer = -1
    6. #Region "Propertys"
    7. Public Property CollectList As List(Of PropertyManager)
    8. Get
    9. Return collectList_
    10. End Get
    11. Set(ByVal value As List(Of PropertyManager))
    12. collectList_ = value
    13. End Set
    14. End Property
    15. Public Property Name As List(Of String)
    16. Get
    17. Return name_
    18. End Get
    19. Set(ByVal value As List(Of String))
    20. name_ = value
    21. End Set
    22. End Property
    23. Public Property Value As List(Of String)
    24. Get
    25. Return value_
    26. End Get
    27. Set(ByVal value As List(Of String))
    28. value_ = value
    29. End Set
    30. End Property
    31. Public Property ListIndex As Integer
    32. Get
    33. Return listIndex_
    34. End Get
    35. Set(ByVal value As Integer)
    36. If value >= 0 AndAlso value <= CollectList.Count - 1 Then
    37. listIndex_ = value
    38. Else
    39. MessageBox.Show("ListIndex außerhalb des gültigen Bereiches!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    40. End If
    41. End Set
    42. End Property
    43. #End Region
    44. ''' <summary>
    45. ''' String in Name und Wert aufteilen und zu einer bestehenden Liste hinzufügen
    46. ''' </summary>
    47. ''' <param name="stringToSplit">Der zu teilende String</param>
    48. ''' <param name="separator">Trennzeichen</param>
    49. ''' <remarks></remarks>
    50. Public Sub AddSplit(ByVal stringToSplit As String, ByVal separator As Char)
    51. If Not stringToSplit Is String.Empty Then
    52. AddPropertyToList(stringToSplit.Split(separator)(0).Trim, stringToSplit.Split(separator)(1).Trim)
    53. End If
    54. End Sub
    55. ''' <summary>
    56. ''' Gibt den Namen und den Wert einer Eigenschaft zusammen mit einem Trennzeichen zurück
    57. ''' </summary>
    58. ''' <param name="listIndex">Index der zu wählenden Liste</param>
    59. ''' <param name="propertyIndex">Index der zu wählenden Eigenschaft</param>
    60. ''' <param name="spaceFiller">Trennzeichen zwischen Name und Wert</param>
    61. ''' <returns></returns>
    62. ''' <remarks></remarks>
    63. Public Function GetNameAndValue(ByVal listIndex As Integer, ByVal propertyIndex As Integer, ByVal spaceFiller As String) As String
    64. If Not CollectList Is Nothing AndAlso CollectList.Count > 0 Then
    65. If Not CollectList(listIndex) Is Nothing Then
    66. Return String.Format("{0}{1}{2}", CollectList(listIndex).Name(propertyIndex), spaceFiller, CollectList(listIndex).Value(propertyIndex))
    67. End If
    68. Else
    69. End If
    70. Return ""
    71. End Function
    72. ''' <summary>
    73. ''' Eine neue Leere Liste hinzufügen
    74. ''' </summary>
    75. ''' <remarks></remarks>
    76. Public Sub AddNewList()
    77. CollectList.Add(Nothing)
    78. listIndex_ += 1
    79. End Sub
    80. ''' <summary>
    81. ''' Eine neue Liste mit Eigenschaft hinzufügen
    82. ''' </summary>
    83. ''' <param name="propName"></param>
    84. ''' <param name="propValue"></param>
    85. ''' <remarks></remarks>
    86. Public Sub AddNewList(ByVal propName As String, ByVal propValue As String)
    87. CollectList.Add(AddFirstProperty(propName, propValue))
    88. listIndex_ += 1
    89. End Sub
    90. ''' <summary>
    91. ''' Eigenschaft zu einer Liste hinzufügen
    92. ''' </summary>
    93. ''' <param name="propName"></param>
    94. ''' <param name="propValue"></param>
    95. ''' <remarks></remarks>
    96. Public Sub AddPropertyToList(ByVal propName As String, ByVal propValue As String)
    97. If CollectList.Count > 0 Then
    98. If CollectList(listIndex_) Is Nothing Then
    99. CollectList(listIndex_) = AddFirstProperty(propName, propValue)
    100. Else
    101. CollectList(listIndex_).Name.Add(propName)
    102. CollectList(listIndex_).Value.Add(propValue)
    103. End If
    104. Else
    105. AddFirstProperty(propName, propValue)
    106. End If
    107. End Sub
    108. ''' <summary>
    109. ''' Fügt die erste Eigenschaft zu einer neuen Liste hinzu
    110. ''' </summary>
    111. ''' <param name="propName">Name</param>
    112. ''' <param name="propValue">Wert</param>
    113. ''' <returns></returns>
    114. ''' <remarks></remarks>
    115. Private Function AddFirstProperty(ByVal propName As String, ByVal propValue As String) As PropertyManager
    116. Dim tempList As New PropertyManager
    117. tempList.Name.Add(propName)
    118. tempList.Value.Add(propValue)
    119. Return tempList
    120. End Function
    121. End Class


    Eigenschaften und Methoden

    Eigenschaften:
    CollectList : Sammlung aller Listen
    ListIndex : Den Index für die aktuelle Liste lesen oder setzen
    Name : Name der Eigenschaft
    Value : Wert der Eigenschaft

    Methoden:
    AddNewList() : Neue leere Liste zu CollectList hinzufügen
    AddNewList(propName As String, propValue As String) : Neue Liste, mit ersten Eigenschaftswerten, zu CollectList hinzufügen
    AddProperryToList(propName As String, propValue As String) : Eigenschaften zur aktullen Liste hinzufügen
    AddSplit(stringToSplit As String, separator As Char) : String in Name und Wert aufteilen und in aktueller Liste speichern
    GetNameAndValue(listIndex As Integer, propertyIndex As Integer, spaceFiller As String) : Gibt den Namen und den Wert einer Eigenschaft zusammen mit einem Trennzeichen zurück


    Beispiel: Speichern

    VB.NET-Quellcode

    1. Dim propertyList As New PropertyManager
    2. propertyList.AddNewList("Info", "Maske für Typ1") 'Eine neue Liste erstellen und mit Eigenschaften füllen
    3. propertyList.AddPropertyToList("ID", "1000") 'Weitere Eigenschaften hinzufügen
    4. propertyList.AddPropertyToList("Symbolname", "1")
    5. propertyList.AddPropertyToList("Xpos", "1000")
    6. propertyList.AddPropertyToList("Ypos", "500")
    7. propertyList.AddPropertyToList("Speed", "10")
    8. propertyList.AddPropertyToList("Accel", "12")
    9. Dim FStream As New FileStream("C:\Test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.Read)
    10. Dim SWriter As New StreamWriter(FStream)
    11. For n As Integer = 0 To propertyList.CollectList(0).Name.Count - 1
    12. If propertyList.CollectList(0).Name(n) = "Symbolname" Then SWriter.WriteLine()
    13. SWriter.WriteLine(propertyList.GetNameAndValue(0, n, " : "))
    14. Next
    15. SWriter.Close()
    16. FStream.Close()


    Beispiel: Lesen

    VB.NET-Quellcode

    1. Dim propertyList As New PropertyManager
    2. Dim FStream As New FileStream("E:\TestStream.txt", FileMode.Open, FileAccess.Read, FileShare.Read)
    3. Dim SReader As New StreamReader(FStream)
    4. propertyList.AddNewList()
    5. Do Until SReader.Peek = -1
    6. propertyList.AddSplit(SReader.ReadLine, CChar(":"))
    7. Loop
    8. SReader.Close()
    9. FStream.Close()
    10. MessageBox.Show(readList.CollectList(0).Name(0)) 'Name der ersten Eigenschaft in der ersten Tabelle
    11. MessageBox.Show(readList.CollectList(0).Value(0)) 'Wert der ersten Eigenschaft in der ersten Tabelle
    12. MessageBox.Show(readList.GetNameAndValue(0, 0, " : ")) 'Name und Wert der ersten Eigenschaft in der ersten Tabelle



    MfG

    DarkAngel
    Danke, das ist echt super!!!!

    Ein kleines Problem hab ich noch,
    und zwar ich möchte am Programmstart meiner Liste die Variablen übergeben

    VB.NET-Quellcode

    1. propertyList.AddNewList("Info", Wert(0)) 'Eine neue Liste erstellen und mit Eigenschaften füllen
    2. propertyList.AddPropertyToList("ID", Wert(1)) 'Weitere Eigenschaften hinzufügen
    3. propertyList.AddPropertyToList("Symbolname", Wert(2))
    4. propertyList.AddPropertyToList("Xpos", Wert(3))


    und wenn ich zu einem späteren Zeitpunkt speichern und lesen ausführe, sollen die Variablen(Wert()), die zuvor im Programm geändert werden können, aktualisiert werden.
    Gibt es da was? Eine Art Refresh?
    Ja das ist kein Problem :D

    Diese Prozedur fügst du in die Klasse ein:
    Prozedur

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Aktualisiert die Namen und Werte in einer Liste
    3. ''' </summary>
    4. ''' <param name="propValueList">Liste mit neuen Werten</param>
    5. ''' <param name="propNameList">Liste mit neuen Namen</param>
    6. ''' <param name="indexOfList">Liste wählen, die aktualisiert werden soll</param>
    7. ''' <remarks></remarks>
    8. Public Sub RefreshList(ByVal propValueList As List(Of String), _
    9. Optional ByVal propNameList As List(Of String) = Nothing, _
    10. Optional ByVal indexOfList As Integer = Nothing)
    11. If indexOfList = Nothing Then indexOfList = listIndex_
    12. For n As Integer = 0 To propValueList.Count - 1
    13. CollectList(indexOfList).Value(n) = propValueList(n)
    14. If Not propNameList Is Nothing Then
    15. CollectList(indexOfList).Name(n) = propNameList(n)
    16. End If
    17. Next
    18. End Sub


    Beispiel: Nur Werte aktualisieren

    VB.NET-Quellcode

    1. Dim propertyList As New PropertyManager
    2. Dim refreshV As New List(Of String) 'Liste für die Werte
    3. refreshV.Add("Maske für Typ1")
    4. refreshV.Add("1000")
    5. refreshV.Add("1")
    6. refreshV.Add("1000")
    7. propertyList.AddNewList("Info", refreshV(0))
    8. propertyList.AddPropertyToList("ID", refreshV(1))
    9. propertyList.AddPropertyToList("Symbolname", refreshV(2))
    10. propertyList.AddPropertyToList("Xpos", refreshV(3))
    11. refreshV(0) = "Maske für Typ2"
    12. refreshV(1) = "2000"
    13. refreshV(2) = "3"
    14. refreshV(3) = "10000"
    15. propertyList.RefreshList(refreshV) 'Die aktuelle Liste mit neuen Werten aktualisieren


    Beispiel: Namen und Werte aktualisieren

    VB.NET-Quellcode

    1. Dim propertyList As New PropertyManager
    2. Dim refreshV As New List(Of String) 'Liste für die Werte
    3. refreshV.Add("Maske für Typ1")
    4. refreshV.Add("1000")
    5. refreshV.Add("1")
    6. refreshV.Add("1000")
    7. refreshN.Add("Neue Info")
    8. refreshN.Add("Neue ID")
    9. refreshN.Add("Symbol2")
    10. refreshN.Add("XYpos")
    11. propertyList.AddNewList("Info", refreshV(0))
    12. propertyList.AddPropertyToList("ID", refreshV(1))
    13. propertyList.AddPropertyToList("Symbolname", refreshV(2))
    14. propertyList.AddPropertyToList("Xpos", refreshV(3))
    15. refreshV(0) = "Maske für Typ2"
    16. refreshV(1) = "2000"
    17. refreshV(2) = "3"
    18. refreshV(3) = "10000"
    19. propertyList.RefreshList(refreshV,refreshN) 'Die aktuelle Liste mit neuen Namen und Werten aktualisieren


    MfG

    DarkAngel
    Ist nicht weiter das Problem :D
    Einfach alle List(Of String) die mit der Variable "value" zu tun haben, durch List(Of Object) ersetzen.
    Oder "value As String" durch "value As Object".
    Habe ich mal schnell gemacht ;)

    Angepasste Klasse

    VB.NET-Quellcode

    1. Public Class PropertyManager
    2. Private name_ As New List(Of String)
    3. Private value_ As New List(Of Object)
    4. Private collectList_ As New List(Of PropertyManager)
    5. Private listIndex_ As Integer = -1
    6. #Region "Propertys"
    7. Public Property CollectList As List(Of PropertyManager)
    8. Get
    9. Return collectList_
    10. End Get
    11. Set(ByVal value As List(Of PropertyManager))
    12. collectList_ = value
    13. End Set
    14. End Property
    15. Public Property Name As List(Of String)
    16. Get
    17. Return name_
    18. End Get
    19. Set(ByVal value As List(Of String))
    20. name_ = value
    21. End Set
    22. End Property
    23. Public Property Value As List(Of Object)
    24. Get
    25. Return value_
    26. End Get
    27. Set(ByVal value As List(Of Object))
    28. value_ = value
    29. End Set
    30. End Property
    31. Public Property ListIndex As Integer
    32. Get
    33. Return listIndex_
    34. End Get
    35. Set(ByVal value As Integer)
    36. If value >= 0 AndAlso value <= CollectList.Count - 1 Then
    37. listIndex_ = value
    38. Else
    39. MessageBox.Show("ListIndex außerhalb des gültigen Bereiches!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    40. End If
    41. End Set
    42. End Property
    43. #End Region
    44. ''' <summary>
    45. ''' String in Name und Wert aufteilen und zu einer bestehenden Liste hinzufügen
    46. ''' </summary>
    47. ''' <param name="stringToSplit">Der zu teilende String</param>
    48. ''' <param name="separator">Trennzeichen</param>
    49. ''' <remarks></remarks>
    50. Public Sub AddSplit(ByVal stringToSplit As String, ByVal separator As Char)
    51. If Not stringToSplit Is String.Empty Then
    52. AddPropertyToList(stringToSplit.Split(separator)(0).Trim, stringToSplit.Split(separator)(1).Trim)
    53. End If
    54. End Sub
    55. ''' <summary>
    56. ''' Gibt den Namen und den Wert einer Eigenschaft zusammen mit einem Trennzeichen zurück
    57. ''' </summary>
    58. ''' <param name="listIndex">Index der zu wählenden Liste</param>
    59. ''' <param name="propertyIndex">Index der zu wählenden Eigenschaft</param>
    60. ''' <param name="spaceFiller">Trennzeichen zwischen Name und Wert</param>
    61. ''' <returns></returns>
    62. ''' <remarks></remarks>
    63. Public Function GetNameAndValue(ByVal listIndex As Integer, ByVal propertyIndex As Integer, ByVal spaceFiller As String) As String
    64. If Not CollectList Is Nothing AndAlso CollectList.Count > 0 Then
    65. If Not CollectList(listIndex) Is Nothing Then
    66. Return String.Format("{0}{1}{2}", CollectList(listIndex).Name(propertyIndex), spaceFiller, CollectList(listIndex).Value(propertyIndex))
    67. End If
    68. Else
    69. End If
    70. Return ""
    71. End Function
    72. ''' <summary>
    73. ''' Eine neue Leere Liste hinzufügen
    74. ''' </summary>
    75. ''' <remarks></remarks>
    76. Public Sub AddNewList()
    77. CollectList.Add(Nothing)
    78. listIndex_ += 1
    79. End Sub
    80. ''' <summary>
    81. ''' Eine neue Liste mit Eigenschaft hinzufügen
    82. ''' </summary>
    83. ''' <param name="propName"></param>
    84. ''' <param name="propValue"></param>
    85. ''' <remarks></remarks>
    86. Public Sub AddNewList(ByVal propName As String, ByVal propValue As Object)
    87. CollectList.Add(AddFirstProperty(propName, propValue))
    88. listIndex_ += 1
    89. End Sub
    90. ''' <summary>
    91. ''' Eigenschaft zu einer Liste hinzufügen
    92. ''' </summary>
    93. ''' <param name="propName"></param>
    94. ''' <param name="propValue"></param>
    95. ''' <remarks></remarks>
    96. Public Sub AddPropertyToList(ByVal propName As String, ByVal propValue As Object)
    97. If CollectList.Count > 0 Then
    98. If CollectList(listIndex_) Is Nothing Then
    99. CollectList(listIndex_) = AddFirstProperty(propName, propValue)
    100. Else
    101. CollectList(listIndex_).Name.Add(propName)
    102. CollectList(listIndex_).Value.Add(propValue)
    103. End If
    104. Else
    105. AddFirstProperty(propName, propValue)
    106. End If
    107. End Sub
    108. ''' <summary>
    109. ''' Fügt die erste Eigenschaft zu einer neuen Liste hinzu
    110. ''' </summary>
    111. ''' <param name="propName">Name</param>
    112. ''' <param name="propValue">Wert</param>
    113. ''' <returns></returns>
    114. ''' <remarks></remarks>
    115. Private Function AddFirstProperty(ByVal propName As String, ByVal propValue As Object) As PropertyManager
    116. Dim tempList As New PropertyManager
    117. tempList.Name.Add(propName)
    118. tempList.Value.Add(propValue)
    119. Return tempList
    120. End Function
    121. ''' <summary>
    122. ''' Die Namen und Werte einer List aktualisieren
    123. ''' </summary>
    124. ''' <param name="propValueList">Liste mit neuen Werten</param>
    125. ''' <param name="propNameList">Liste mit neuen Namen</param>
    126. ''' <param name="indexOfList">Liste wählen, die aktualisiert werden soll</param>
    127. ''' <remarks></remarks>
    128. Public Sub RefreshList(ByVal propValueList As List(Of Object), Optional ByVal propNameList As List(Of String) = Nothing, Optional ByVal indexOfList As Integer = Nothing)
    129. If indexOfList = Nothing Then indexOfList = listIndex_
    130. For n As Integer = 0 To propValueList.Count - 1
    131. CollectList(indexOfList).Value(n) = propValueList(n)
    132. If Not propNameList Is Nothing Then
    133. CollectList(indexOfList).Name(n) = propNameList(n)
    134. End If
    135. Next
    136. End Sub
    137. End Class


    Und die Liste für die Werte auch ändern:

    VB.NET-Quellcode

    1. Dim refreshV As New List(Of Object)


    MfG

    DarkAngel
    Verdammt, mir ist das noch nicht ganz klar.

    wenn ich eine Klasse:

    VB.NET-Quellcode

    1. Public Class test
    2. Public Name as String
    3. Public Wert as Single
    4. Public XPos as Single
    5. Public Length as integer
    6. Public YPos as Single
    7. Public XKor as Single
    8. Public Ykor as Single
    9. Public Intervall as Single
    10. Public Breite as integer
    11. End Class
    12. Public Test12 as new Test


    Dann kann ich Test12 nicht für Refresh verwenden oder?

    VB.NET-Quellcode

    1. propertyList.RefreshList(Test12) 'Die aktuelle Liste mit neuen Werten aktualisieren
    So, ich habe die Klasse so angepasst, das es nun klappen sollte ;)

    Aktualisierte Klasse

    VB.NET-Quellcode

    1. Public Class PropertyManager
    2. Private name_ As New List(Of String)
    3. Private value_ As New List(Of Object)
    4. Private test As New List(Of Object)
    5. Private collectList_ As New List(Of PropertyManager)
    6. Private listIndex_ As Integer = -1
    7. #Region "Propertys"
    8. Public Property CollectList As List(Of PropertyManager)
    9. Get
    10. Return collectList_
    11. End Get
    12. Set(ByVal value As List(Of PropertyManager))
    13. collectList_ = value
    14. End Set
    15. End Property
    16. Public Property Name As List(Of String)
    17. Get
    18. Return name_
    19. End Get
    20. Set(ByVal value As List(Of String))
    21. name_ = value
    22. End Set
    23. End Property
    24. Public Property Value As List(Of Object)
    25. Get
    26. Return value_
    27. End Get
    28. Set(ByVal value As List(Of Object))
    29. value_ = value
    30. End Set
    31. End Property
    32. Public Property ListIndex As Integer
    33. Get
    34. Return listIndex_
    35. End Get
    36. Set(ByVal value As Integer)
    37. If value >= 0 AndAlso value <= CollectList.Count - 1 Then
    38. listIndex_ = value
    39. Else
    40. MessageBox.Show("ListIndex außerhalb des gültigen Bereiches!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    41. End If
    42. End Set
    43. End Property
    44. #End Region
    45. ''' <summary>
    46. ''' Eine Liste in eine Klasse übertragen
    47. ''' </summary>
    48. ''' <param name="class">Die Klasse, welche als Ziel benutzt werden soll</param>
    49. ''' <remarks></remarks>
    50. Public Sub ListToClass(ByVal [class] As Object)
    51. Dim counter As Integer = 0
    52. For Each fi As System.Reflection.FieldInfo In [class].GetType().GetFields
    53. Select Case fi.FieldType.ToString
    54. Case "System.Int32"
    55. fi.SetValue([class], CType(CollectList(listIndex_).Value(counter), Integer))
    56. Case "System.String"
    57. fi.SetValue([class], CType(CollectList(listIndex_).Value(counter), String))
    58. Case "System.Single"
    59. fi.SetValue([class], CType(CollectList(listIndex_).Value(counter), Single))
    60. End Select
    61. counter += 1
    62. Next
    63. End Sub
    64. ''' <summary>
    65. ''' Eine Klasse in eine neue Liste übertragen
    66. ''' </summary>
    67. ''' <param name="class">Die Klasse, welche als Quelle benutzt werden soll</param>
    68. ''' <remarks></remarks>
    69. Public Sub ClassToNewList(ByVal [class] As Object)
    70. AddNewList()
    71. For Each fi As System.Reflection.FieldInfo In [class].GetType().GetFields
    72. AddPropertyToList(fi.Name, fi.GetValue([class]))
    73. Next
    74. End Sub
    75. ''' <summary>
    76. ''' String in Name und Wert aufteilen und zu einer bestehenden Liste hinzufügen
    77. ''' </summary>
    78. ''' <param name="stringToSplit">Der zu teilende String</param>
    79. ''' <param name="separator">Trennzeichen</param>
    80. ''' <remarks></remarks>
    81. Public Sub AddSplit(ByVal stringToSplit As String, ByVal separator As Char)
    82. If Not stringToSplit Is String.Empty Then
    83. AddPropertyToList(stringToSplit.Split(separator)(0).Trim, stringToSplit.Split(separator)(1).Trim)
    84. End If
    85. End Sub
    86. ''' <summary>
    87. ''' Gibt den Namen und den Wert einer Eigenschaft zusammen mit einem Trennzeichen zurück
    88. ''' </summary>
    89. ''' <param name="listIndex">Index der zu wählenden Liste</param>
    90. ''' <param name="propertyIndex">Index der zu wählenden Eigenschaft</param>
    91. ''' <param name="spaceFiller">Trennzeichen zwischen Name und Wert</param>
    92. ''' <returns></returns>
    93. ''' <remarks></remarks>
    94. Public Function GetNameAndValue(ByVal listIndex As Integer, ByVal propertyIndex As Integer, ByVal spaceFiller As String) As String
    95. If Not CollectList Is Nothing AndAlso CollectList.Count > 0 Then
    96. If Not CollectList(listIndex) Is Nothing Then
    97. Return String.Format("{0}{1}{2}", CollectList(listIndex).Name(propertyIndex), spaceFiller, CollectList(listIndex).Value(propertyIndex))
    98. End If
    99. Else
    100. End If
    101. Return ""
    102. End Function
    103. ''' <summary>
    104. ''' Eine neue Leere Liste hinzufügen
    105. ''' </summary>
    106. ''' <remarks></remarks>
    107. Public Sub AddNewList()
    108. CollectList.Add(Nothing)
    109. listIndex_ += 1
    110. End Sub
    111. ''' <summary>
    112. ''' Eine neue Liste mit Eigenschaft hinzufügen
    113. ''' </summary>
    114. ''' <param name="propName"></param>
    115. ''' <param name="propValue"></param>
    116. ''' <remarks></remarks>
    117. Public Sub AddNewList(ByVal propName As String, ByVal propValue As Object)
    118. CollectList.Add(AddFirstProperty(propName, propValue))
    119. listIndex_ += 1
    120. End Sub
    121. ''' <summary>
    122. ''' Eigenschaft zu einer Liste hinzufügen
    123. ''' </summary>
    124. ''' <param name="propName"></param>
    125. ''' <param name="propValue"></param>
    126. ''' <remarks></remarks>
    127. Public Sub AddPropertyToList(ByVal propName As String, ByVal propValue As Object)
    128. If CollectList.Count > 0 Then
    129. If CollectList(listIndex_) Is Nothing Then
    130. CollectList(listIndex_) = AddFirstProperty(propName, propValue)
    131. Else
    132. CollectList(listIndex_).Name.Add(propName)
    133. CollectList(listIndex_).Value.Add(propValue)
    134. End If
    135. Else
    136. AddNewList(propName, propValue)
    137. End If
    138. End Sub
    139. ''' <summary>
    140. ''' Fügt die erste Eigenschaft zu einer neuen Liste hinzu
    141. ''' </summary>
    142. ''' <param name="propName">Name</param>
    143. ''' <param name="propValue">Wert</param>
    144. ''' <returns></returns>
    145. ''' <remarks></remarks>
    146. Private Function AddFirstProperty(ByVal propName As String, ByVal propValue As Object) As PropertyManager
    147. Dim tempList As New PropertyManager
    148. tempList.Name.Add(propName)
    149. tempList.Value.Add(propValue)
    150. Return tempList
    151. End Function
    152. ''' <summary>
    153. ''' Die Namen und Werte einer Liste aktualisieren
    154. ''' </summary>
    155. ''' <param name="propValueList">Liste mit neuen Werten</param>
    156. ''' <param name="propNameList">Liste mit neuen Namen</param>
    157. ''' <param name="indexOfList">Liste wählen, die aktualisiert werden soll</param>
    158. ''' <remarks></remarks>
    159. Public Sub RefreshList(ByVal propValueList As List(Of Object), Optional ByVal propNameList As List(Of String) = Nothing, Optional ByVal indexOfList As Integer = Nothing)
    160. If indexOfList = Nothing Then indexOfList = listIndex_
    161. For n As Integer = 0 To propValueList.Count - 1
    162. CollectList(indexOfList).Value(n) = propValueList(n)
    163. If Not propNameList Is Nothing Then
    164. CollectList(indexOfList).Name(n) = propNameList(n)
    165. End If
    166. Next
    167. End Sub
    168. ''' <summary>
    169. ''' Die Namen und Werte einer Liste aktualisieren
    170. ''' </summary>
    171. ''' <param name="class">Die Klasse, welche als Quelle benutzt werden soll</param>
    172. ''' <remarks></remarks>
    173. Public Sub RefreshList(ByVal [class] As Object)
    174. Dim counter As Integer = 0
    175. For Each fi As System.Reflection.FieldInfo In [class].GetType().GetFields
    176. CollectList(listIndex_).Value(counter) = fi.GetValue([class])
    177. CollectList(listIndex_).Name(counter) = fi.Name
    178. counter += 1
    179. Next
    180. End Sub
    181. End Class


    Beispiel: Liste nach Klasse kopieren | Liste aktualisieren | Klasse in neue Liste kopieren

    VB.NET-Quellcode

    1. Dim propertyList As New PropertyManager
    2. Dim myClass As New MyClass
    3. propertyList.AddNewList("Name", "Maske für Typ1")
    4. propertyList.AddPropertyToList("Wert", 10.29)
    5. propertyList.AddPropertyToList("Xpos", 13.12)
    6. propertyList.AddPropertyToList("Length", 100)
    7. propertyList.ListToClass(myClass) 'Die aktuelle Liste (Liste 0) in die gewählte Klasse kopieren
    8. propertyList.RefreshList(myClass) 'Die aktuelle Liste (Liste 0) mit den Werten aus der Klasse aktualisieren
    9. propertyList.ClassToNewList(myClass) 'Die Klasse in eine neue Liste (Liste 1) kopieren; ListIndex wird um 1 erhöht
    10. propertyList.RefreshList(myClass) 'Die aktuelle Liste (Liste 1) mit den Werten aus der Klasse aktualisieren


    MfG

    DarkAngel

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DarkAngel“ () aus folgendem Grund: Neue Klasse und neues Beispiel