Forums Neueste Beiträge
 

Tastencodes/Events stören im Folge-Formular

12/03/2010 - 17:17 von Jo Neigel | Report spam
Hallo Group,
wie kann man verhindern, dass Tastencodes an eine 2te Form
weitergegeben werden?
Ev. indem man alle noch nicht ausgeführten Key-Events killt? Aber wie?

Das Problem làsst sich mit diesem Code nachbilden:
Beide Forms haben die Eigenschaft KeyPreview=True.
Wenn ich mit u.a. Code in Form 1 ENTER drücke, wird Form2 aufgerufen
aber beendet sich sofort wieder, da das ENTER in Form2 auch noch
ankommt.


Public Class Form1
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

If e.KeyChar = ChrW(13) Then
Dim f As New Form2
f.ShowDialog()
End If
End Sub
End Class

Public Class Form2
Private Sub Form2_KeyUp(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp

If e.KeyCode = Keys.Enter Then
Close()
End If

End Sub
End Class

Bitte fragt jetzt nicht nach dem Sinn dieses Beispiels. Es soll einen
komplexeren Ablauf vereinfachen.

Jo
 

Lesen sie die antworten

#1 Peter Götz
12/03/2010 - 18:15 | Warnen spam
Hallo Jo,

wie kann man verhindern, dass Tastencodes an
eine 2te Form weitergegeben werden?
Ev. indem man alle noch nicht ausgeführten
Key-Events killt?
Aber wie?



Um Code, der in Ereignisprozeduren steht oder von
dort aufgerufen wird, hast Du verschiedene Möglichkeiten.

Du kannst, anstatt die Deklaration für die Ereignis
auslösenden Objekte mit WithEvents auszuführen,
die benötigten Eventhandler mit AddHandler erst
zu dem Zeitpunkt "scharf" machen zu dem sie
benötigt werden, bzw. via RemoveHandler "unscharf"
machen, zu dem Zeitpunkt zu dem sie nicht mehr
benötigt werden. Ausführliche Infos dazu findest Du
in der Online-Hilfe zu AddHandler und zu RemoveHandler.

Eine andere Möglichkeit ist, eine Variable zu
nutzen, mit deren Hilfe Du bestimmst, wann Code
ausgeführt werden soll oder eben nicht ausgeführt
werden soll.

Public Class Form1

Private mLoading as boolean

Private Sub Form1_Load(.)
mLoading = True
'. blablabla ...
'. blablabla ...
'. blablabla ...
mLoading = False
End Sub

Private Sub AnySub()
if Not mLoading then
' nachfolgender Code wird erst ausgeführt,
' wenn mLoading = False ist.
' ... blablabla
' ... blablabla ...
End if
End Sub


Das Problem làsst sich mit diesem Code nachbilden:
Beide Forms haben die Eigenschaft KeyPreview=True.
Wenn ich mit u.a. Code in Form 1 ENTER drücke, wird
Form2 aufgerufen aber beendet sich sofort wieder,
da das ENTER in Form2 auch noch ankommt.


Public Class Form1
Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

If e.KeyChar = ChrW(13) Then
Dim f As New Form2
f.ShowDialog()
End If
End Sub
End Class

Public Class Form2
Private Sub Form2_KeyUp(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp

If e.KeyCode = Keys.Enter Then
Close()
End If

End Sub
End Class



Mit Hilfe einer zusàtzlichen Eigenschaft liessen sich die
Ablàufe nach Deiner Vorstellung steuern:

Public Class Form1
Private mFlag As Boolean

Friend Property Flag() As Boolean
Get
Return mFlag
End Get
Set(ByVal value As Boolean)
mFlag = value
End Set
End Property

Private Sub Form1_KeyPress _
(ByVal sender As Object, _
ByVal e As KeyPressEventArgs _
) Handles Me.KeyPress

If e.KeyChar = Chr(13) Then
mFlag = True
Dim F As New Form2
F.ShowDialog()
End If
End Sub

End Class

Public Class Form2
Private Sub Form2_KeyUp _
(ByVal sender As Object, _
ByVal e As KeyEventArgs _
) Handles Me.KeyUp

If Form1.Flag Then
Form1.Flag = False
Else
If e.KeyCode = Keys.Enter Then
Beep()
Close()
End If
End If
End Sub
End Class

Obwohl das prinzipiell funktioniert, würde ich das
allerdings in einem echten Programm so eher
nicht machen.
Ohne Deine konkrete Aufgabenstellung zu kennen,
kann man jedoch keine zu Deiner Aufgabenstellung
besser passende Lösung vorschlagen. Mit hoher
Wahrscheinlichkeit gàbe es eine Möglichkeit ohne
eine solche Ereigniskette auszukommen.

Bitte fragt jetzt nicht nach dem Sinn dieses Beispiels.
Es soll einen komplexeren Ablauf vereinfachen.



Wie schon erwàhnt, kann man ohne diesen "komplexeren
Ablauf" nàher zu kennen keine konkreten Lösungsvorschlàge
machen.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen