zwei unterschiedliche Events zusammenfassen?

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    zwei unterschiedliche Events zusammenfassen?

    Meinetwegen ich möchte Keypress und MouseOver als eine Eventroutine verwenden.
    Soweit ich mich erinnere haben beide Standardsubs verschiedene Übergabeparameter.

    Darum ist es auch nicht möglich die Handles zu mischen.
    Oder gibt es doch eine Möglichkeit?

    Würde ich in beide Routinen den gleichen Prozedureaufruf setzen, so würden eventuell
    beide Events feuern und somit die Prozedur auch zwei mal aufgerufen werden.

    Lightsource schrieb:

    Würde ich in beide Routinen den gleichen Prozedureaufruf setzen, so würden eventuell beide Events feuern
    Die Events feuern immer zweimal, egal, ob sie durch eine oder durch zwei Eventroutinen gehandelt werden.
    So wird halt dieselbe Routine zweimal durchlaufen (mit verschiedenen Sendern).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Lightsource schrieb:

    Meinetwegen ich möchte Keypress und MouseOver als eine Eventroutine verwenden.
    Soweit ich mich erinnere haben beide Standardsubs verschiedene Übergabeparameter.

    Darum ist es auch nicht möglich die Handles zu mischen.
    Oder gibt es doch eine Möglichkeit?

    Würde ich in beide Routinen den gleichen Prozedureaufruf setzen, so würden eventuell
    beide Events feuern und somit die Prozedur auch zwei mal aufgerufen werden.

    MouseOver ist mir nur als Event eines HtmlDocumentes bekannt - Controls have no such event.
    KeyPress ist andererseits nur in Controls verfügbar - wovon ist also die Rede?

    Welchen Sinn solls haben, derlei sehr unterschiedliche Events von derselben Methode zu behandeln??

    Natürlich wird jedes Event nur genau einmal gefeuert, nämlich wenn es auftritt. Und würde mich sehr erstaunen, wenn ein MouseOver oder sonstiges MausEvent gleichzeitig mit einem KeyPress gefeuert wird - dazu müsste der User die Taste gedrückt halten, und mit der Maus herum-agieren.
    Ich würde es so tun, das kann man nach einem halben Jahr noch verstehen:

    VB.NET-Quellcode

    1. Private Sub Form1_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseHover
    2. xxx(sender, e)
    3. End Sub
    4. Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    5. xxx(sender, e)
    6. End Sub
    7. Private Sub xxx(ByVal x1 As Object, ByVal x2 As Object)
    8. ' etwas tun
    9. End Sub
    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 man in VB.NET schon ein Handles-Schlüsselwort hat, kann man das auch benutzen. ;)
    @RodFromGermany:

    VB.NET-Quellcode

    1. Private Sub Form1_MouseHover_KeyDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseHover, MyBase.KeyDown ' Man beachte die BEIDEN handles hier
    2. ' etwas tun
    3. End Sub
    Ist mit @AliveDevil:s Erweiterung kombinierbar.

    @Fibonacci: Namespaces importiert?


    Zu den verschiedenen Übergabeparametertypen: Einfach die gemeinsame Basisklasse (System.EventArgs) bei den Parametern verwenden.
    Von meinem iPhone gesendet

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

    nikeee13 schrieb:

    Da man in VB.NET schon ein Handles-Schlüsselwort hat, kann man das auch benutzen. ;)
    Lesen und verstehen. :D
    In meinem Beispiel haben die beiden Prozeduren unterschiedliche Signaturen: EventArgs und KeyEventArgs.
    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!

    AliveDevil schrieb:

    Da gibts kein Unterschied zwischen Form oder Form
    Doch.

    VB.NET-Quellcode

    1. If sender Is Me Then
    2. ElseIf sender Is frm2 Then
    3. ElseIf sender Is Button2 Then
    4. ElseIf sender Is PictureBox1 Then
    5. ElseIf sender Is PictureBox2 Then
    6. End If
    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!
    Also nochmal: Imo ists Unfug, so verschiedene Events in einem Handler zu behandeln.

    Ausserdem geht das garnet, weil die Events erwarten unterschiedliche Signaturen:

    VB.NET-Quellcode

    1. Private Sub frmA0Form_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles Me.KeyPress, Me.MouseHover
    2. End Sub
    getestet: geht nicht.

    Man wird auch nicht aus 2 verschiedenen Handlern dieselbe dritte Methode aufrufen, jedenfalls der kann man keine spezifischen EventArgs übergeben (ok - werden die EventArgs nicht gebraucht, geht das).
    Oder man muß die EventArgs auf ihren Typ testen und casten - aber dassis doch Crap.

    Verschiedene Dinge soll man auseinanderhalten, und nicht mit gewalt zusammenrühren, und dann mit Select Case und TypenTests wieder aufdröseln, und dann doch was unterschiedliches machen.

    ErfinderDesRades schrieb:

    getestet: geht nicht.

    Ich habe doch geschrieben, dass man statt den KeyPressEventArgs den gemeinsamen Basistypen verwenden kann (System.EventArgs). Dann sollte der Compiler auch nicht meckern.
    Wenn man am Ende natürlich doch wieder 2 Aktionen macht, die sich bei bspw. PictureBoxen udn Formen unterscheiden, macht das auch keinen Sinn, da gebe ich dir Recht. Macht also nur Sinn, wenn man die EventArgs eigentlich nicht braucht.
    Von meinem iPhone gesendet

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

    Das mit den MouseEventArgs klappt noch nicht ganz...

    VB.NET-Quellcode

    1. Private Sub bla(ByVal Control As PictureBox, ByVal MouseState As System.EventArgs)
    2. If MouseState = MouseHoverEventArgs Then
    3. Control.Backcolor = Color.Black
    4. ElseIf MouseState = MouseLeaveEventArgs Then
    5. Control.Backcolor = Color.White
    6. End If
    7. End Sub
    8. Private Sub Control1_MouseHover(sender As System.Object, e As MouseEventArgs) Handles Control1.MouseHover, Control2.MouseLeave
    9. bla(sender, e)
    10. End Sub
    "klappt noch nicht ganz" - 1A Fehlerbeschreibung.
    Kannst du das Problem bitte genauer beschreiben?

    Im Übrigen solltest du den is-Operator, nicht den =-Operator verwenden, um auf den Typen zu testen.
    Von meinem iPhone gesendet
    Das kann nicht funktionieren!
    1. Option Strict On alle Fehler korrigieren und dann weiter schauen.
    Deine Sub bla will ne Picturebox und ein system.eventarg aben, du übergibst aber ein Object und ein Mouseeventarg, das kann nich gehen.
    Wieso überhaupt auf einmal picturbox?
    Ganz abgesehen davon? warum nutzt die nicht direkt MouseLeave und MouseEnter? Weil beim Hover is die Mouse ja nun mal drüber über dem Control/ Bereich woher soll der PC wissen ob die nu rein oder raus geht, das weiß er nur in dem Augenblick wo die Grenze überschritten wird!

    VB.NET-Quellcode

    1. Private Sub Control_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Control1.MouseEnter, Control2.MouseEnter
    2. DirectCast(sender, PictureBox).BackColor = Color.Yellow
    3. End Sub
    4. Private Sub Control_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Control1.MouseLeave, Control2.MouseLeave
    5. DirectCast(sender, PictureBox).BackColor = Color.Red
    6. End Sub

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

    @nikeee13,
    immer noch der gleiche Fehler:

    Fibonacci schrieb:

    Geht nicht; bei MouseHoverEventArgs will IntelliSense TreeNodeMouseHoverEventArgs oder ListViewItemMouseHoverEventArgs haben.



    @FloFuchs,
    Option Strict ist bei mir dauer-on. Das Control ist doch egal. Ich möchte die Handles (ebenfalls) zusammenfassen, da ich sonst bestimmt 20x mal das gleiche da stehen habe.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. For Each crt As Control In Me.Controls
    3. AddHandler MouseEnter, AddressOf horst
    4. AddHandler MouseLeave, AddressOf manfred
    5. Next
    6. End Sub
    7. Sub horst(ByVal sender As Object, ByVal e As System.EventArgs)
    8. DirectCast(sender, Control).BackColor = Color.Red
    9. End Sub
    10. Sub manfred(ByVal sender As Object, ByVal e As System.EventArgs)
    11. DirectCast(sender, Control).BackColor = Color.Yellow
    12. End Sub

    BTW... soviel zu Option Strict Dauer On.....
    Bilder
    • OptionStrict3.gif

      214,54 kB, 1.581×933, 131 mal angesehen