Variierende Tasteneingabenreihenfolge speichern und abrufen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Variierende Tasteneingabenreihenfolge speichern und abrufen

    Ich habe mit den Tasten A bis F die Möglichkeit gefunden 6 verschiedene Farben auf meinem Bildschirm einzuschalten.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim paprika As New BitArray(6, False)
    3. Dim rect As New Rectangle(3, 3, 278, 255)
    4. Sub probotector(e As System.Windows.Forms.KeyEventArgs)
    5. Select e.KeyCode
    6. Case Keys.A
    7. paprika(0) = True
    8. Case Keys.B
    9. paprika(1) = True
    10. Case Keys.C
    11. paprika(2) = True
    12. Case Keys.D
    13. paprika(3) = True
    14. Case Keys.E
    15. paprika(4) = True
    16. Case Keys.F
    17. paprika(5) = True
    18. End Select
    19. End Sub
    20. Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    21. probotector(e)
    22. If Not e.KeyCode = Keys.A Then
    23. paprika(0) = False
    24. End If
    25. If Not e.KeyCode = Keys.B Then
    26. paprika(1) = False
    27. End If
    28. If Not e.KeyCode = Keys.C Then
    29. paprika(2) = False
    30. End If
    31. If Not e.KeyCode = Keys.D Then
    32. paprika(3) = False
    33. End If
    34. If Not e.KeyCode = Keys.E Then
    35. paprika(4) = False
    36. End If
    37. If Not e.KeyCode = Keys.F Then
    38. paprika(5) = False
    39. End If
    40. Me.Invalidate()
    41. End Sub
    42. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    43. DoubleBuffered = True
    44. CenterToScreen()
    45. End Sub
    46. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    47. Me.BackColor = Color.FromArgb(255, 255, 255)
    48. Dim newImage As Image = Image.FromFile("C:\Unbenannt.bmp")
    49. Dim ImgRect As New Rectangle(72, 59, 141, 142)
    50. e.Graphics.DrawImage(newImage, ImgRect)
    51. newImage.Dispose()
    52. e.Graphics.DrawRectangle(New Pen(Color.Black), 1, 1, 281, 258)
    53. e.Graphics.DrawRectangle(New Pen(Color.FromArgb(100, 0, 0, 0)), 4, 4, 275, 252)
    54. If paprika(0) = True Then
    55. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 0, 255, 255)), rect)
    56. End If
    57. If paprika(1) = True Then
    58. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 255, 255, 0)), rect)
    59. End If
    60. If paprika(2) = True Then
    61. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 255, 0, 255)), rect)
    62. End If
    63. If paprika(3) = True Then
    64. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 0, 0, 255)), rect)
    65. End If
    66. If paprika(4) = True Then
    67. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 0, 255, 0)), rect)
    68. End If
    69. If paprika(5) = True Then
    70. e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(100, 255, 0, 0)), rect)
    71. End If
    72. End Sub
    73. End Class


    Meine Fähigkeiten mich weiter zu bilden sind nicht ausreichend eine beliebige Farbe zu speichern. Der nächste Schritt währe die gespeicherte Farbe auch wieder abrufen zu können.

    Das Bild im Dateipfad habe ich zu einer übersichtlichen Differenzierung, als Dateianhang im Forum hochgeladen.

    *Unnötig langen Threadtitel abgeändert* ~NoFear23m
    Dateien
    • Unbenannt.bmp

      (60,26 kB, 179 mal heruntergeladen, zuletzt: )

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

    Mit dem suboptimalen bestehenden Code würde das hier zwar technisch gesehen klappen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'vor die Sub probotector:
    2. Private RecordedKeyEventArgs As New List(Of KeyEventArgs)
    3. Private RecordFurtherKeys As Boolean = True
    4. 'am Ende der Sub probotector
    5. If RecordFurtherKeys Then RecordedKeyEventArgs.Add(e)
    6. 'diese Zeile in den Form_Load-EvehtHandler
    7. Me.KeyPreview = True
    8. 'dann noch einen Button auf's Form ziehen und schreiben
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Dim RecordString = RecordedKeyEventArgs.ToArray
    11. RecordFurtherKeys = False
    12. For Each Character In RecordString
    13. Form1_KeyUp(Me, Character)
    14. Next
    15. End Sub


    Aber dann würdest Du effektiv immer nur die letzte Farbe sehen, weil der Wechsel zu schnell wäre (was man mit einem Timer beheben könnte, in dem die KeyUp-Events "aufgerufen" werden), allerdings ist der gesamte Code nicht für eine sinnvolle Aufzeichnung im Gesamten ausgelegt. Was soll das denn werden, wenn's fertig ist? Vielleicht können wir mit der Info eine bessere Grundsatzlösung liefern.


    btw: bitte CodeTags verwenden
    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.
    Um die Möglichkeiten den Arbeitsspeicher in Verwendung mit Visual Basic kennen zu lernen, bin ich auf der suche die Tastenreihenfolge nicht wie einen Film zu speichern bei dem ich nur die letzte Sequenz abrufen kann, sondern weiterhin nur eine

    VB.NET-Quellcode

    1. e.Keycode
    Taste zum speichern zu verwenden. Denn ich möchte die Farbe wählen können um möglichst viele Unterscheidungsmöglichkeiten zu haben eine Speicheradresse erkennen und erinnern zu können. Mein Anfang dies zu erreichen ist nicht professionel.
    Zum abrufen schwebt mir vor eine andere Taste zu drücken. Einen Timer muss ich vollkommen ausschließen. Ich muss jeden Schritt einzeln eingeben und verstehen lernen. Trotzdem danke.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    @Stefan Mihael Rihar Arbeite nicht mit Farben, sondern mit dem Index:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rect As New Rectangle(3, 3, 278, 255)
    3. Dim colors As List(Of Brush)
    4. Dim newImage As Image
    5. Dim index As Integer = -1
    6. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    7. Me.BackColor = Color.FromArgb(255, 255, 255)
    8. Me.DoubleBuffered = True
    9. Me.CenterToScreen()
    10. Me.newImage = Image.FromFile("C:\Temp\Unbenannt.bmp")
    11. Me.colors = New List(Of Brush)
    12. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 0, 255, 255)))
    13. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 255, 255, 0)))
    14. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 255, 0, 255)))
    15. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 0, 0, 255)))
    16. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 0, 255, 0)))
    17. Me.colors.Add(New SolidBrush(Color.FromArgb(100, 255, 0, 0)))
    18. End Sub
    19. Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    20. Select Case e.KeyCode
    21. Case Keys.A
    22. index = 0
    23. Case Keys.B
    24. index = 1
    25. Case Keys.C
    26. index = 2
    27. Case Keys.D
    28. index = 3
    29. Case Keys.E
    30. index = 4
    31. Case Keys.F
    32. index = 5
    33. End Select
    34. Me.Invalidate()
    35. End Sub
    36. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    37. Dim ImgRect As New Rectangle(72, 59, 141, 142)
    38. e.Graphics.DrawImage(newImage, ImgRect)
    39. e.Graphics.DrawRectangle(New Pen(Color.Black), 1, 1, 281, 258)
    40. e.Graphics.DrawRectangle(New Pen(Color.FromArgb(100, 0, 0, 0)), 4, 4, 275, 252)
    41. If (index >= 0) Then
    42. e.Graphics.FillRectangle(colors(index), rect)
    43. End If
    44. End Sub
    45. End Class
    Du kannst alles vorausberechnen und entsprechend reagieren.
    Den Index kannst Du z.B. den Settings hinzufügen über
    Projekt -> Eigenschaften -> Einstellungen

    und dann

    =======

    VB.NET-Quellcode

    1. My.Settings.MyIndex = index
    2. 'bzw
    3. index = My.Settings.MyIndex
    und in den Projekteigenschaften dies

    und feddich.
    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!
    @RodFromGermany ich habe den Code kopiert und die Settingswerte dem ersten Bild entsprechend geändert. Das zweite Bild aus drei zeigt mir leider keinen Unterschied, also habe ich keine weitere Einstellung unternommen. Die Checkbox auf dem dritten Bild ist in meiner Umgebung automatisch eingeschaltet gewesen soweit änderte ich da nichts. Ich konnte

    VB.NET-Quellcode

    1. My.Settings.MyIndex = index
    nur im

    Visual Basic-Quellcode

    1. Form1_Load

    Visual Basic-Quellcode

    1. Sub
    einfügen um die Tastenfunktion eine Farbe anzuzeigen möglich zu machen.
    Als ich das Programm gestartet habe, eine Farbe gewählt habe und das Programm beendet habe, startete ich das Programm wieder, doch es war keine Farbe gespeichert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    @Stefan Mihael Rihar Immerhin hast Du schon mal den Text im Post formatiert. ;)
    =====
    Bei mir funktioniert das ganze wunderbar, allerdings habe ich die Zeile

    VB.NET-Quellcode

    1. My.Settings.MyIndex = index
    nicht im Form_Load-Event eingetragen.
    Überleg mal, was jede einzelne diese beiden Zeilen bewirken soll und wo es sinnvoll ist, sie einzutragen, und nicht unbedingt in derselben Prozedur. 8o

    VB.NET-Quellcode

    1. My.Settings.MyIndex = index
    2. 'bzw
    3. index = My.Settings.MyIndex

    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!
    @RodFromGermany Schade das ich diese Rätselrunde nicht mit einem Erfolg beenden kann. Was ich auf meine Art verstehen konnte war, die Variable index ist -1, weil die Variable colors eine
    Liste als Datentyp trägt und mit Null anfängt zu zählen. Ich kann mir leider keinen Reim drauf machen
    wo ich

    VB.NET-Quellcode

    1. My.Settings.MyIndex = index 'bzw
    2. index = My.Settings.MyIndex

    einsetzen soll um einen erkennbaren Unterschied zu erreichen und eine Farbwahl zu speichern.
    Es ist in Ordnung, dass ich gefordert werde. Dadurch lerne ich auch meine Ziele genauer
    auszuarbeiten und die Sprache Vb.Net auch für andere schreiben zu lernen.
    Auf alle Fälle weiß ich nun ich würde gerne die Farbwahl zur Laufzeit speichern und wieder abrufen können.
    @Stefan Mihael Rihar Unterlass mal das Formatieren des Post-Textes, das liest sich nicht sonderlich gut.
    ====
    Offensichtlich muss die eine Zeile bei Programmstart aktiv sein, die andere bei Programmbeendigung.
    Weiteren Handlungsbedarf hast Du nicht (während de Laufzeit zu speichern).
    Klick mal auf die Form, geh in deren Properties und sieh Dir die Events an:

    Vielleicht fällt Dir ein Event auf, das beim Beenden der Form gesendet wird. ;)
    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!
    @RodFromGermany Also was ich mit einer Recherche erreichen konnte war, dass wenn ich

    VB.NET-Quellcode

    1. Sub Form1_Load
    mit der Variable

    VB.NET-Quellcode

    1. index
    die den Inhalt

    VB.NET-Quellcode

    1. = My.Settings.MyIndex
    trägt, in der

    VB.NET-Quellcode

    1. Sub Form1_KeyUp

    VB.NET-Quellcode

    1. Case Keys.Space
    2. My.Settings.Save()
    und in der

    VB.NET-Quellcode

    1. Sub Form1_Paint

    Visual Basic-Quellcode

    1. If (index >= 0) Then
    2. My.Settings.MyIndex = index
    3. 'MsgBox(My.Settings.MyIndex)
    4. e.Graphics.FillRectangle(colors(index), rect)
    5. End If
    eintrage, wird nach einem schließen und wieder öffnen der Form die mit der Leertaste bestätigte und gewählte Farbe gespeichert und nach dem wieder Einschalten des Programms an erster Stelle wieder angezeigt. Ist ein Anfang.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    Gelöschter Benutzer schrieb:

    Die Checkbox auf dem dritten Bild ist in meiner Umgebung automatisch eingeschaltet gewesen soweit änderte ich da nichts.

    Gelöschter Benutzer schrieb:

    VB.NET-Quellcode

    1. My.Settings.Save()

    RodFromGermany schrieb:

    Weiteren Handlungsbedarf hast Du nicht
    Überleg Dir, was bei Dir in welcher Reihenfolge passiert und wo der andere Befehl von mir hinkommen könnte.
    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!
    Schon oft genug ist der Fall eingetreten, dass ich den Wald vor lauter Bäumen nicht mehr sehen konnte.
    Auch dieses mal.
    Um mein Ziel zu erreichen habe ich den Quellcode von @RodFromGermany der meinem gepostetem Ursprungscode folgte ergänzt mit,

    VB.NET-Quellcode

    1. Dim zwischenablage As Integer = -1

    VB.NET-Quellcode

    1. Private Sub Form1_KeyUp
    2. Case Keys.X
    3. zwischenablage = index 'zum speichern eines der oben geführten Indexwerte
    4. Case Keys.Space
    5. index = zwischenablage 'zum abrufen des gespeicherten Wertes

    und

    VB.NET-Quellcode

    1. Sub Form1_Paint
    2. If (index >= 0) Then
    3. MsgBox("gespeicherter index" & vbCrLf & zwischenablage)

    .
    Nun kann ich speichern und abrufen wann ich will.
    Eine neue Frage bleibt offen. Wenn ich

    VB.NET-Quellcode

    1. Sub Form1_Load
    2. MsgBox(My.Settings.MyIndex)

    einfüge, dann ist die Ausgabe 3, obwohl ich im Settings Menü -1 eingetragen habe.
    Das Ergebniss erhalte ich auch wenn ich 0 eingetragen habe.
    Auf alle Fälle vielen Dank für die Anregungen und die überarbeitete Version meines ursprünglich Codes.
    Keep going, learn if possible.
    @Stefan Mihael Rihar Die Settings werden vom Framework gehandelt.
    Der Initialwert wird nur beim ersten Mal eingetragen.
    Ab dem zweiten Programmlauf wird der Settings-Wert durch den von Dir im letzten Lauf eingetragenen Wert ersetzt.
    Speichern musst Du die Settings nicht, denn Du selbst hast ja bereits festgestellt, dass die Settings vom Framework bei Beendigung des Programms gespeichert werden.
    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!
    @RodFromGermany Meine Erfahrung ist das wenn ich das Debbuging beende der Wert in Settings nicht automatisch gespeichert wird.
    Wenn ich zum Beispiel,

    VB.NET-Quellcode

    1. Dim index As Integer = -1
    2. Sub Form1_Load
    3. MsgBox(My.Settings.MyIndex)
    4. My.Settings.MyIndex = index
    5. MsgBox(My.Settings.MyIndex)

    anwende und das Debugging beende ist die erste Ausgabe 3 und die zweite -1.
    Das selbe Ergebnis erhalte ich auch nach einem zweiten Durchlauf. Meinen Settingswert für MyIndex habe ich mit -1 eingetragen.

    Gelöschter Benutzer schrieb:

    wenn ich das Debbuging beende
    Brichst Du den Programmlauf im Studio "mit Gewalt" ab?
    Klar, da wird nix gespeichert.
    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!