|
Über das Problem, dass eine Klasse oder ein UserControl anscheinend keine Ereignisse des gleichen Objekt-Typs empfangen können, werden auch Sie vielleicht schon einmal gestolpert sein. So können Sie beispielsweise nicht ein UserControl alle Ereignisse empfangen lassen, die der Container dieses UserControls erhalten kann. In der Ereignis-Liste des UserControls fehlen nämlich die so genannten Extender-Ereignisse wie DragDrop, DragOver, DragDrop, GetFocus und LostFocus.
Den Verlust der beiden letztgenannten Ereignisse können wir ohne Weiteres verschmerzen, da das UserControls selbst gleich lautende Ereignisse zur Verfügung stellt. Doch wenn Sie im UserControl die auf der darüber liegenden Ebene des Containers (Form, UserControl als Container, UserDocument, PropertyPage) generierten Ereignisse bei "alten" VB-Drag&Drop-Vorgängen erhalten wollen, müssen Sie den Umweg über das Extender-Objekt gehen. Bei einem UserControl ist dies aus der Sicht des Containers immer ein Objekt des Typs VBControlExtender. Somit liegt auch die passende und notwendige Deklaration der Ereignisempfänger-Variablen auf der Hand:
Private WithEvents eSelf As VBControlExtender
Nun stehen die gesuchten Drag&Drop-Ereignisse zur Verfügung:
Private Sub eSelf_DragDrop(Source As Control, X As Single, _
Y As Single)
Debug.Print "DragDrop", Source.Name, X, Y
End Sub
Private Sub eSelf_DragOver(Source As Control, X As Single, _
Y As Single, State As Integer)
Debug.Print "DragOver", Source.Name, X, Y, State
End Sub
Damit die Ereignisse auch tatsächlich ankommen (die bloße Deklaration einer Ereignisempfänger-Variablen bleibt ja noch ohne Funktion), ist nun noch ein wenig Verwaltungsarbeit notwendig:
Private Sub UserControl_InitProperties()
If Ambient.UserMode Then
Set eSelf = Extender
End If
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
If Ambient.UserMode Then
Set eSelf = Extender
End If
End Sub
Private Sub UserControl_Terminate()
Set eSelf = Nothing
End Sub
|