![]() |
Win 10 : add/remove Font Resource
Moin Moin.
Für ein Editierprogramm verwende ich eine besondere Schriftart. Diese wird beim Start aus einer Ressource gelesen, anschließend gesetzt und beim Beenden des Programms wieder entfernt.
Delphi-Quellcode:
Soweit so schön, klappt(e) anstandslos. Also bisher, in diesem Fall mit Delphi7 und in Win7.
//in Form.Create
.... C4Font := 'D:\Games\C4\C4S.ttf'; FontRes := TResourceStream.Create(hInstance, 'TTF', Pchar('CityFont')); FontRes.SaveToFile(C4Font); FontRes.Free; FontInt :=AddFontResource(PChar(C4Font)); If FontInt > 0 then SendMessage(Application.Handle, WM_FONTCHANGE, 0, 0); If FontInt = 0 then MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Schriftenfehler', MB_OK or MB_ICONERROR); .... // in Form.OnDestroy .... RemoveFontResource(PChar(CityFont)); SendMessage(Application.Handle, WM_FONTCHANGE, 0, 0); If DeleteFile(C4Font) = false then MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Löschfehler', MB_OK or MB_ICONERROR); .... In Delphi 10.2 und Win10 geht das auch korrekt vor sich, dacht ich jedenfalls. Der Font wird zur Laufzeit verwendet,jedoch wird die TTF Datei nach dem Programmende nicht mehr gelöscht wie vorgesehen. Fehlermeldung : Zugriff verweigert Eine Löschung im Explorer funktioniert ebenfalls nicht mit der bekannten "Aktion kann nicht beendet werden, weil die Datei im System geöffnet ist." Meldung. Zum Zeitpunkt des Löschaufrufs in Delphi/Explorer war keine Anwendung am laufen, schon gar nicht eine die diese Schrift verwendet. Okay, einfach mal neu gestartet, direkt in den Explorer um die TTF Datei zu löschen - wieder "Aktion kann nicht....." usw. Jetzt mit "Unlocker" ans Werk. Und auch der kann die Datei erst - dann allerdings erfolgreich - nach einem Neustart löschen, gibt allerdings nicht aus wer denn die Datei im System noch verwendet. Jetzt mal kernig das Verzeichnis gelöscht in dem sich die TTF Datei befindet. Kein Problem. Alles weg. Was kann das sein? creehawk Das Problem besteht auf insgesamt 20 Win10Home Rechnern, darunter auch nagelneue (Vanilla) ohne irgendwelche Programme. |
AW: Win 10 : add/remove Font Resource
Das Problem wirst du auch unter einem Vollständig ge-update-tetem Window 7 haben. Delphi älter als XE hat übrigens auch das Problem, wenn man keinen Workaround oder IDEFixPack installiert hat.
Zitat:
![]() Du kannst aber anstatt AddFontResource die Funktion AddFontMemResourceEx verwenden. Dann musst du auch keine Datei anlegen, die du wieder löschen musst.
Delphi-Quellcode:
RemoveFontMemResource ist nur notwendig, wenn du zwischenzeitlich die Schriftart entfernen willst. Wenn der Prozess beendet wird, werden alle Mem-Fonts ebenfalls entladen.
var
FontsCount: DWORD; begin ... FontRes := TResourceStream.Create(hInstance, 'TTF', 'CityFont'); try FontInt := AddFontMemResourceEx(FontRes.Memory, FontRes.Size, nil, @FontsCount); finally FontRes.Free; end; end; |
AW: Win 10 : add/remove Font Resource
Vielen Dank für die flotte Antwort.
Ein Windows Problem also, schon seit Win7, obwohl ich eigentlich immer angenommen hatte vollständig geupdatete Win7 Rechner zu haben. Die Lösung werden wir mal einbauen, und wenn das - wie ich annehme - läuft, dürfen 28 Programme ändern... creehawk Und ich habe dann auch die Quelle (Kernelmodustreiber) mir angesehen Wie bitteschön kommst du jetzt darauf dort zu suchen? Allwissend? Zufall? Vorgehnsweise? |
AW: Win 10 : add/remove Font Resource
Zitat:
Zitat:
Microsoft hat aber auch die Doku zu AddFontResource(Ex) um einen Paragraphen erweitert, der das "Problem" erklärt. EDIT: Am Notebook zu tippen bringt so viele Rechtschreibfehler mit sich. |
AW: Win 10 : add/remove Font Resource
AddFontResourceEx + FR_PRIVATE
und schon deinstalliert Windows den Font automatisch. Font im eigenen Programmverzeichnis und beim Beenden des Programms schmeißt Windows den Font aus dem Speicher. |
AW: Win 10 : add/remove Font Resource
so rufe ich die API auf um einer visuellen komponente eine bestimmte font zuzuordnen.
in diesem beispiel "MS Sans Serif" vielleicht hilft's in anderen projekten aber nicht unbedingt in deinem. Beispiel: var hFont: Integer; { Create Font Handle } hFont := CreateFont(-13, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif'); { set Font } if hFont <> 0 then begin SendMessage( WasSollFontBekommen, WM_SETFONT, hFont, 0); end; ...code... wenn fertig DeleteObject(hFont); |
AW: Win 10 : add/remove Font Resource
Nein, hilft nicht.
Hatte nicht schon jemand als Tipp gegeben dir alles richtig durchzulesen? Es geht hier um Font-Ressourcen und nicht um Fonts, also das Laden/Registrieren einer FONT-Datei und nicht um das Zuweisen eines bereits geladenen Fonts. |
AW: Win 10 : add/remove Font Resource
dann schau hier mal rein:
![]() das ist ein projekt wo man fonts laden bearbeiten speichern kann. |
AW: Win 10 : add/remove Font Resource
Sorry, ich geb's auf.
* es geht nicht um das Erstellen eines Font-Objekts aus einem bereits geladenen Font * es geht um das Laden anschliesende und Benutzen eines Font-Datei/Resource nicht um das Bearbeiten des Fonts * außerdem sind PixelFonts nicht mehr Stand der Zeit und maximal für kleine/pixelige gute lesbare Schriften geeignet besser sind Vektor-Fonts, vorallem bei den immer hochauflösenderen Displays * und k.A. was FTH für Font-Formate sind ... aber ich glaub kaum, dass Windows/Delphi damit was anfangen kann FTH scheint zum Programm ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz