Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Font-Kuddelmuddel

1 view
Skip to first unread message

Michael Landenberger

unread,
Jan 17, 2022, 3:56:34 PM1/17/22
to
Hallo,

ich habe mir eben einen Wolf nach einem Problem mit dem Font in einem Formular
gesucht. Das Problem bestand darin, dass ein Formular meiner Anwendung und die
darin enthaltenen Controls partout nicht den im Designer eingestellten Font
verwenden wollten. Hat man dieses "defekte" Formular als Dialog aus einem
anderen, bis dahin intakten Formular heraus geöffnet, hat es auch den Font des
Ursprungsformulars zerschossen. Beim neu geöffneten Formular war das sofort
sichtbar, beim dahinterliegenden, bis dahin intakten Formular erst beim
nächsten Neuzeichnen.

Das betreffende Formular verwendet viele selbstprogrammierte Controls. Die
meisten dieser Controls haben einen grafischen Inhalt, der sich gelegentlich
verändert. Um das flackerfrei hinzubekommen, zeichne ich die Grafik zunächst
in eine Bitmap und kopiere die dann in den Canvas des Controls. Funktioniert
soweit gut. Allerdings enthalten die Grafiken z. T. auch Text, und der soll
genauso aussehen wie die Texte im Formular und in anderen Steuerelementen.
Also habe ich in meiner Naivität einfach dem Canvas der Bitmap den Font des
Controls zugewiesen, also Bitmap.Canvas.Font := MyControl.Font. Zunächst
schien das zu funktionieren. Ab einer bestimmten Anzahl solcher grafischen
Controls trat aber dann der oben beschriebene Effekt auf.

Nach längerer Suche habe ich dann die Ursache gefunden. Sie bestand darin,
dass ich die (nur temporär benötigte) Bitmap nach dem Neuzeichnen der Grafik
wieder freigegeben habe. Dabei wurde auch ihr Canvas freigegeben. Weil dem
aber noch der Font des Controls zugewiesen war (der vermutlich wegen
ParentFont = True auch der des Formulars war), hat das den Font des Controls
bzw. des Formulars "zerstört". Das hat mich insofern überrascht, als dass ich
davon ausgegangen bin, dass bei der Zuweisung eines Fonts an einen Canvas eine
Kopie des Font-Objekts mit einem eigenen Handle angelegt wird, so dass beim
Freigeben des Canvas das Original-Fontobjekt nicht zerstört wird. Offenbar ein
Irrtum.

Abhilfe: statt das ganze Font-Objekt zuzuweisen, weise ich jetzt nur noch den
Namen der Schriftart zu, also Bitmap.Canvas.Font.Name := MyControl.Font.Name.
Dadurch existieren das Font-Objekt des Controls und das des Bitmap-Canvas
gleichzeitig. Eine Freigabe der Bitmap zerstört dann nicht mehr das
Font-Objekt des Controls. Funktioniert prima. Hat aber ein bisschen Mühe
gekostet, den Fehler zu finden.

Gruß

Michael
0 new messages