Keydown-ereignis aufrufen und Taste mitgeben

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Keydown-ereignis aufrufen und Taste mitgeben

    Hallo,

    In meinem Formular gibt es eine Funktion, die die gedrückte Taste auswertet und entsprechend darauf reagiert. Ich habe das Programm erweitert, sodaß es zu jeder Taste auch einen entsprechenden Menüpunkt gibt. Wird ein Menüpunkt ausgewählt, soll sie das KeyDown-Ereignis auslösen und eine bestimmte Taste mitgeben. Das Programm funktioniert, allerdings gibt es Warnungen, die ich gerne wegprogrammieren würde.

    VB.NET-Quellcode

    1. Public Sub PunktbilderFormular_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. Select Case e.KeyCode
    3. Case Keys.Enter
    4. ...
    5. case keys.right
    6. ...
    7. end select
    8. end sub
    9. Private Sub NachRechtsMenue_Click(sender As Object, e As EventArgs) Handles NachRechtsMenue.Click
    10. PunktbilderFormular_KeyDown(Me, New System.Windows.Forms.KeyEventArgs(Keys.KeyCode.Right))
    11. End Sub


    Wie kann ich die Funktion "PunktBilderFormular_keydown" korrekt aufrufen und ihr eine Taste mitgeben?

    Vielen Dank für eure Hilfe
    @tron25 Eher so:

    VB.NET-Quellcode

    1. PunktbilderFormular_KeyDown(PunktbilderFormular, New System.Windows.Forms.KeyEventArgs(Keys.KeyCode.Right))
    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!
    ..._KeyDown(PunktBilderFormular,...
    funktioniert nicht, da das der Formularname ist.

    Die Fehlermeldung lautet:
    Warnung BC42025 Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; der qualifizierende Ausdruck wird nicht ausgewertet.
    @tron25 Sieh Dir mal genau an, auf welchen Ausdruck sich diese Meldung bezieht.
    Da ist irgendwas mit Shared oder Const und Du hast mit Me.xxx drauf zugegriffen oder umgekehrt.
    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 habe mir auch die MSDN durchgelesen. Da stand auch etwas von "Schared". Aber wenn ich folgendes schreibe, mäckert das Programm an fast jeder Variablen und jedem Elemnd herum:

    VB.NET-Quellcode

    1. Public Shared Sub PunktbilderFormular_Load(sender As Object, e As EventArgs) Handles MyBase.Load


    Ich habe es auch schon mit "sendkeys" versucht, aber das finde ich einerseits nicht so sauber und andererseit hat es auch nicht funktioniert.
    @tron25 Das ist ein Eventhandler, der darf so nicht deklariert werden, sondern muss so deklariert sein:

    VB.NET-Quellcode

    1. Private Sub PunktbilderFormular_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Vielleicht postest Du mal den relevanten Code.
    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!
    Da ist mir ein kleiner Fehler beim Kopieren unterlaufen. Es handelt sich nicht um die "_Load"-Funktion, sondern um:

    VB.NET-Quellcode

    1. Public Sub PunktbilderFormular_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. 'Diese Funktion wird ausgeführt, wenn eine Taste gedrückt wird.
    3. 'Es werden der Tastencode und der Zustand der Shift-Taste
    4. 'abgefragt.
    5. Select Case e.KeyCode
    6. 'ENTER-Taste
    7. Case Keys.Enter
    8. 'Wenn der Menüpunkt "UebernehmenMenue" aktiviert ist, so wird dieser Code
    9. 'ausgeführt.
    10. If UebernehmenMenue.Enabled = True Then
    11. ...
    12. End If
    13. 'Cursor-Rechts
    14. Case Keys.Right
    15. 'Wenn das Originalbild angezeigt wird und der Menüpunkt
    16. '"BildHinzufuegenMenue" aktiviert ist, wird die Position vm hinzufügenden Bild angepaßt.
    17. If OriginalbildAnzeigenMmenue.Checked = True Then
    18. If BildHinzufuegenMenue.Checked = True Then
    19. ...
    20. End If
    21. end if
    22. ...
    23. end select
    24. end sub
    25. 'Es gibt einen Menüpunkt, der die obige Funktion aufrufen soll und eine Taste übergeben soll.
    26. Private Sub NachRechtsMenue_Click(sender As Object, e As EventArgs) Handles NachRechtsMenue.Click
    27. PunktbilderFormular_KeyDown(sender, New System.Windows.Forms.KeyEventArgs(Keys.KeyCode.Right))
    28. End Sub


    Das Programm funktioniert, aber ich bekomme folgende Warnung angezeigt:
    Warnung BC42025 Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; der qualifizierende Ausdruck wird nicht ausgewertet.

    Ehrlich gesagt, verstehe ich diese Warnung nicht ganz. Kann mir Jemand das erklären oder mir die korrekte Schreibweise der Funktionen posten?

    Danke!
    Deine IDE sollte Dich eigentlich mit der Warnung auf Zeile 28 stoßen und evtl. einen Verbesserungsvorschlag machen. Mach aus Keys.KeyCode.Right ein Keys.Right und fertig. Was will Dir die Warnung sagen: Es gibt eine klassenspezifische Aufzählung (enum) für die Klasse, auf die man ganz allgemein und ohne Umschweife zugreifen kann. Du brauchst keine konkrete Klassenbjektinstanz, um auf diese Aufzählung zuzugreifen, also um Keys.Right zu verwenden.
    EDIT: Keys.KeyCode.Right hat natürlich nix mit Objektinstanz zu tun, sondern ist ein enum-Aufruf, der zwei konstante Werte miteinander kombiniert, und zwar: KeyCode = 65535 und Right = 39. Der Compiler sieht das als überflüssig an, da er zwei Zahlen sieht und nur die letzte als relevant ansieht.
    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.

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

    @tron25
    In welcher Codezeile kommt diese Meldung?
    Und:

    VB.NET-Quellcode

    1. If [True] = True Then
    machst Du

    VB.NET-Quellcode

    1. If [True] Then
    (z.B. bei If UebernehmenMenue.Enabled = True Then)
    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!
    Was ich noch anmerken möchte: In Abhängigkeit davon, was da alles an Funktionalität in Deiner PunktbilderFormular_KeyDown-Sub-Prozedur steht (ich spreche jetzt mal von Sub-Prozedur, obwohl "EventHandler" hier ein spezifischeres Wort wäre), wäre es wahrscheinlich sinnvoller, Deinen Code folgendermaßen umzugestalten, was auch Deine NachRechtsMenue_Click-Prozedur vereinfacht (Stichwort Anfang einer Trennung GUI-Code und Business-Code):

    VB.NET-Quellcode

    1. Public Sub PunktbilderFormular_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. Select Case e.KeyCode
    3. Case Keys.Enter: EnterTastenAktion()
    4. Case Keys.Right: RechtsTastenAktion()
    5. 'und noch ganz viele andere Tastenüberprüfungen
    6. End Select
    7. End Sub
    8. Private Sub EnterTastenAktion()
    9. 'was beim Drücken der Enter-Taste passieren soll
    10. End Sub
    11. Private Sub RechtsTastenAktion()
    12. 'was beim Drücken der Nach-Rechts-Taste passieren soll
    13. End Sub
    14. Private Sub NachRechtsMenue_Click(sender As Object, e As EventArgs) Handles NachRechtsMenue.Click
    15. RechtsTastenAktion()
    16. End Sub

    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.

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