【问题标题】:Delphi Firemonkey does not display fonts correctlyDelphi Firemonkey 无法正确显示字体
【发布时间】:2014-07-22 07:56:05
【问题描述】:

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

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 报告的错误?

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

Edit2:添加了 SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0)。没有变化。

Edit3:在“字体”对话框中,字体显示正确(图 3)

【问题讨论】:

  • 这对我来说似乎全错了。您将强制您的应用程序在每次运行时向用户显示 UAC 对话框,以便它可以只安装一次字体?将字体安装到您的安装程序中。至于FMX的具体问题,我认为这与安装无关吗?即使您在程序之外手动安装它,您是说 FMX 无法正确显示它?还是只有从程序中安装字体时才会出现问题?
  • 我首先检查是否安装了字体,即如果注册表中存在密钥 Abilene Regular (TrueType),则跳过该过程。
  • 如果我从向导安装字体并且从不检查它,用户可以从控制面板卸载它
  • 同样,每次运行程序时,您都会将 UAC 对话框强制发送给您的用户。你没有回答我提出的任何问题。
  • @LHristov 没有人将安装程序写入程序。如果用户从你的程序中删除了一个重要的组件,那是他们的错。用户只需进行修复安装即可修复它。听起来你需要换个新老板。

标签: windows delphi firemonkey delphi-xe4


【解决方案1】:

显然这是某种错误,因为我找到了一种解决方法:如果我首先将字体复制到 %windir%\Fonts 文件夹,那么一切正常。即使我创建了 \windows\fonts 文件夹的子文件夹并将字体复制到其中,一切也都很好。

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

【讨论】:

  • 您意识到您的程序需要提升对吗?
  • 是的,确实如此。如果字体丢失,最好不要强制重新安装(也有高度)。
  • 我明白你的意思。为什么要让用户在每次程序执行时都通过一次 UAC 对话框?
  • 我也明白你的意思,但是我已经对删除这个和那个的用户有问题,所以我首先检查所有资源是否到位。我会尝试将安装过程移动到另一个应用程序,这可能就足够了。
  • 我会说你这样做是错误的。如果用户删除了您安装的字体,那么他们就应该这样做。正如我多次说过的,我相信你弄错了。不过我也没什么好说的了。我想我的观点是正确的。
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2017-12-25
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多