AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Win 10 : add/remove Font Resource

Win 10 : add/remove Font Resource

Ein Thema von creehawk · begonnen am 2. Dez 2017 · letzter Beitrag vom 17. Jan 2018
Antwort Antwort
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
228 Beiträge
 
Delphi 10.4 Sydney
 
#1

Win 10 : add/remove Font Resource

  Alt 2. Dez 2017, 17:20
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:
//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);
....
Soweit so schön, klappt(e) anstandslos. Also bisher, in diesem Fall mit Delphi7 und in Win7.

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.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.479 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Win 10 : add/remove Font Resource

  Alt 2. Dez 2017, 17:48
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:
Nach der Installation dieses Sicherheitsupdates können Schriftarten, die in einem anderen Verzeichnis als dem Standardverzeichnis für Schriften (%windir%\fonts\) installiert wurden, nicht verändert werden, wenn sie in eine aktive Sitzung geladen werden. Versuche, diese Schriftarten zu ändern, zu ersetzen oder zu löschen, werden blockiert, und die Meldung "Datei wird verwendet" wird angezeigt.
Quelle


Du kannst aber anstatt AddFontResource die Funktion AddFontMemResourceEx verwenden. Dann musst du auch keine Datei anlegen, die du wieder löschen musst.

Delphi-Quellcode:
var
  FontsCount: DWORD;
begin
  ...
  FontRes := TResourceStream.Create(hInstance, 'TTF', 'CityFont');
  try
    FontInt := AddFontMemResourceEx(FontRes.Memory, FontRes.Size, nil, @FontsCount);
  finally
    FontRes.Free;
  end;
end;
RemoveFontMemResource ist nur notwendig, wenn du zwischenzeitlich die Schriftart entfernen willst. Wenn der Prozess beendet wird, werden alle Mem-Fonts ebenfalls entladen.

Geändert von jbg ( 2. Dez 2017 um 18:19 Uhr)
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
228 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Win 10 : add/remove Font Resource

  Alt 2. Dez 2017, 18:53
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?

Geändert von creehawk ( 2. Dez 2017 um 18:56 Uhr)
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.479 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Win 10 : add/remove Font Resource

  Alt 2. Dez 2017, 19:22
Ein Windows Problem also
Kein "Problem", ein Sicherheitsupdate, dass das Überschreiben von fremdgeladenen Font-Dateien unterbindet, indem das System die Datei sperrt.

Zitat:
Wie bitteschön kommst du jetzt darauf dort zu suchen? Allwissend? Zufall? Vorgehnsweise?
Natürlich "Allwissend". Da ich den Patch in IDE Fix Pack eingebaut (und auch bei XE den Alternativ-Code beigesteuert) habe, was ursprünglich eine Performance Optimierung war, weiß ich vom AddFontResource Problem. Und dann einfach mal bei Google danach suchen und man bekommt die Seite mehr oder weniger per Zufall.
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.

Geändert von jbg ( 2. Dez 2017 um 19:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Win 10 : add/remove Font Resource

  Alt 3. Dez 2017, 20:21
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#6

AW: Win 10 : add/remove Font Resource

  Alt 15. Jan 2018, 13:59
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);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: Win 10 : add/remove Font Resource

  Alt 15. Jan 2018, 14:24
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#8

AW: Win 10 : add/remove Font Resource

  Alt 16. Jan 2018, 22:10
dann schau hier mal rein:

https://github.com/flaith-nycd/pascal-fontmaker/

das ist ein projekt wo man fonts laden bearbeiten speichern kann.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

AW: Win 10 : add/remove Font Resource

  Alt 17. Jan 2018, 01:18
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 Bei Google suchenFileMaker zu gehören ... sonst war nichts zu finden
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Jan 2018 um 18:53 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz