Einen heimtückischen Effekt des Font-Objekts werden Sie sicher schon kennen gelernt haben: Wenn Sie beispielsweise das Font-Objekt eines Steuerelements einem anderen Steuerelement zuweisen, und wenn Sie dann dort eine Eigenschaft des Objekts ändern, wirkt sich diese Änderung auch auf die Darstellung des ersten Steuerelements aus.
Set Label12.Font = Label11.Font
Label12.Font.Bold = True
Um diese beiden Steuerelement unabhängig voneinander zu halten, müssen Sie ein neues Font-Objekt instanzieren und dem zweiten Steuerelement zuweisen. Nun können sie die Eigenschaften des Font-Objekts beim zweiten Steuerelement beliebig modifizieren.
Damit die Font-Einstellungen bei diesem zweiten Steuerelement mit denen des ersten Steuerelements zunächst übereinstimmen, können Sie die Eigenschaften des ursprünglichen Font-Objekts einzeln an diese neue Instanz einzeln übertragen:
Dim nFont As StdFont
Set nFont = New StdFont
With Label21.Font
nFont.Bold = .Bold
nFont.Charset = .Charset
nFont.Italic = .Italic
nFont.Name = .Name
nFont.Size = .Size
nFont.Strikethrough = .Strikethrough
nFont.Underline = .Underline
nFont.Weight = .Weight
End With
Set Label22.Font = nFont
Eine mühselige Angelegenheit, wie es scheint... Weitaus handlicher erscheint die in Visual Basic 6 zur Verfügung stehende Möglichkeit, zur Erzeugung eines neuen unabhängigen Font-Objekts mit den gleichen Einstellungen ein PropertyBag-Objekt zu verwenden. Sie speichern das Font-Objekt des einen Steuerelements in einer temporär angelegten Instanz eines PropertyBag-Objekts, und weisen das anschließend aus dem PropertyBag ausgelesene Font-Objekt dem anderen Steuerelement zu. Auf diese Weise wird tatsächlich ein neues Font-Objekt erzeugt, da das im PropertyBag lediglich die Einstellungen eines Font-Objekts angelegt werden.
Dim nPropbag As PropertyBag
Set nPropbag = New PropertyBag
nPropbag.WriteProperty "F", Label31.Font
Set Label32.Font = nPropbag.ReadProperty("F")
Dieses Verfahren hat aber einen kleinen Haken. Der Schreibaufwand hat sich zwar auf gut die Hälfte reduziert - die Ausführung zur Laufzeit dauert jedoch um gut die Hälfte länger als die Zuweisung der einzelnen Eigenschaften beim ersten Verfahren.
Es gibt aber noch eine erheblich schnellere Lösung. Sie ist um etwa 40% schneller als die Einzelzuweisungen, und fast doppelt so schnell wie der PropertyBag-Umweg. Und sie hat den Vorteil, das sie auch in Visual Basic 5 zur Verfügung steht.
Falls Sie bereits einmal die Neugier gepackt hat, was sich hinter dem Menüpunkt "Ausgeblendete Mitglieder anzeigen" im Kontextmenü des Objektkatalogs verbirgt, werden Sie vielleicht beim Stöbern in der "stdole"-Bibliothek eine Reihe weiterer Objekte entdeckt haben. Die in grauer Schrift angezeigten "Objekte" (aha - Anführungszeichen...!?) sind allerdings keine Objekte, sondern lediglich weitere Schnittstellen der beiden Objekte dieser Bibliothek. Leider sind einige der recht interessant und viel versprechend aussehenden Methoden und Eigenschaften dieser Schnittstellen in Visual Basic nicht verwendbar. Doch die Clone-Methode der IFont-Schnittstelle des Font-Objekt ist genau das, was die versprochene Beschleunigung bietet. Der erste nahe liegende Versuch, diese Methode zu nutzen, schlägt allerdings fehl - das zweite Steuerelement denkt gar nicht daran, die Einstellungen des Fonts des ersten Steuerelements zu übernehmen:
Dim nIFont As IFont
Set nIFont = Label11.Font
nIFont.Clone Label12.Font
Irgendwie scheint nicht ganz klar zu sein, wer hier wen klont - vielleicht einfach umgekehrt?
Dim nIFont As IFont
Set nIFont = Label12.Font
nIFont.Clone Label11.Font
Doch da tut sich immer noch nichts. Also doch ein neues Font-Objekt instanzieren, es dann klonen und zuweisen?
Dim nIFont As IFont
Dim nFont As StdFont
Set nIFont = Label11.Font
Set nFont = New StdFont
nIFont.Clone nFont
Set Label12.Font = nFont
Na endlich! Nun brauchen wir nur noch eine handliche Clone-Funktion - denn auch das ist noch immer eine Menge Schreiberei.
Public Function CloneFont(Font As IFont) As StdFont
Font.Clone CloneFont
End Function
Diese Funktion nimmt uns die Instanzierung eines neuen Font-Objekts und die Schnittstellen-Konvertiererei auf einen Schlag ab - und ist selbst sogar noch kürzer. Und auch das Klonen eines Steuerelement-Font-Objekts spielt sich nunmehr nur noch in einer einzigen Zeile ab:
Set Label42.Font = CloneFont(Label41.Font)
Die Änderung einer Font-Einstellung beim zweiten Steuerelement bleibt nun ohne Risiken und Nebenwirkungen:
Label42.Font.Bold = True
|