Newbie - Button einen Wert zuweisen und dann in Hex summieren

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Newbie - Button einen Wert zuweisen und dann in Hex summieren

    Ich habe eine Form erstellt,die 15 Buttons und einen Restknopf, und zur Ausgabe des Hexwertes eine Textbox hat.
    in vb 2008 express
    Falls sich jemand fragt,was das werden soll:
    Ein Tool, mit dem man Adressdekodierungen von I/O Schaltungen leichter berechnen kann.
    Das ist sonst ein sehr mühsamen und fehlerträchtiger Vorgang.
    Denn ich habe trotz langer Suche nichts ähnliches im Netz gefunden.

    Ich muss mehrere Buttons auswählen können,die den Adressleitungen der CPU entsprechen.
    Trotz etlicher Versuche komme ich nicht weiter. ?(
    Denn mit Radiobuttons gehts nicht ...
    Bitte verzeiht meine Unerfahrenheit,aber jeder lernt mal ....

    mfg Don Karlo

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Don Karlo“ ()

    Denn mit Radiobuttons gehts nicht

    Ich glaube, Du benötigst CheckBoxen. Die sehen ähnlich wie RadioButtons aus, aber sie sind eckig. Sobald Du Deine 15(?) CheckBoxen auf die Form gezogen hast und ihnen sinnvolle Namen gegeben hast, gehst Du ins Codefenster.
    Dort schreibst Du das hier:

    VB.NET-Quellcode

    1. Private Sub CalculateValue() Handles DeineCheckBoxFürBit0.CheckedChanged, DeineCheckBoxFürBit1.CheckedChanged, ...

    (DeineCheckBoxFürBit0 ist natürlich nur symbolisch gemeint.)

    Dadurch wird, sobald Du den Haken aus einer CheckBox rausnimmst, oder ihn hineinsetzt der Code in der Methode ausgeführt.

    Dann erstellst Du Dir eine lokale Variable vom Typ Integer und gibst ihr den Wert 0.

    Wenn DeineCheckBoxFürBit0 gechecked ist, dann schreibst Du
    DeineVariable = DeineVariable Or 1

    Wenn DeineCheckBoxFürBit1 gechecked ist, dann
    DeineVariable = DeineVariable Or 2

    Wenn FürBit2, dann
    DeineVariable = DeineVariable Or 4

    Und so weiter. Immer das doppelte.

    Wie Du sicherlich weißt sind 1, 2, 4, ... Ganzzahlwerte, bei denen immer nur ein Bit gesetzt ist. Wenn Du die oderierst, dann kommt der Wert heraus, der er sein soll.

    Anschließend weist Du Deiner TextBox den Wert zu, indem Du ihn mit Convert.ToString(DeineVariable, 16) konvertierst. So wird die Zahl hexadezimal dargestellt.


    Edit: Ich denke, das wird für einen µC
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Willkommen im Forum. :thumbup:
    Zur Präzisierung des Beitrages von @Niko Ortner:
    Erstelle Dir ein Enum, das die Bits repräsentiert, da kannst Du Klartextnamen verwenden:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Flags()> _
    2. Private Enum AdressBits
    3. Bit00 = &H1
    4. Bit01 = &H2
    5. Bit02 = &H4
    6. Bit03 = &H8
    7. Bit04 = &H10
    8. Bit05 = &H20
    9. Bit06 = &H40
    10. Bit07 = &H80
    11. Bit08 = &H100
    12. Bit09 = &H200
    13. Bit10 = &H400
    14. Bit11 = &H800
    15. Bit12 = &H1000
    16. Bit13 = &H2000
    17. Bit14 = &H4000
    18. Bit15 = &H8000
    19. End Enum
    20. Private Sub xxx()
    21. Dim bbb As AdressBits = AdressBits.Bit01 Or AdressBits.Bit03
    22. '...
    23. End Sub
    Bilder
    • enum.jpg

      25,05 kB, 566×214, 130 mal angesehen
    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!

    Basic meckert - er will einen Bezeichner

    VB.NET-Quellcode

    1. Module1
    2. Sub Main()
    3. Dim Deine Variable As Integer
    4. Deine(Variable = 0)
    5. End Sub
    6. End Module
    7. Public Class Form2
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    9. End Sub
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. End Sub
    12. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    13. DeineVariable = DeineVariable Or 0
    14. End Sub
    15. Private
    16. Sub CheckBox1_CheckedChanged_1(ByVal sender As System.Object, ByVal e
    17. As System.EventArgs) Handles CheckBox1.CheckedChanged
    18. DeineVariable = DeineVariable Or 1
    19. End Sub
    20. Private
    21. Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As
    22. System.EventArgs) Handles CheckBox2.CheckedChanged
    23. DeineVariable = DeineVariable Or 2
    24. End Sub
    25. Private
    26. Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As
    27. System.EventArgs) Handles CheckBox3.CheckedChanged
    28. DeineVariable = DeineVariable Or 4
    29. End Sub
    30. Private
    31. Sub CheckBox4_CheckedChanged_1(ByVal sender As System.Object, ByVal e
    32. As System.EventArgs) Handles CheckBox4.CheckedChanged
    33. DeineVariable = DeineVariable Or 8
    34. End Sub
    35. Private
    36. Sub CheckBox5_CheckedChanged(ByVal sender As System.Object, ByVal e As
    37. System.EventArgs) Handles CheckBox5.CheckedChanged
    38. DeineVariable = DeineVariable Or 16
    39. End Sub
    40. Private
    41. Sub CheckBox6_CheckedChanged(ByVal sender As System.Object, ByVal e As
    42. System.EventArgs) Handles CheckBox6.CheckedChanged
    43. DeineVariable = DeineVariable Or 32
    44. End Sub
    45. Private
    46. Sub CheckBox7_CheckedChanged(ByVal sender As System.Object, ByVal e As
    47. System.EventArgs) Handles CheckBox7.CheckedChanged
    48. DeineVariable = DeineVariable Or 64
    49. End Sub
    50. Private
    51. Sub CheckBox8_CheckedChanged(ByVal sender As System.Object, ByVal e As
    52. System.EventArgs) Handles CheckBox8.CheckedChanged
    53. DeineVariable = DeineVariable Or 128
    54. End Sub
    55. Private
    56. Sub CheckBox9_CheckedChanged(ByVal sender As System.Object, ByVal e As
    57. System.EventArgs) Handles CheckBox9.CheckedChanged
    58. DeineVariable = DeineVariable Or 256
    59. End Sub
    60. Private
    61. Sub CheckBox10_CheckedChanged(ByVal sender As System.Object, ByVal e As
    62. System.EventArgs) Handles CheckBox10.CheckedChanged
    63. DeineVariable = DeineVariable Or 512
    64. End Sub
    65. Private
    66. Sub CheckBox11_CheckedChanged(ByVal sender As System.Object, ByVal e As
    67. System.EventArgs) Handles CheckBox11.CheckedChanged
    68. DeineVariable = DeineVariable Or 1024
    69. End Sub
    70. Private
    71. Sub CheckBox12_CheckedChanged(ByVal sender As System.Object, ByVal e As
    72. System.EventArgs) Handles CheckBox12.CheckedChanged
    73. DeineVariable = DeineVariable Or 2048
    74. End Sub
    75. Private
    76. Sub CheckBox13_CheckedChanged(ByVal sender As System.Object, ByVal e As
    77. System.EventArgs) Handles CheckBox13.CheckedChanged
    78. DeineVariable = DeineVariable Or 4096
    79. End Sub
    80. Private
    81. Sub CheckBox14_CheckedChanged(ByVal sender As System.Object, ByVal e As
    82. System.EventArgs) Handles CheckBox14.CheckedChanged
    83. DeineVariable = DeineVariable Or 8192
    84. End Sub
    85. Private
    86. Sub CheckBox15_CheckedChanged(ByVal sender As System.Object, ByVal e As
    87. System.EventArgs) Handles CheckBox15.CheckedChanged
    88. DeineVariable = DeineVariable Or 16384
    89. End Sub
    90. Private
    91. Sub CheckBox16_CheckedChanged(ByVal sender As System.Object, ByVal e As
    92. System.EventArgs) Handles CheckBox16.CheckedChanged
    93. DeineVariable = DeineVariable Or 32768
    94. End Sub
    95. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    96. Convert.ToString(DeineVariable, 16)
    97. End Sub
    98. End Class
    Bilder
    • vb fehler.PNG

      152,61 kB, 1.366×768, 140 mal angesehen

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

    Ein Tipp:
    Bitte VB Tags benutzen - was ist damit gemeint?
    Sonst bekommen wir hier noch Augenkrebs ^^

    Und nochwas:
    Wenn Du den VB-Tag eingefügt hast, dann kannst Du uns auch die Fehlerzeile und den Fehlertext erzählen. Sonst müssen wir raten, was nicht passt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Schmeiß das Module1 raus und schrfeibe die Zeilen so, dass keine Fehler mehr kommen.
    Dann reden wir weiter.
    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!
    @Don Karlo: Jetzt hast Du genau das gemacht, was ich nicht wollte.
    Füge eine Sub hinzu und weise der alle Events zu:

    VB.NET-Quellcode

    1. Private Sub Asdf() Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, .....


    Dann fügst Du die Deklaration (Dim ...), die Value = Value Or ..., und das Zuweisen des Textes in diese Sub ein.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    RodFromGermany schrieb:

    Erstelle Dir ein Enum, das die Bits repräsentiert, d

    Irgendwie ist das aber Fummelkram ...

    Nehmen wir an, die Checkboxen heißen ChkBitXX, wobei XX für 0 bis 15 geht. Nehmen wir an man packt sie in ein "Panel" namens BitPanel, dann bekommt man den Wert am einfachsten so:

    dim BitSumme = (From i in Enumerable.Range(0,16) where Directcast(Me.BitPanel.Controls("ChkBit" & t.tostring), Checkbox).Checked Select 1 << i).Sum
    Du bist wohl noch ein wenig erfahrungsbedürftig beim Umgang mit dem Studio.
    Erstell Dir ein neues Projekt und lass den Designer für Dich die Prozeduren erstellen.
    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!
    Ist

    Don Karlo schrieb:

    die Express Version 2008
    kein Studio?
    Was kannste da nich machen (außer solch Sachen wie Dienste und so)?
    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!
    Wollte das Servicepack vom Studio 2010 installieren, brach mit Fehlermeldung ab, dann war der Installer von Windoof beleidigt,musste mit clean Tool von Windows das ganze Framework Gedöhns rausschmeissen, das Ganze komplett neu installieren,wahrscheinlich wird sich das auf einen Neuaufsatz
    hinauslaufen.

    Don Karlo schrieb:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim Deine Variable As Integer
    3. Deine(Variable = 0)
    4. End Sub
    5. End Module

    "DeineVariable" darf nicht in einer Methode deklariert werden, sonst gilt sie nur dort. Wenn sie in der gesamten Klasse verfügbar sein soll, muss sie auch in der Klasse deklartiert werden.

    VB.NET-Quellcode

    1. Module Module1
    2. ' Modulebene: Jede hier deklarierte Variable gilt im gesamten Modul inkl. aller Methoden etc
    3. Private Modulebene As Integer = 1
    4. Sub Main()
    5. ' Methodenebene: Jede hier deklarierte Variable gilt nur genau INNERHALB dieser Methode
    6. Dim EineVariable As Integer = 2
    7. End Sub
    8. Sub Foo()
    9. ' Jetzt gibts nochmal "EineVariable", aber das macht nix, weil die andere ja hier nicht gilt
    10. Dim EineVariable As Integer = 3
    11. ' Man kann auch bereits vorhandene Variablen "überschreiben". Die gilt dann aber nur HIER und nicht
    12. ' außerhalb!
    13. Dim Modulebene As Integer = 4
    14. End Sub
    15. End Module


    btw, mal als Vorschlag:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Class ComboItem
    3. Public Wert As Integer
    4. Public Overrides Function ToString() As String
    5. Return "Bits: " & Wert.ToString
    6. End Function
    7. End Class
    8. Private Value As Long = 0
    9. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    10. For Each k In {8, 16, 24, 32, 64}
    11. Me.cbBits.Items.Add(New ComboItem With {.Wert = k})
    12. Next
    13. End Sub
    14. Private Sub cbBits_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cbBits.SelectedIndexChanged
    15. If cbBits.SelectedItem IsNot Nothing Then
    16. Dim cbi As ComboItem = DirectCast(cbBits.SelectedItem, ComboItem)
    17. Me.FlowLayoutPanel1.SuspendLayout()
    18. Me.FlowLayoutPanel1.Controls.Clear()
    19. For i = 0 To cbi.Wert - 1
    20. Dim cb As New CheckBox With {.Text = "Bit " & i.ToString, .Tag = 1L << i}
    21. Me.FlowLayoutPanel1.Controls.Add(cb)
    22. AddHandler cb.CheckedChanged, AddressOf CheckChange
    23. Next
    24. Me.FlowLayoutPanel1.ResumeLayout()
    25. Value = 0
    26. Label1.Text = String.Empty
    27. End If
    28. End Sub
    29. Private Sub CheckChange(sender As Object, e As EventArgs)
    30. Dim cb As CheckBox = DirectCast(sender, CheckBox)
    31. If cb.Checked Then
    32. Value = Value Or CLng(cb.Tag)
    33. Else
    34. Value = Value And Not CLng(cb.Tag)
    35. End If
    36. Me.Label1.Text = String.Format("Hex: {0}, Dez: {1}", Convert.ToString(Value, 16), Value)
    37. End Sub
    38. End Class

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

    Es ist ja nicht so kompliziert. Lies Dir nochmal genau durch, was ich in Post #3 und #9 geschrieben habe.
    Die Variable ist lokal. Das bedeutet, dass sie in die methode kommt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils