2014-07-22 127 views
0

我正在构建具有附加字体(Abilene)的跨平台桌面应用程序。在启动时我检查是否安装了字体,如果没有,我安装并使用它。对于Mac,一切似乎都很好,但Windows版本(和IDE !!)不能正确显示字体。下面是字体的安装过程:Delphi Firemonkey无法正确显示字体

procedure InstallFont; 
const 
    REG_NT = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts'; 

var 
    Reg: TRegistry; 
    res: Boolean; 
    installName,FileName: UnicodeString; 

begin 
    Reg := TRegistry.Create(KEY_ALL_ACCESS); 
    try 
    Reg.RootKey := HKEY_LOCAL_MACHINE; 
    res := Reg.OpenKey(REG_NT, False); 
    if not Res then Exit; 

    installName := 'Abilene Regular (TrueType)'; 
    FileName:=ExtractFilePath(ParamCount(0)+'\Abilene.ttf'; 
    Reg.WriteString(installName, FileName); 
    Reg.CloseKey; 
    finally 
    Reg.Free; 
    end; 

    AddFontResourceW(PWideChar(FileName)); 
    SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0); 
end; 

安装字体后,显示为在控制面板的快捷方式,但所有其他程序可以使用它。即使是Delphi,也可以使用VCL,而不是FMX应用程序(请参阅附图)。我附加了来自IDE的图片。在运行时它是一样的。

对于字体安装,特别是对于FMX应用程序,还有什么必须额外完成的吗?或者这只是一个必须向Embarcaderro QC报告的错误?

FMX IDE

VCL IDE

编辑:添加一些细节:如果我通过下载它,用鼠标右键单击安装的字体,然后选择“安装”,那么一切都OK。如果我通过我的proc安装它,那么除了Delphi FMX外,字体对整个世界都是可见的和可用的。 Delphi VCL也可以使用它。为了测试这个,我在我的%APPDATA%文件夹中安装了我的proc字体。 Word,Excel,Delphi VCL都可以使用它。德尔福FMX不能。

编辑2:添加了SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0)。不用找了。

EDIT3:在字体对话框的字体正确显示图像(见图3) enter image description here

+0

这似乎对我来说都是错的。您将强制应用程序在用户每次运行时向用户显示UAC对话框,以便它可以只执行一次字体安装?将字体安装到您的安装程序中。至于FMX的具体问题,我认为这与安装权无关?即使你手动安装它,你的程序之外,你是说FMX将无法正确显示它?或者只有当您从程序安装字体时才会出现问题? –

+0

我首先检查的是安装的字体,即如果在注册表中存在关键的Abilene Regular(TrueType),则该程序仅被跳过。 – LHristov

+0

如果我从向导安装字体并且从不检查它,用户可以通过控制面板将其卸载 – LHristov

回答

0

显然,这是某种错误的,因为我已经找到了一个解决办法:如果我先字体复制到%WINDIR %\ Fonts文件夹,然后一切正常。即使我创建了\ windows \ fonts文件夹的子文件夹并将其中的字体复制到其中,也一切正常。

为什么Firemonkey不想在该文件夹之外显示字体我不知道。正如我所说,这仅适用于Windows。 Mac OS可以(我使用〜/ Library/Fonts)。

+0

你意识到你的程序需要提升权限吗? –

+0

是的,它的确如此。如果字体丢失,则强制重新安装(也可使用高程)。 – LHristov

+2

我明白你的观点。为什么用户需要一次通过UAC对话框,每次程序执行时都可以让用户浏览一遍? –