|
Wenn die Größe eines UserControls von einer Schriftgröße abhängen soll, muss das UserControl auf die Änderung der betreffenden Schriftgröße reagieren. In Visual Basic 6 löst ein Font-Objekt das Ereignis FontChanged aus, wenn eine der Eigenschaften des Font-Objekts geändert wurden. Sie brauchen also lediglich eine Ereignisempfänger-Variable auf das betreffende Font-Objekt zu setzen, am besten in den Ereignissen InitProperties und ReadProperties des UserControls:
Private WithEvents eFont As StdFont
Private Sub UserControl_InitProperties()
Set eFont = XY.Font
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Set eFont = XY.Font
End Sub
Private Sub eFont_FontChanged(ByVal PropertyName As String)
' Reaktion...
End Sub
Das funktioniert ganz prächtig sowohl zur Laufzeit als auch zur Entwicklungszeit - mit der Einschränkung, dass das Font-Objekt nicht als Eigenschaft des UserControls zur Verfügung gestellt wird. Sobald Sie den Zugriff auf das Font-Objekt über Eigenschaften-Prozeduren ermöglichen, klappt das nicht mehr zur Entwicklungszeit. VB ersetzt bei der Änderung einer Eigenschaft eines so offen gelegten Font-Objekts nämlich das vorhandene Font-Objekt durch ein neues. Und da dieses noch nicht Ihrer Ereignisempfänger-Variablen zugewiesen ist, kommt auch kein FontChanged-Ereignis in Ihrem UserControl an. Eine nachträgliche Zuweisung in der Property Set-Prozedur der Font-Eigenschaft kommt zu spät. Zur Laufzeit bleibt das Font-Objekt hingegen erhalten.
Da aber bei einem Zugriff auf das Font-Objekt zur Entwicklungszeit auch immer auf die Property Set-Prozedur zugegriffen wird, können Sie statt des FontChanged-Ereignisses zur Entwicklungszeit dieses als Anstoß für eine Reaktion auf eine Änderung einer Eigenschaft des Font-Objekts betrachten - es fehlt Ihnen lediglich die Information, was sich geändert hat. Zur Entwicklungszeit sollte es allerdings kein großes Problem sein, in jedem Fall und pauschal zu reagieren - Performance-Fragen spielen hier sicher keine so übergroße Rolle.
Das folgende Beispiel zeigt, wie Sie dafür sorgen können, dass etwa eine TextBox immer vollständig die Fläche eines UserControls bedeckt und sich dieses bei Änderungen der Schriftgröße der TextBox auch in der Höhe sofort anpasst - sowohl zur Entwicklungszeit als auch zur Laufzeit:
Private WithEvents eFont As StdFont
Public Property Get Font() As StdFont
Set Font = Text1.Font
End Property
Public Property Let Font(New_Font As StdFont)
zSetFont New_Font
End Property
Public Property Set Font(New_Font As StdFont)
zSetFont New_Font
End Property
Private Sub zSetFont(New_Font As StdFont)
Set eFont = New_Font
Set Text1.Font = New_Font
UserControl_Resize
PropertyChanged "Font"
End Sub
Private Sub eFont_FontChanged(ByVal PropertyName As String)
UserControl_Resize
End Sub
Private Sub UserControl_InitProperties()
Set eFont = Text1.Font
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Set Text1.Font = PropBag.ReadProperty("Font", Ambient.Font)
Set eFont = Text1.Font
End Sub
Private Sub UserControl_Resize()
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
With UserControl
txt.Move 0, 0, .ScaleWidth, 0
.Height = Text1.Height
End With
sInProc = False
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Font", Text1.Font, Ambient.Font
End Sub
|