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