Aus einem Dezimalwert Bits errechnen und werten.

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von DannyDee.

    Aus einem Dezimalwert Bits errechnen und werten.

    Ich hab da ein kleines Problemchen.

    Ich habe ein Programm welches mir den Dezimalwert eines Registers zuschickt. Dieses Register steuert 5 Relais. Ich möchte , aus dem ausgelesenen Dezimalwert , die Bitreihenfolge errechnen und dadurch ein Visuelles Feedback geben können , welche Bits gesetzt sind , bzw welche Relais damit aktiv sind.

    Bsp:
    Ausgelesener Wert(Dec) : 7
    Bitreihenfolge : 00111
    Relais aktiv : Relais 0 , Relais 1 , Relais 2

    Hat jmd ne Ahnung wie ich aus dem Decwert die Bits errechne und durch die Bitreihenfolge auslesen bestimmen kann welche Relais mir im Programm als Aktiv angezeigt werden sollen?

    z.Z. benutze ich Rote Buttons für die einzelnen Relais , welche Grün werden ,falls das Relais aktiv ist.

    Hier mal der Code zum reinschnuppern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub cmd_zyklRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_zyklRead.Click
    2. If TimerRead.Enabled = False Then
    3. cmd_zyklRead.Text = "Lesen aktiv"
    4. TimerRead.Enabled = True
    5. TB_ShortAdr.ReadOnly = True
    6. TB_Reg.ReadOnly = True
    7. Else
    8. TimerRead.Enabled = False
    9. cmd_zyklRead.Text = "Zyklisches Lesen"
    10. cb_SingleAct.Checked = True
    11. TB_ShortAdr.ReadOnly = False
    12. TB_Reg.ReadOnly = False
    13. End If
    14. End Sub
    15. Private Sub cmd_rel0_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel0.Click
    16. If cb_SingleAct.Checked = True Then
    17. writeReg(TB_ShortAdr.Text, 0, 1)
    18. End If
    19. If cb_SingleAct.Checked = False And cmd_rel0.BackColor = Color.Red Then
    20. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text + 1)
    21. End If
    22. If cb_SingleAct.Checked = False And cmd_rel0.BackColor = Color.Green Then
    23. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text - 1)
    24. End If
    25. End Sub
    26. Private Sub cmd_rel1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel1.Click
    27. If cb_SingleAct.Checked = True Then
    28. writeReg(TB_ShortAdr.Text, 0, 2)
    29. End If
    30. If cb_SingleAct.Checked = False And cmd_rel1.BackColor = Color.Red Then
    31. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text + 2)
    32. End If
    33. If cb_SingleAct.Checked = False And cmd_rel1.BackColor = Color.Green Then
    34. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text - 2)
    35. End If
    36. End Sub
    37. Private Sub cmd_rel2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel2.Click
    38. If cb_SingleAct.Checked = True Then
    39. writeReg(TB_ShortAdr.Text, 0, 4)
    40. End If
    41. If cb_SingleAct.Checked = False And cmd_rel2.BackColor = Color.Red Then
    42. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text + 4)
    43. End If
    44. If cb_SingleAct.Checked = False And cmd_rel2.BackColor = Color.Green Then
    45. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text - 4)
    46. End If
    47. End Sub
    48. Private Sub cmd_rel3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel3.Click
    49. If cb_SingleAct.Checked = True Then
    50. writeReg(TB_ShortAdr.Text, 0, 8)
    51. End If
    52. If cb_SingleAct.Checked = False And cmd_rel3.BackColor = Color.Red Then
    53. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text + 8)
    54. End If
    55. If cb_SingleAct.Checked = False And cmd_rel3.BackColor = Color.Green Then
    56. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text - 8)
    57. End If
    58. End Sub
    59. Private Sub cmd_rel4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_rel4.Click
    60. If cb_SingleAct.Checked = True Then
    61. writeReg(TB_ShortAdr.Text, 0, 16)
    62. End If
    63. If cb_SingleAct.Checked = False And cmd_rel4.BackColor = Color.Red Then
    64. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text + 16)
    65. End If
    66. If cb_SingleAct.Checked = False And cmd_rel4.BackColor = Color.Green Then
    67. writeReg(TB_ShortAdr.Text, 0, TB_ReadReg.Text - 16)
    68. End If
    69. End Sub
    70. Private Sub TimerStatus_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerStatus.Tick
    71. If TimerRead.Enabled = True Then
    72. cb_SingleAct.Visible = True
    73. Else
    74. cb_SingleAct.Visible = False
    75. End If
    76. Dim x As Integer
    77. x = readReg(TB_ShortAdr.Text, 0)
    78. Select Case x
    79. Case 1
    80. cmd_rel0.BackColor = Color.Green
    81. cmd_rel1.BackColor = Color.Red
    82. cmd_rel2.BackColor = Color.Red
    83. cmd_rel3.BackColor = Color.Red
    84. cmd_rel4.BackColor = Color.Red
    85. Case 2
    86. cmd_rel0.BackColor = Color.Red
    87. cmd_rel1.BackColor = Color.Green
    88. cmd_rel2.BackColor = Color.Red
    89. cmd_rel3.BackColor = Color.Red
    90. cmd_rel4.BackColor = Color.Red
    91. Case 3
    92. cmd_rel0.BackColor = Color.Green
    93. cmd_rel1.BackColor = Color.Green
    94. cmd_rel2.BackColor = Color.Red
    95. cmd_rel3.BackColor = Color.Red
    96. cmd_rel4.BackColor = Color.Red
    97. Case 4
    98. cmd_rel0.BackColor = Color.Red
    99. cmd_rel1.BackColor = Color.Red
    100. cmd_rel2.BackColor = Color.Green
    101. cmd_rel3.BackColor = Color.Red
    102. cmd_rel4.BackColor = Color.Red
    103. Case 5
    104. cmd_rel0.BackColor = Color.Green
    105. cmd_rel1.BackColor = Color.Red
    106. cmd_rel2.BackColor = Color.Green
    107. cmd_rel3.BackColor = Color.Red
    108. cmd_rel4.BackColor = Color.Red
    109. Case 6
    110. cmd_rel0.BackColor = Color.Red
    111. cmd_rel1.BackColor = Color.Green
    112. cmd_rel2.BackColor = Color.Green
    113. cmd_rel3.BackColor = Color.Red
    114. cmd_rel4.BackColor = Color.Red
    115. Case 7
    116. cmd_rel0.BackColor = Color.Green
    117. cmd_rel1.BackColor = Color.Green
    118. cmd_rel2.BackColor = Color.Green
    119. cmd_rel3.BackColor = Color.Red
    120. cmd_rel4.BackColor = Color.Red
    121. Case 8
    122. cmd_rel0.BackColor = Color.Red
    123. cmd_rel1.BackColor = Color.Red
    124. cmd_rel2.BackColor = Color.Red
    125. cmd_rel3.BackColor = Color.Green
    126. cmd_rel4.BackColor = Color.Red
    127. Case 9
    128. cmd_rel0.BackColor = Color.Green
    129. cmd_rel1.BackColor = Color.Red
    130. cmd_rel2.BackColor = Color.Red
    131. cmd_rel3.BackColor = Color.Green
    132. cmd_rel4.BackColor = Color.Red
    133. Case 10
    134. cmd_rel0.BackColor = Color.Red
    135. cmd_rel1.BackColor = Color.Green
    136. cmd_rel2.BackColor = Color.Red
    137. cmd_rel3.BackColor = Color.Green
    138. cmd_rel4.BackColor = Color.Red
    139. Case 11
    140. cmd_rel0.BackColor = Color.Green
    141. cmd_rel1.BackColor = Color.Green
    142. cmd_rel2.BackColor = Color.Red
    143. cmd_rel3.BackColor = Color.Green
    144. cmd_rel4.BackColor = Color.Red
    145. Case 12
    146. cmd_rel0.BackColor = Color.Red
    147. cmd_rel1.BackColor = Color.Red
    148. cmd_rel2.BackColor = Color.Green
    149. cmd_rel3.BackColor = Color.Green
    150. cmd_rel4.BackColor = Color.Red
    151. Case 13
    152. cmd_rel0.BackColor = Color.Green
    153. cmd_rel1.BackColor = Color.Red
    154. cmd_rel2.BackColor = Color.Green
    155. cmd_rel3.BackColor = Color.Green
    156. cmd_rel4.BackColor = Color.Red
    157. Case 14
    158. cmd_rel0.BackColor = Color.Red
    159. cmd_rel1.BackColor = Color.Green
    160. cmd_rel2.BackColor = Color.Green
    161. cmd_rel3.BackColor = Color.Green
    162. cmd_rel4.BackColor = Color.Red
    163. Case 15
    164. cmd_rel0.BackColor = Color.Green
    165. cmd_rel1.BackColor = Color.Green
    166. cmd_rel2.BackColor = Color.Green
    167. cmd_rel3.BackColor = Color.Green
    168. cmd_rel4.BackColor = Color.Red
    169. Case 16
    170. cmd_rel0.BackColor = Color.Red
    171. cmd_rel1.BackColor = Color.Red
    172. cmd_rel2.BackColor = Color.Red
    173. cmd_rel3.BackColor = Color.Red
    174. cmd_rel4.BackColor = Color.Green
    175. Case 17
    176. cmd_rel0.BackColor = Color.Green
    177. cmd_rel1.BackColor = Color.Red
    178. cmd_rel2.BackColor = Color.Red
    179. cmd_rel3.BackColor = Color.Red
    180. cmd_rel4.BackColor = Color.Green
    181. Case 18
    182. cmd_rel0.BackColor = Color.Red
    183. cmd_rel1.BackColor = Color.Green
    184. cmd_rel2.BackColor = Color.Red
    185. cmd_rel3.BackColor = Color.Red
    186. cmd_rel4.BackColor = Color.Green
    187. Case 19
    188. cmd_rel0.BackColor = Color.Green
    189. cmd_rel1.BackColor = Color.Green
    190. cmd_rel2.BackColor = Color.Red
    191. cmd_rel3.BackColor = Color.Red
    192. cmd_rel4.BackColor = Color.Green
    193. Case 20
    194. cmd_rel0.BackColor = Color.Red
    195. cmd_rel1.BackColor = Color.Red
    196. cmd_rel2.BackColor = Color.Green
    197. cmd_rel3.BackColor = Color.Red
    198. cmd_rel4.BackColor = Color.Green
    199. Case 21
    200. cmd_rel0.BackColor = Color.Green
    201. cmd_rel1.BackColor = Color.Red
    202. cmd_rel2.BackColor = Color.Green
    203. cmd_rel3.BackColor = Color.Red
    204. cmd_rel4.BackColor = Color.Green
    205. Case 22
    206. cmd_rel0.BackColor = Color.Red
    207. cmd_rel1.BackColor = Color.Green
    208. cmd_rel2.BackColor = Color.Green
    209. cmd_rel3.BackColor = Color.Red
    210. cmd_rel4.BackColor = Color.Green
    211. Case 23
    212. cmd_rel0.BackColor = Color.Green
    213. cmd_rel1.BackColor = Color.Green
    214. cmd_rel2.BackColor = Color.Green
    215. cmd_rel3.BackColor = Color.Red
    216. cmd_rel4.BackColor = Color.Green
    217. Case 24
    218. cmd_rel0.BackColor = Color.Red
    219. cmd_rel1.BackColor = Color.Red
    220. cmd_rel2.BackColor = Color.Red
    221. cmd_rel3.BackColor = Color.Green
    222. cmd_rel4.BackColor = Color.Green
    223. Case 25
    224. cmd_rel0.BackColor = Color.Green
    225. cmd_rel1.BackColor = Color.Red
    226. cmd_rel2.BackColor = Color.Red
    227. cmd_rel3.BackColor = Color.Green
    228. cmd_rel4.BackColor = Color.Green
    229. Case 26
    230. cmd_rel0.BackColor = Color.Red
    231. cmd_rel1.BackColor = Color.Green
    232. cmd_rel2.BackColor = Color.Red
    233. cmd_rel3.BackColor = Color.Green
    234. cmd_rel4.BackColor = Color.Green
    235. Case 27
    236. cmd_rel0.BackColor = Color.Green
    237. cmd_rel1.BackColor = Color.Green
    238. cmd_rel2.BackColor = Color.Red
    239. cmd_rel3.BackColor = Color.Green
    240. cmd_rel4.BackColor = Color.Green
    241. Case 28
    242. cmd_rel0.BackColor = Color.Red
    243. cmd_rel1.BackColor = Color.Red
    244. cmd_rel2.BackColor = Color.Green
    245. cmd_rel3.BackColor = Color.Green
    246. cmd_rel4.BackColor = Color.Green
    247. Case 29
    248. cmd_rel1.BackColor = Color.Red
    249. cmd_rel0.BackColor = Color.Green
    250. cmd_rel2.BackColor = Color.Green
    251. cmd_rel3.BackColor = Color.Green
    252. cmd_rel4.BackColor = Color.Green
    253. Case 30
    254. cmd_rel0.BackColor = Color.Red
    255. cmd_rel1.BackColor = Color.Green
    256. cmd_rel2.BackColor = Color.Green
    257. cmd_rel3.BackColor = Color.Green
    258. cmd_rel4.BackColor = Color.Green
    259. Case 31
    260. cmd_rel0.BackColor = Color.Green
    261. cmd_rel1.BackColor = Color.Green
    262. cmd_rel2.BackColor = Color.Green
    263. cmd_rel3.BackColor = Color.Green
    264. cmd_rel4.BackColor = Color.Green
    265. Case Else
    266. cmd_rel0.BackColor = Color.Red
    267. cmd_rel1.BackColor = Color.Red
    268. cmd_rel2.BackColor = Color.Red
    269. cmd_rel3.BackColor = Color.Red
    270. cmd_rel4.BackColor = Color.Red
    271. End Select
    272. End SubPrivate Sub TimerRead_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRead.Tick
    273. TB_ReadReg.Text = readReg(TB_ShortAdr.Text, TB_Reg.Text)
    274. End Sub
    275. End Class

    Ich verstehe ums verrecken nicht wieso da immer so viele Leerzeilen sind -.- Ich schreib hier alles direkt aneinander.

    Edit by hal2000:
    - Extrem ausladendes Layout korrigiert.

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

    Das hatten wir doch eben erst:

    VB.NET-Quellcode

    1. Dim Bit0 = 1
    2. Dim Bit1 = 2
    3. Dim Bit2 = 4
    4. Dim Value = 7
    5. If (Value And Bit0) = Bit0 Then
    6. ' Bit 0 gesetzt
    7. End If
    8. If (Value And Bit1) = Bit1 Then
    9. ' Bit 1 gesetzt
    10. End If
    11. If (Value And Bit2) = Bit2 Then
    12. ' Bit 2 gesetzt
    13. End If
    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!
    Demnach müsste ich doch auch wieder für jeden Bitwert einen Fall konstruieren oder steh ich auf dem Schlauch? Der errechnet ja nciht automatisch welche Bits gesetzt sind...

    Edit by hal2000:
    - Vollzitat entfernt. Bitte in Zukunft vermeiden.

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

    Du musst sie einzeln abfragen.
    Das lässt sich natürlich mit einer Schleife erledigen.
    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!

    VB.NET-Quellcode

    1. Dim Rel0 = 1Dim Rel1 = 2Dim Rel2 = 4Dim Rel3 = 8Dim Rel4 = 16Value = readreg ( 20 , 0 )
    2. Do
    3. If (Value And Rel0) = Rel0 thencb_rel0.checked = trueEnd If
    4. If (Value And Rel1) = Rel1 thencb_rel1.checked = trueEnd If
    5. If (Value And Rel2) = Rel2 thencb_rel2.checked = trueEnd If
    6. If (Value And Rel3) = Rel3 thencb_rel3.checked = trueEnd If
    7. If (Value And Rel4) = Rel4 thencb_rel4.checked = trueEnd IfLoop
    So z.B.?
    eher so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim bits() As Integer = {1, 2, 4, 8, 16, 32, 64, 128}
    3. Dim result(7) As Integer
    4. Dim value As Integer = 7
    5. For i As Integer = 0 To 7
    6. If (value And bits(i)) = bits(i) Then
    7. result(i) = 1
    8. End If
    9. Next
    10. End Sub
    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!
    Hi

    VB.NET-Quellcode

    1. Dim result(7) As Boolean
    2. Dim value As Integer = 7
    3. For i As Integer = 0 To 7
    4. If (value And (1 << i)) <> 0 Then
    5. result(i) = True
    6. End If
    7. Next


    Ansonsten wäre es schöner, einfach

    VB.NET-Quellcode

    1. cb_rel = (Value And Rel) = Rel

    zu schreiben.

    Gruß
    ~blaze~

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

    ~blaze~ schrieb:

    zu schreiben.
    Oder gleich so:

    VB.NET-Quellcode

    1. result(i) = (value And (1 << i)) <> 0
    2. ' bzw
    3. result(i) = (value And bits(i)) = bits(i)
    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!
    Ich würde hier einen Enum vorschlagen:

    VB.NET-Quellcode

    1. Public Enum Relais
    2. _1 = 1
    3. _2 = 2
    4. _3 = 4
    5. _4 = 8
    6. _5 = 16
    7. _6 = 32
    8. _7 = 64
    9. End Enum
    10. Sub Main()
    11. Dim r As New Relais
    12. r = Relais._2 Or Relais._5 Or Relais._7
    13. Dim sb As New System.Text.StringBuilder
    14. For Each enu As Relais In [Enum].GetValues(GetType(Relais))
    15. If r.HasFlag(enu) Then
    16. sb.AppendLine("Relais " & [Enum].GetName(GetType(Relais), enu) & " is activated!")
    17. End If
    18. Next
    19. MsgBox(sb.ToString)
    20. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

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

    @RodFromGermany: Das Array wär halt fast überflüssig, da es ja keinen anderen Zweck erfüllt, als das (1 << i).
    @BiedermannS: Dann schon als Flags ;). Insgesamt wär's vielleicht eh als Flags-Kombination besser, als Array. Die Flags kann man ja dann per Cast in das Enum casten. Nicht dass es hier was ausmacht, aber das [Enum].GetValues... ist relativ langsam.

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    Das Array wär halt fast überflüssig
    So isses. :D
    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!
    Hier nochmal, etwas an das eigentliche Problem angepasst.

    VB.NET-Quellcode

    1. Public Enum Relais
    2. _1 = 1
    3. _2 = 2
    4. _3 = 4
    5. _4 = 8
    6. _5 = 16
    7. _6 = 32
    8. _7 = 64
    9. _8 = 128
    10. End Enum
    11. Sub Main()
    12. Dim r As New Relais
    13. r = Relais._2 Or Relais._5 Or Relais._7
    14. SetColors(r, Relais._8)
    15. r = 16
    16. SetColors(r, Relais._8)
    17. End Sub
    18. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button) From {{Relais._1, button1}, {Relais._2, button2}, {Relais._3, button3},
    19. {Relais._4, button4}, {Relais._5, button5}, {Relais._6, button6},
    20. {Relais._7, button7}, {Relais._8, button8}}
    21. Public Sub SetColors(ByVal r As Relais, ByVal Max As Integer)
    22. Dim enu As Relais = Relais._1
    23. Dim counter As Integer = 1
    24. Do Until enu > Max
    25. If r.HasFlag(enu) Then
    26. RefTable(enu).BackColor = Color.Green
    27. Else
    28. RefTable(enu).BackColor = Color.Red
    29. End If
    30. enu = 2 ^ counter
    31. counter += 1
    32. Loop
    33. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

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

    Okey , also umso mehr Antworten ich hier bekomme , umso weniger versteh ich.

    Könnte mir ein "Pro" , bitte die einfachste Lösung aufzeigen , und erklären , so dass ich sie anhand eines Beispiels nachvollziehen und abgeändert in meinem Code benutzen kann? Das wäre voll Knorke. Eine kleine , für Neulinge passende Funktionsbeschreibung. Mehr will ich gar nicht =DD Vielen Dank.
    Nehmen wir an, deine "Anzeigen" sind Button, sind direkt auf der Form (nicht in nem Panel) und heißen "btn0" bis "btn4". Sei "wert" der "Dezmalwert" deines Registers

    for i = 0 to 4
    dim btn = me.controls("btn" & i.tostring)
    if (wert AND 1<<i)>0 then
    btn.backcolor = irgendwas ' an!
    else
    btn.backcolor = irgendwasanderes ' aus!
    endif

    VB.NET-Quellcode

    1. 'Das sind die Flags (Schalter) die deine Relais darstellen
    2. 'Links steht der Name, rechts der Wert (jeder wert ist der Wert des binären Stellenwerts von rechts nach links)
    3. Public Enum Relais
    4. _1 = 1 'Erstes Relais
    5. _2 = 2 'Zweites Relais usw...
    6. _3 = 4
    7. _4 = 8
    8. _5 = 16
    9. _6 = 32
    10. _7 = 64
    11. _8 = 128
    12. End Enum
    13. 'In diesem Dictionary wird eine Zuordnung von dem Wert im Enum Relais zum entsprechenden Button gespeichert
    14. 'also wenn das Dictionary mit Relais._1 aufgerufen wird, so greift man auf button1 zu, bei Relais._2 auf button2 usw...
    15. Private RefTable As New Dictionary(Of Relais, Windows.Forms.Button) From {{Relais._1, button1}, {Relais._2, button2}, {Relais._3, button3},
    16. {Relais._4, button4}, {Relais._5, button5}, {Relais._6, button6},
    17. {Relais._7, button7}, {Relais._8, button8}}
    18. Sub Main()
    19. 'In dieser Variable, wird der Dezimalwert gespeichert, der angibt welche Relais aktiviert sind.
    20. Dim r As New Relais
    21. 'Hier wird als Beispiel, der Wert für die Relais 2 5 und 7 in die variable gespeichert.
    22. 'durch das or werden die werte binär verknüpft
    23. r = Relais._2 Or Relais._5 Or Relais._7
    24. 'Diese Methode prüft, welche werte aktiv sind und setzt die Farben der Schalter dementsprechend
    25. 'r = der Dezimalwert der überprüft werden soll
    26. 'Relais._8 = der höchste Wert
    27. SetColors(r, Relais._8)
    28. 'man kann allerdings auch normale Ganzzahlen darin speichern
    29. r = 16
    30. SetColors(r, Relais._8)
    31. End Sub
    32. ''' <summary>
    33. ''' Diese Methode prüft, welche werte aktiv sind und setzt die Farben der Schalter dementsprechend
    34. ''' </summary>
    35. ''' <param name="r">der Dezimalwert der überprüft werden soll</param>
    36. ''' <param name="Max">der höchste Wert</param>
    37. ''' <remarks></remarks>
    38. Public Sub SetColors(ByVal r As Relais, ByVal Max As Integer)
    39. 'bei diesem Wert beginnt die Schleife
    40. Dim enu As Relais = Relais._1 ' = 1
    41. 'Diese Variable, dient der Zählung der durchläufe und somit der Ermittlung der Binärstelle
    42. Dim counter As Integer = 1
    43. 'Die Schleife wird so lange durchlaufen, bis der aktuelle binärwert größer als der maximale wert ist (in diesem Fall Relais._8 also 128)
    44. Do Until enu > Max
    45. 'Ist der aktuelle Binärwert im Dezimalwert gesetzt (also das Relais aktiviert)
    46. If r.HasFlag(enu) Then
    47. 'Färbe den entsprechenden Button Grün ein
    48. RefTable(enu).BackColor = Color.Green
    49. 'sonst
    50. Else
    51. 'Färbe den entsprechenden Button Rot ein
    52. RefTable(enu).BackColor = Color.Red
    53. End If
    54. 'berechne den neuen Stellenwert und setze den counter auf die neue Stelle
    55. enu = 2 ^ counter
    56. counter += 1
    57. 'der Stellenwert berechnet sich beim binären wie folgt
    58. 'erste Stelle = 2 hoch 0 (muss nicht beachtet werden, da dies der ausgangszustand ist)
    59. 'zweite Stelle = 2 hoch 1
    60. 'dritte Stelle = 2 hoch 2
    61. 'vierte Stelle = 2 hoch 3
    62. 'darum wird der counter immer um 1 erhöht und der stellenwert mit 2 ^ counter berechnet
    63. Loop
    64. End Sub


    Wenn du noch Fragen hast, sag bescheid :)
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Übrigens ist 2 ^ n (in VB) das Gleiche, wie 1 << n. Potenzrechnen auf Double-Basis ist übrigens extrem unperformant - im Gegensatz zur Basis 2 und mit ganzzahligem Exponenten. Ist halt so ein typischer VB-Mist und macht nichts anderes, als Math.Pow... ;) Übrigens macht deine Do-Loop-Schleife nichts anderes, als eine For-Schleife.
    Bin mir jetzt zwar nicht ganz sicher, aber HasFlag ist denk' ich eher für eine "dynamische" Evaluierung von Flags gedacht oder? HasFlag macht ja nichts anderes, als das zu überprüfen, was wir oben schon gezeigt hatten. Da Flags nicht zwangsweise von einem spezifischen Datentypen sein müssen, sind die Operatoren nicht für alle Typen definierbar (gibts auch keine statische Funktion für den Operator à la op_BitwiseAnd, da es eben ein nativer Datentyp ist). Wenn mans weiß, ist es vllt. besser, einfach die obige Variante davon zu verwenden. Da die einzelnen Flags nicht mehrere Bits abdecken genügt ja eine Überprüfung auf > 0.
    @Topic:
    Mach es einfach als Array und speichere da die einzelnen Controls rein und steuere sie anschließend per Register-Index an.

    VB.NET-Quellcode

    1. Dim registerControls() As CheckBox = new CheckBox(){cb_reg1, cb_reg2, cb_reg3, cb_reg4, cb_reg5} 'whatever
    2. Dim setRelais As Relais = FlagsMitGesetztenBits
    3. For i As Integer = 0 To 4
    4. registerControls(i).Checked = (setRelais And (1 << i)) > 0 'Visuelles Feedback, falls das Bit gesetzt ist*
    5. Next

    Hierbei ist einfach nur zu beachten, dass setRelais in den ersten 5 Bits speichert, ob das Relais aktiv ist. Also werden eben von den bspw. 32 Bits 5 immer zwischen 1 (aktiv) und 0 (inaktiv) umgeschaltet. (1 << i) ist quasi eine Maske, die das n-te Bit darstellt. And ist eine bitweise Und-Verknüpfung. Bei c = a And b enthält c nur jene Bits, die in beiden Werten gesetzt sind (z.B. 4 And 1 = 0, 5 And 3 = 1). Da man nur dann 0 als Ergebnis erhält, wenn für alle Indices i der Bits gilt, dass das i-te Bit in a oder das i-te Bit in b nicht gesetzt sind, heißt das, dass das i-te Relais aktiv ist, wenn (a And (1 << i)) > 0 gilt.

    Gruß
    ~blaze~

    BiedermannS schrieb:

    Wenn du noch Fragen hast, sag bescheid
    Was soll das :?:
    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!