Taste als Return

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von C.O.D.E.

    Taste als Return

    Hallo ihr lieben,

    für ein aktuelles Projekt brauche ich eine Tastatur in Visual Basic.

    Diese habe ich mir jetzt auch schon mühselig zusammengebaut und jeden einzelnen Button mit btn_xxx benannt.

    Die Tastatur ist auf einer eigenen Windows Form die ich frmKeyboard genannt habe.

    Nun möchte ich, wenn ich diese Form aufrufe und man eine Taste Drückt, das diese als Return auf meine Hauptform (frmMain) als Rückgabewert gegeben wird. Ich möchte nicht millionen von If-Abfragen nehmen, hat da jemand eine bessere Idee?

    Danke
    Bilder
    • Unbenannt.png

      149,08 kB, 1.920×1.048, 89 mal angesehen
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Darf man fragen wofür genau du das brauchst?
    Es gibt nämlich auch die Windows eigene Bildschirmtastatur die du aufrufen könntest dann brauchst du das nicht selber basteln.

    Es sei denn das hat nun einen sehr speziellen Grund das du das selber bastelst.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    Darf man fragen wofür genau du das brauchst?


    Ich möchte einen Hotkey festlegen. Man Drückt auf den Hotkey Button, die Tastatur ploppt auf und der Benutzer Drückt einen Button. Diesen benötige ich um bestimme Funktionen auszuführen. :)
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Mach einfach ein Event in die Klasse der Tastatur rein, dieses feuerst du bei jedem Button klick, dieses Event abbonierst du in der Klasse, in der du die Instanz deiner Tastaturform führst.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents kbd As New Form2
    3. Private Sub kbd_MyButtonClickEvent(sender As Object, e As MyButtonClickEventArgs) Handles kbd.MyButtonClickEvent
    4. MessageBox.Show(e.KeyChar)
    5. End Sub
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. kbd.Show()
    8. End Sub
    9. End Class

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Event MyButtonClickEvent(sender As Object, e As MyButtonClickEventArgs)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. RaiseEvent MyButtonClickEvent(Me, New MyButtonClickEventArgs With {.KeyChar = "1", .SomeOtherThings = "Irgendwas anderes"})
    5. End Sub
    6. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    7. RaiseEvent MyButtonClickEvent(Me, New MyButtonClickEventArgs With {.KeyChar = "A", .SomeOtherThings = "Noch was anderes"})
    8. End Sub
    9. End Class
    10. Public Class MyButtonClickEventArgs
    11. Public KeyChar As Char
    12. Public SomeOtherThings As Object
    13. End Class

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Die Idee ist gut aber irgendwie klappt das bei mir nicht, was mache ich Falsch?

    In meiner Keyboard-Form ist dies:

    VB.NET-Quellcode

    1. ​Public Class frmKeyboard
    2. Public Event MyButtonClickEvent(sender As Object, e As MyButtonClickEventArgs)
    3. Private Sub frmKeyboard_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. End Sub
    5. Private Sub btn_A_Click(sender As Object, e As EventArgs) Handles btn_A.Click
    6. RaiseEvent MyButtonClickEvent(Me, New MyButtonClickEventArgs With {.KeyChar = "A", .SomeOtherThings = "A"})
    7. End Sub
    8. End Class
    9. Public Class MyButtonClickEventArgs
    10. Public KeyChar As Char
    11. Public SomeOtherThings As Object
    12. End Class


    Und in meiner Main-Form dies:

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Private WithEvents kbd As New frmKeyboard 'frmKeyboard Event Abonnieren
    3. Private Sub kbd_MyButtonClickEvent(sender As Object, e As MyButtonClickEventArgs) Handles kbd.MyButtonClickEvent
    4. MessageBox.Show(e.KeyChar)
    5. End Sub
    6. End Class


    Wenn ich jetzt auf dem Keyboard die Taste a Drücke passiert nichts :o
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Also bei mir läuft der Code problemlos - wenn man davon absieht, dass er Option Strict Off ist, da die KeyChar-Zuweisung in Post#5, Z#9 nur Chars akzeptiert.
    Setz mal dort n Haltepunkt und schau, ob der Compiler dort und bei der MessageBox vorbeikommt. Nicht, dass da irgendwo der Haken liegt und da der falsche Button hinterlegt ist.
    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:

    Option Strict Off


    My bad.

    Hab nach der installation von VS2019 noch nicht meinen "Standart" für VB eingestellt. Auch garnicht mehr dran gedacht, da ich fast garnet mehr mit VB arbeite.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Man könnte auch noch die Kultur mit einbeziehen. Abgeleitet aus dem Beispiel von @NoIde
    Jedem Button wird noch eine Charnummer in das Property Tag gelegt, die auch aufgelöst werden kann.

    Freundliche Grüsse

    exc-jdbi

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Linq
    4. Public Class KeyBoard
    5. Private AllButtons As List(Of Button)
    6. Public Event MyButtonClickEvent(sender As Object, e As MyButtonClickEventArgs)
    7. Private Sub Button_Click(sender As Object, e As EventArgs)
    8. RaiseEvent MyButtonClickEvent(sender, New MyButtonClickEventArgs With
    9. {
    10. .KeyStr = DirectCast(sender, Button).Text,
    11. .SomeOtherThings = DirectCast(sender, Button).Tag
    12. })
    13. End Sub
    14. Private Sub SetButtonAttributs()
    15. Dim kbcde = New KeyBoardsCultur.German
    16. Dim numblock = kbcde.NumBlock
    17. For i As Int32 = 0 To Me.AllButtons.Count - 1
    18. For j As Int32 = 0 To numblock.Length - 1
    19. If Me.AllButtons(i).Name = numblock(j).ButtonName Then
    20. Me.AllButtons(i).Text = numblock(j).Key
    21. Me.AllButtons(i).Tag = numblock(j).Ascii
    22. AddHandler Me.AllButtons(i).Click, AddressOf Me.Button_Click
    23. End If
    24. Next
    25. Next
    26. End Sub
    27. Private Sub InitializeKeyBoardCultur()
    28. Me.AllButtons = New List(Of Button)
    29. Me.AllButtons.AddRange(Me.Controls.OfType(Of Button))
    30. Me.SetButtonAttributs()
    31. End Sub
    32. Public Sub New()
    33. MyBase.New
    34. Me.InitializeComponent()
    35. Me.InitializeKeyBoardCultur()
    36. End Sub
    37. End Class
    38. Public Class MyButtonClickEventArgs
    39. Public KeyStr As String
    40. Public SomeOtherThings As Object
    41. End Class
    42. Public Class KeyBoardsCultur
    43. Public Class German
    44. Private ReadOnly ButtonName As String =
    45. "BtOne;BtTwo;BtDot;BtZero;BtThree;BtFour;" &
    46. "BtFive;BtSix;BtSeven;BtEight;BtNine;BtNum;" &
    47. "BtSlash;BtAsterisk;BtPlusSign;BtHyphen;BtEnter"
    48. Private ReadOnly Ascii As String =
    49. "49;50;46;48;51;52;53;54;55;" &
    50. "56;57;NUM;47;42;43;45;ENTER"
    51. Private ReadOnly Key As String =
    52. "1;2;.;0;3;4;5;6;7;8;9;NUM;/;*;+;-;ENTER"
    53. Public Function NumBlock() As KeyBoardsInfo()
    54. Dim keys = Me.Key.Split({";"c}, StringSplitOptions.RemoveEmptyEntries)
    55. Dim btnames = Me.ButtonName.Split({";"c}, StringSplitOptions.RemoveEmptyEntries)
    56. Dim sascii = Me.Ascii.Split({";"c}, StringSplitOptions.RemoveEmptyEntries)
    57. Dim res = New KeyBoardsInfo(keys.Length - 1) {}
    58. Enumerable.Range(0, res.Length).ToList.
    59. ForEach(Sub(x) res(x) = New KeyBoardsInfo With
    60. {
    61. .Key = keys(x),
    62. .Ascii = sascii(x),
    63. .ButtonName = btnames(x)
    64. })
    65. Return res
    66. End Function
    67. End Class
    68. End Class
    69. Public Class KeyBoardsInfo
    70. Public ButtonName As String
    71. Public Ascii As String
    72. Public Key As String
    73. End Class
    Dateien
    • KeyBoard.zip

      (17,19 kB, 64 mal heruntergeladen, zuletzt: )