Position in String abfragen

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Hier einmal meine Version
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Dim TimeNow As TimeSpan = Date.Now.TimeOfDay
    3. Label1.Text = TimeNow.ToString("hh\:mm\:ss")
    4. Dim StundeZBin As String = Convert.ToString(TimeNow.Hours \ 10, 2).PadLeft(2, "0"c)
    5. Dim StundeEBin As String = Convert.ToString(TimeNow.Hours Mod 10, 2).PadLeft(4, "0"c)
    6. Dim MinuteZBin As String = Convert.ToString(TimeNow.Minutes \ 10, 2).PadLeft(3, "0"c)
    7. Dim MinuteEBin As String = Convert.ToString(TimeNow.Minutes Mod 10, 2).PadLeft(4, "0"c)
    8. Dim SekundeZBin As String = Convert.ToString(TimeNow.Seconds \ 10, 2).PadLeft(3, "0"c)
    9. Dim SekundeEBin As String = Convert.ToString(TimeNow.Seconds Mod 10, 2).PadLeft(4, "0"c)
    10. 'Errechnete Binärwärte in die Radiobuttons übertragen
    11. 'Stunden Zehner
    12. rb_H_Z1.Checked = StundeZBin(1) = "1"
    13. rb_H_Z2.Checked = StundeZBin(0) = "1"
    14. 'Stunden Einer
    15. rb_H_E1.Checked = StundeEBin(3) = "1"
    16. rb_H_E2.Checked = StundeEBin(2) = "1"
    17. rb_H_E8.Checked = StundeEBin(1) = "1"
    18. rb_H_E8.Checked = StundeEBin(0) = "1"
    19. 'Minuten Zehner
    20. rb_M_Z1.Checked = MinuteZBin(2) = "1"
    21. rb_M_Z2.Checked = MinuteZBin(1) = "1"
    22. rb_M_Z4.Checked = MinuteZBin(0) = "1"
    23. 'Minuten Einer
    24. rb_M_E1.Checked = MinuteEBin(3) = "1"
    25. rb_M_E2.Checked = MinuteEBin(2) = "1"
    26. rb_M_E4.Checked = MinuteEBin(1) = "1"
    27. rb_M_E8.Checked = MinuteEBin(0) = "1"
    28. 'Sekunden Zehner
    29. rb_S_Z1.Checked = SekundeZBin(2) = "1"
    30. rb_S_Z2.Checked = SekundeZBin(1) = "1"
    31. rb_S_Z4.Checked = SekundeZBin(0) = "1"
    32. 'Sekunden Einer
    33. rb_S_E1.Checked = SekundeEBin(3) = "1"
    34. rb_S_E2.Checked = SekundeEBin(2) = "1"
    35. rb_S_E4.Checked = SekundeEBin(1) = "1"
    36. rb_S_E8.Checked = SekundeEBin(0) = "1"
    37. End Sub
    Ich hoffe ich habe alle gemachten Verbesserungsvorschläge gut umgesetzt und kann künftigen Suchenden eine Hilfe sein (und mich auf diesem Wege revanchieren)!
    Hier der neue Quellcode, mit nützlicheren Kommentaren und ich habe einige lose Zöpfe entfernt. Außerdem hat meine Maske eine Checkbox bekommen, mit der ich die Radiobuttons beschriften kann, damit das Ablesen der Uhrzeit etwas vereinfacht werden soll.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public StundeZMaxBin() As String = {"0", "0"}
    3. Public StundeZBin As String
    4. Public StundeEMaxBin() As String = {"0", "0", "0", "0"}
    5. Public StundeEBin As String
    6. Public MinuteZMaxBin() As String = {"0", "0", "0"}
    7. Public MinuteZBin As String
    8. Public MinuteEMaxBin() As String = {"0", "0", "0", "0"}
    9. Public MinuteEBin As String
    10. Public SekundeZMaxBin() As String = {"0", "0", "0"}
    11. Public SekundeZBin As String
    12. Public SekundeEMaxBin() As String = {"0", "0", "0", "0"}
    13. Public SekundeEBin As String
    14. Public BinString As String
    15. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. Presets()
    17. Timer1.Interval = 100
    18. Timer1.Start()
    19. End Sub
    20. Private Sub Presets()
    21. 'Alle Radiobuttons vorbereiten
    22. Dim RadioButtons = {rb_H_Z1, rb_H_Z2, rb_H_E1, rb_H_E2, rb_H_E4, rb_H_E8, rb_M_Z1, rb_M_Z2, rb_M_Z4, rb_M_E1, rb_M_E2, rb_M_E4, rb_M_E8, rb_S_Z1, rb_S_Z2, rb_S_Z4, rb_S_E1, rb_S_E2, rb_S_E4, rb_S_E8}
    23. RadioButtons.ToList.ForEach(Sub(x)
    24. x.Checked = False
    25. x.AutoCheck = False
    26. x.Text = ""
    27. End Sub)
    28. End Sub
    29. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    30. 'Hilfsanzeigen der Radiobuttons ein/ausschalten
    31. If CheckBox1.Checked Then
    32. RadioButtonTextAn()
    33. Else
    34. RadioButtonTextAus()
    35. End If
    36. End Sub
    37. Sub RadioButtonTextAus()
    38. 'Hilfstexte an den Radiobuttons zur vereinfachten Lesbarkeit AUS
    39. Dim RadioButtons = {rb_H_Z1, rb_H_Z2, rb_H_E1, rb_H_E2, rb_H_E4, rb_H_E8, rb_M_Z1, rb_M_Z2, rb_M_Z4, rb_M_E1, rb_M_E2, rb_M_E4, rb_M_E8, rb_S_Z1, rb_S_Z2, rb_S_Z4, rb_S_E1, rb_S_E2, rb_S_E4, rb_S_E8}
    40. RadioButtons.ToList.ForEach(Sub(x)
    41. x.Text = ""
    42. End Sub)
    43. End Sub
    44. Sub RadioButtonTextAn()
    45. 'Hilfstexte an den Radiobuttons zur vereinfachten Lesbarkeit EIN
    46. Dim RadioButtons1 = {rb_H_Z1, rb_H_E1, rb_M_Z1, rb_M_E1, rb_S_Z1, rb_S_E1} '1er
    47. Dim RadioButtons2 = {rb_H_Z2, rb_H_E2, rb_M_Z2, rb_M_E2, rb_S_Z2, rb_S_E2} '2er
    48. Dim RadioButtons4 = {rb_H_E4, rb_M_Z4, rb_M_E4, rb_S_Z4, rb_S_E4} '4er
    49. Dim RadioButtons8 = {rb_H_E8, rb_M_E8, rb_S_E8} '8er
    50. RadioButtons1.ToList.ForEach(Sub(x)
    51. x.Text = "1"
    52. End Sub)
    53. RadioButtons2.ToList.ForEach(Sub(x)
    54. x.Text = "2"
    55. End Sub)
    56. RadioButtons4.ToList.ForEach(Sub(x)
    57. x.Text = "4"
    58. End Sub)
    59. RadioButtons8.ToList.ForEach(Sub(x)
    60. x.Text = "8"
    61. End Sub)
    62. End Sub
    63. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    64. Dim Time As String = CStr(DateAndTime.TimeOfDay)
    65. 'Beispiel Zeit: 14:52:44
    66. 'Time(0+1) --> Stunde Z/E
    67. 'Time(3+4) --> Minute Z/E
    68. 'Time(6+7) --> Sekunde Z/E
    69. Me.Text = CStr(DateAndTime.TimeOfDay)
    70. 'DezInBinUmrechner(H/M/S, Nötige Binär-Länge)
    71. DezInBinUmrechner(Time(0), 2)
    72. StundeZBin = BinString.ToString
    73. DezInBinUmrechner(Time(1), 4)
    74. StundeEBin = BinString.ToString
    75. DezInBinUmrechner(Time(3), 3)
    76. MinuteZBin = BinString.ToString
    77. DezInBinUmrechner(Time(4), 4)
    78. MinuteEBin = BinString.ToString
    79. DezInBinUmrechner(Time(6), 3)
    80. SekundeZBin = BinString.ToString
    81. DezInBinUmrechner(Time(7), 4)
    82. SekundeEBin = BinString.ToString
    83. 'Errechnete Binärwärte in die Radiobuttons übertragen
    84. RadioButtonsSetzen()
    85. End Sub
    86. Private Sub RadioButtonsSetzen()
    87. 'Stunden Zehner
    88. rb_H_Z1.Checked = Not (StundeZBin(1) = "" Or StundeZBin(1) = "0")
    89. rb_H_Z2.Checked = Not (StundeZBin(0) = "" Or StundeZBin(0) = "0")
    90. 'Stunden Einer
    91. rb_H_E1.Checked = Not (StundeEBin(3) = "" Or StundeEBin(3) = "0")
    92. rb_H_E2.Checked = Not (StundeEBin(2) = "" Or StundeEBin(2) = "0")
    93. rb_H_E4.Checked = Not (StundeEBin(1) = "" Or StundeEBin(1) = "0")
    94. rb_H_E8.Checked = Not (StundeEBin(0) = "" Or StundeEBin(0) = "0")
    95. 'Minuten Zehner
    96. rb_M_Z1.Checked = Not (MinuteZBin(2) = "" Or MinuteZBin(2) = "0")
    97. rb_M_Z2.Checked = Not (MinuteZBin(1) = "" Or MinuteZBin(1) = "0")
    98. rb_M_Z4.Checked = Not (MinuteZBin(0) = "" Or MinuteZBin(0) = "0")
    99. 'Minuten Einer
    100. rb_M_E1.Checked = Not (MinuteEBin(3) = "" Or MinuteEBin(3) = "0")
    101. rb_M_E2.Checked = Not (MinuteEBin(2) = "" Or MinuteEBin(2) = "0")
    102. rb_M_E4.Checked = Not (MinuteEBin(1) = "" Or MinuteEBin(1) = "0")
    103. rb_M_E8.Checked = Not (MinuteEBin(0) = "" Or MinuteEBin(0) = "0")
    104. 'Sekunden Zehner
    105. rb_S_Z1.Checked = Not (SekundeZBin(2) = "" Or SekundeZBin(2) = "0")
    106. rb_S_Z2.Checked = Not (SekundeZBin(1) = "" Or SekundeZBin(1) = "0")
    107. rb_S_Z4.Checked = Not (SekundeZBin(0) = "" Or SekundeZBin(0) = "0")
    108. 'Sekunden Einer
    109. rb_S_E1.Checked = Not (SekundeEBin(3) = "" Or SekundeEBin(3) = "0")
    110. rb_S_E2.Checked = Not (SekundeEBin(2) = "" Or SekundeEBin(2) = "0")
    111. rb_S_E4.Checked = Not (SekundeEBin(1) = "" Or SekundeEBin(1) = "0")
    112. rb_S_E8.Checked = Not (SekundeEBin(0) = "" Or SekundeEBin(0) = "0")
    113. End Sub
    114. Private Sub DezInBinUmrechner(Wert As String, Stellen As Integer)
    115. If Wert Is Nothing Then Wert = "0"
    116. If Stellen < 0 Then Stellen = 2
    117. Dim IntWert As Integer = CInt(Val(Wert))
    118. Dim i As Integer = IntWert
    119. Dim Rest As Integer = 0
    120. BinString = ""
    121. If IntWert > 0 Then
    122. While i > 0
    123. 'Dezimal --> Binär umrechnen
    124. If Math.DivRem(i, 2).Remainder > 0 Then
    125. 'Division hat Rest --> 1
    126. BinString = String.Concat("1".ToString, BinString)
    127. Else
    128. 'Division geht auf --> 0
    129. BinString = String.Concat("0".ToString, BinString)
    130. End If
    131. i = Math.DivRem(i, 2).Quotient
    132. End While
    133. Else
    134. BinString = String.Concat("0".ToString, BinString)
    135. End If
    136. 'Fehlende Stellen auffüllen
    137. Rest = Stellen - BinString.Length
    138. 'Auf nötige Stellenanzahl auffüllen
    139. While Rest > 0
    140. BinString = String.Concat("0".ToString, BinString)
    141. Rest = Stellen - BinString.Length
    142. End While
    143. End Sub
    144. End Class


    Wie immer: Vielen Dank für die Hilfen und fühlt euch frei, diesen Code zu verwenden. Verbesserungsvorschläge sind auch stets willkommen.
    Ich habe eine Menge gelernt, was zukünftig mit Sicherheit Anwendung finden wird :thumbsup:
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    noch zweii:

    VB.NET-Quellcode

    1. RadioButtons1.ToList.ForEach(Sub(x)x.Text = "1")

    und: Verwende OrElse statt Or.
    OrElse wertet den zweiten Teilausdruck garnicht erst aus, wenn der erste schon unzutreffend war.
    das ist eine Frage der Logik: ich brauche auf dem Mond nicht an den Regenschirm denken, weil es dort garnet regnen kann.
    Also angewöhnen: Für logische Verknüpfungen OrElse bzw AndAlso verwenden.
    Or und And verhalten sich minimal "unlogisch", weil sie den zweiten Ausdruck auswerten, egal was die erste Bedingung ergab.
    Or und And sollte man nur noch für bitweise Verknüpfungen verwenden - eine andere Baustelle.

    ErfinderDesRades schrieb:

    OrElse wertet den zweiten Teilausdruck garnicht erst aus, wenn der erste schon unzutreffend war.
    Eh, nee. Da biste bei AndAlso. Der zweite wird nicht ausgewertet, wenn der erste bereits zutrifft.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    ErfinderDesRades schrieb:

    OrElse wertet den zweiten Teilausdruck garnicht erst aus, wenn der erste schon unzutreffend war.
    Eh, nee. Da biste bei AndAlso. Der zweite wird nicht ausgewertet, wenn der erste bereits zutrifft.

    neuer Versuch:
    • AndAlso wertet den zweiten Teilausdruck garnicht erst aus, wenn der erste schon unzutreffend war.
    • OrElse wertet den zweiten Teilausdruck garnicht erst aus, wenn der erste bereits zutreffend war.