Ereignis-Filter für Tastatur- / Mausbedienung verwenden

Allgemeine Erklärung

Alle Ereignisse, welche an Forms oder Controls gesendet werden, laufen über eine globale Schnittstelle. Hier ist es möglich, auf bestimmte Ereignisse zu prüfen oder auf diese zu reagieren und die standardgemäße Verarbeitung zu überschreiben. Dazu gehören z.B. Tastenbetätigungen auf der Tastatur oder Mausklicks. So ist es z.B. möglich, an einer Stelle eine Tastenkombination zu realisieren, wo man sonst keine Eingriffsmöglichkeit hat, oder eine Behandlung umzusetzen, wo ein passendes Ereignis fehlt. Außerdem können mit wenig Aufwand globale Funktionalitäten entwickelt werden.

Artikel in Stücklisten-Registerkarte über Enter-Taste öffnen

In diesem Beispiel soll im Artikelstamm in der Registerkarte 'Baukasten-Stückliste Fertigung' bei der Stückliste oder dem Verwendungsnachweis der gerade ausgewählte Artikel per Enter-Taste in einem neuen Fenster geöffnet werden können. Dazu werden die gedrückte Taste und das Control mit Fenster abgefragt.

VB.NET SDK-Programmcode

  

#Region " TriggerFormFramework_EwaMenueFormLoadClosing-Ereignis " 

        Private Sub TriggerFormFramework_EwaMenueFormLoadClosing(sender As Object, e As MenüFormEventArgs) Handles Me.EwaMenueFormLoadClosing 

                '>>> Beim Start von easyWinArt 

                If e.LoadJN Then 

                    Dim sdkMessageFilterOBJ As New SdkMessageFilter 

                    Application.AddMessageFilter(sdkMessageFilterOBJ) 

                End If 

        End Sub 

#End Region 

 

