Control.SetFocus

11/11/2014 - 14:16 von Lothar Geyer | Report spam
Ich habe eine Maske (MDIChild) mit (u.a.) einem Button und einer
ComboBox. Im Form_Activate steht

If ... Then
ComboBox.SetFocus
End If

Wenn nun die aktive Maske ein anderes MDIchild ist und ich auf den
Button klicke, wird dessen Funktion nicht ausgeführt. Erst beim zweiten
Klick. Wenn ich das o.a. SetFocus entferne, braucht es nur einen Klick.

1) Warum?
2) Wie kann ich das umgehen?

Lothar Geyer
 

Lesen sie die antworten

#1 Christian Zimmermann
12/11/2014 - 09:25 | Warnen spam
Hallo Lothar,

Am 11.11.2014 um 14:16 schrieb Lothar Geyer:
Ich habe eine Maske (MDIChild) mit (u.a.) einem Button und einer
ComboBox. Im Form_Activate steht

If ... Then
ComboBox.SetFocus
End If

Wenn nun die aktive Maske ein anderes MDIchild ist und ich auf den
Button klicke, wird dessen Funktion nicht ausgeführt. Erst beim zweiten
Klick. Wenn ich das o.a. SetFocus entferne, braucht es nur einen Klick.

1) Warum?



Weil der If-Teil der Bedingung greift und du den Fokus explizit der
Combobox gibst. Somit wird das Klickevent des Buttons nicht getriggert.

Wenn du die Eventreihenfolge analysierst, sieht das wahrscheinlich so aus:

Activate: Form
GotFocus: ComboBox
GotFocus: Commmand
GotFocus: ComboBox

Interessanterweise erhàlt der Button den Fokus trotzdem, jedoch wird er
gleich wieder an die Combobox abgegeben.

2) Wie kann ich das umgehen?



Normalerweise ist beim Triggern des GotFocus-Events Screen.ActiveControl
auch das Control, welches den Fokus hat. In deinem Fall ist im
GotFocus-Event des Commands aber die ComboBox das aktive Steuerelement.

Du kannst dann im GotFocus des Commands abfragen, ob ein anderes Control
als der CommandButton im Screen.ActiveControl verzeichnet ist. Dann
weißt du, dass geklickt wurde aber der Fokus eigentlich an ein anderes
Control gehen soll.

Etwa so:

Private Sub Command1_GotFocus()
If Not (Screen.ActiveControl Is Command1) Then
Command1.SetFocus
Call Command1_Click
End If
End Sub

Die Eventreihenfolge sàhe dann so aus (in Klammern steht das zu dem
Zeitpunkt aktive Steuerelement):

Activate: Form1 (Command1)
GotFocus: Commmand1 (Combo1)
Click: Command1 (Command1)
GotFocus: Combo1 (Command1)
GotFocus: Commmand1 (Command1)

Intern wird also eine Fokuskette abgearbeitet, wie man sieht. Ob und wie
man daraus einen Fokus entfernt, damit ein GotFocus-Event erst gar nicht
ausgelöst wird, weiß ich jetzt auf Anhieb nicht. Evt. müßte man die
Fensternachrichten danach absuchen und aus der message queue
entsprechend entfernen.

Gruß,
Christian

Ähnliche fragen