Einzelnen Beitrag anzeigen

philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
862 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: eigene Font-Datei über die Deployment-Liste via msix-Datei installieren lassen

  Alt 23. Aug 2022, 21:11
Seit ich dies mache, habe ich ein instabiles Anwendungsverhalten (wobei ich es nicht 100% auf die Font-Datei beziehen kann). Manchmal beendete sich die App nicht 100% und dann war die Font-Datei auch blockiert, manchmal dauerte es ewig, bis die App wirklich startete. Und die Hauptanpassung in der betroffenen Version war der eigene Font, den ich folgendermaßen eingebunden hatte:

Delphi-Quellcode:
unit ChangeDefaultFont;

interface
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  {$IFDEF MSWINDOWS}
    WinAPI.Messages,
    WinAPI.Windows,
  {$ENDIF}
  FMX.graphics;

type
  TDefaultFont = class (TInterfacedObject, IFMXSystemFontService)
  public
    function GetDefaultFontFamilyName: string;
    function GetDefaultFontSize: Single;
    class procedure uninstallFont();
    constructor create();

end;

implementation

constructor TDefaultFont.create();
{$IFDEF MSWINDOWS}
var wStr:WideString;
    pWStr:PWideChar;
{$ENDIF}
begin
  {$IFDEF MSWINDOWS}
    wStr:=ExtractFilePath(ParamStr(0))+'Font.ttf';
    pwstr:=PWideChar(wStr);
    AddFontResource(pwstr);
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
    freemem(pWStr);
  {$ENDIF}
end;

class procedure TDefaultFont.uninstallFont();
{$IFDEF MSWINDOWS}
var wStr:WideString;
    pWStr:PWideChar;
{$ENDIF}
begin
  {$IFDEF MSWINDOWS}
    wStr:=ExtractFilePath(ParamStr(0))+'Font.ttf';
    pwstr:=PWideChar(wStr);
    RemoveFontResource(pwstr);
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
    freemem(pWStr);
  {$ENDIF}
end;

function TDefaultFont.GetDefaultFontFamilyName: string;
begin
  Result := 'Inter';
end;

function TDefaultFont.GetDefaultFontSize: Single;
begin
  Result := 13.0;
end;

initialization
   TFont.FontService := TDefaultFont.Create;
end.
Vielleicht reicht es ja auch aus, dies einmalig zu laden und auf das uninstallFont zu verzichten. Für den Installer habe ich jetzt den Font per Innosetup reingenommen und für die msix-Version scheint es eine genehmigungspflichtige Anpassung der AppxManifest.template.xml-Datei zu sein:

Code:
     
      xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4"
      ...
      <Extensions>
         <uap4:Extension Category="windows.sharedFonts">
           <uap4:SharedFonts>
             <uap4:Font File="Inter.ttf"/>
           </uap4:SharedFonts>
         </uap4:Extension>
      </Extensions>
Zumindest habe ich den Code für das dynamische Laden und Entladen entfernt um zu sehen, ob dies das Problem auslöst.

Grüße, Philipp
  Mit Zitat antworten Zitat