#Region " Public Class SdkMessageFilter (Tastatur-Bedienung) " 

        <SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> 

        Public Class SdkMessageFilter 

            Implements IMessageFilter 

            <SecurityPermission(SecurityAction.Demand)> _ 

            Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements IMessageFilter.PreFilterMessage 

                    Dim WM_KEYDOWN As Integer = &H100 

                    '>>> Wenn eine Taste auf der Tastatur gedrückt wurde 

                    If m.Msg = WM_KEYDOWN Then 

                        '>>> Control holen, an das das Ereignis gerichtet ist 

                        Dim ctl As Control = Control.FromHandle(m.HWnd) 

                        If ctl Is Nothing Then Return False 

                        '>>> Nur bei Tastendruck auf ein Control des Artikel-Fensters 

                        If TypeOf ctl.FindForm Is ArtikelFRM Then 

                            '>>> Nur, wenn der Tastendruck an ein TreeView gerichtet ist 

                            If TypeOf ctl Is System.Windows.Forms.TreeView Then 

                                '>>> Betätigte Taste holen 

                                Dim taste As System.Windows.Forms.Keys = CType(CInt(m.WParam), System.Windows.Forms.Keys) And System.Windows.Forms.Keys.KeyCode 

                                '>>> Nur bei Enter-Taste 

                                If taste = Keys.Enter Then 

                                    '>>> Treeview holen 

                                    Dim treeViewOBJ As TreeView = CType(ctl, TreeView

                                    '>>> Nur bei zwei bestimmten Treeviews 

                                    If treeViewOBJ.Name = "TreeViewStrukturFertigung" OrElse treeViewOBJ.Name = "TreeViewVerwendungFertigung" Then 

                                        '>>> Den im Treeview ausgewählten Artikel in neuem Fenster öffnen  

                                        If Not treeViewOBJ.SelectedNode Is Nothing Then 

                                            Menue.FRM.CallTheFunction(New Guid(MF.Artikel), CType(treeViewOBJ.SelectedNode, StlTreeNode).Artikel) 

                                            '>>> Ereignis als behandelt melden, so dass die Abarbeitung hiermit zu Ende ist 

                                            Return True 

                                        End If 

                                    End If 

                                End If 

                            End If 

                        End If 

                    End If 

                    '>>> Ereignis als unbehandelt melden, somit wird anschließende wie gewohnt die Standardbehandlung durchgeführt 

                    Return False 

            End Function 

        End Class 

#End Region

Blättern in untergeordnetem Ewa1zuN abfangen

In einem unserer Kundenprojekte war es notwendig, im Adressen-Fenster direkt den in der Registerkarte 'Ansprechpartner' ausgewählten Datensatz bearbeiten zu können. Dazu wurden einige Steuerelemente ergänzt, in denen bestimmte Ansprechpartner-Werte beim Blättern durch die Ansprechpartner angezeigt und geändert werden konnten. An dieser Stelle war es erforderlich, das Blättern im Ansprechpartner-Ewa1zuN zu verhindern, wenn noch ungespeicherte Änderungen vorlagen. Dass die Adresse selbst als geändert galt und somit das gelbe Lämpchen eingeschaltet war, obwohl nur Werte des Ansprechpartners bearbeitet worden sind, wurde über eine Extra-Checkbox gelöst, welche eine Datenbindung zur Adresse hatte. Da es für den Klick per Maus ins DataGrid des Ewa1ZuN kein Ereignis gab, welches ordentlich den Klick verhindern konnte, wird der Mausklick über den folgenden Code abfgefangen.

VB.NET SDK-Programmcode

  

#Region " TriggerFormFramework_EwaMenueFormLoadClosing-Ereignis " 

        Private Sub TriggerFormFramework_EwaMenueFormLoadClosing(sender As Object, e As MenüFormEventArgs) Handles Me.EwaMenueFormLoadClosing 

                '>>> Beim Start von easyWinArt 

                If e.LoadJN Then 

                    Dim sdkMessageFilterOBJ As New SdkMessageFilter 

                    Application.AddMessageFilter(sdkMessageFilterOBJ) 

                End If 

                End Sub 

#End Region 

 

#Region " Public Class SdkMessageFilter (Bein Blättern durch Mausklick)" 

        <SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> 

        Public Class SdkMessageFilter 

            Implements IMessageFilter 

            <SecurityPermission(SecurityAction.Demand)> _ 

            Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements IMessageFilter.PreFilterMessage 

                    '>>> Nur bei linker Maustaste 

                    If ((m.Msg >= 513) And (m.Msg <= 515)) Then 

                        '>>> Control holen 

                        Dim ctl As Control = Control.FromHandle(m.HWnd) 

                        '>>> Nur bei EwaDataGrid 

                        If TypeOf ctl Is EwaDataGrid Then 

                            '>>> Nur bei Adressen-Fenster 

                            If TypeOf ctl.FindForm Is AdressenFRM Then 

                                Dim adFRM As AdressenFRM = CType(ctl.FindForm, AdressenFRM

                                If ctl Is adFRM.Ewa1zuNAnsprechpartner.DataGridAnzeige1n Then 

                                    Dim ewa1zuNOBJ As EwaDataGrid = CType(ctl, EwaDataGrid

                                    '>>> wenn nicht gespeichert wurde, das gelbe Lämpchen also an ist 

                                    If adFRM.AktuelleDtRowGeändertJN Then 

                                        '>>> Punkt holen, auf den geklickt wurde 

                                        Dim pos As New Point(m.LParam.ToInt32() And &HFFFF, m.LParam.ToInt32() >> 16) 

                                        '>>> Prüfen, auf was genau vom DataGrid geklickt wurde 

                                        Dim hit As DataGrid.HitTestInfo = ewa1zuNOBJ.HitTest(pos.X, pos.Y) 

                                        '>>> Nur bei Klick auf ein Zelle 

                                        If hit.Type = DataGrid.HitTestType.Cell Then 

                                            '>>> Bei Klick auf andere Zeile als die aktuelle Zeile Meldung und Klick verhindern 

                                            If hit.Row <> ewa1zuNOBJ.CurrentRowIndex Then 

                                                FktF.Meldung("Bitte vor dem Blättern in den Ansprechpartnern erst speichern!", adFRM) 

                                                Return True 

                                            End If 

                                        End If 

                                    End If 

                                End If 

                            End If 

                        End If 

                    End If 

                    Return False 

            End Function 

        End Class 

#End Region

Beratung erwünscht?

Gerne können Sie mich oder einen mein­er freund­lichen Kollegen telefonisch er­reichen:  +49 2161 277 680

Alter­na­tiv schrei­ben Sie uns an  info@it-easy.de oder nutz­en Sie das nach­folgende Kontakt­formular.

Ihr Ralf Jasper
Kundenservice

Mitarbeiterfoto von Herrn Ralf Jasper


Rückruf-Service

Für eine möglichst unkomplizierte Kontaktaufnahme füllen Sie bitte das unten stehende Formular aus und klicken auf „Rückruf anfordern“.