从资源文件加载字体

时间:2016-03-25 17:15:15

标签: delphi delphi-xe

我正在使用以下资源的Delphi XE项目:

Project1

我使用了function LoadResourceFont并尝试了以下代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function LoadResourceFontByName( const ResourceName : string; ResType: PChar ) : Boolean;
var
  ResStream  : TResourceStream;
  FontsCount : DWORD;
begin
  ResStream := TResourceStream.Create(hInstance, ResourceName, ResType);
  try
    Result  := (AddFontMemResourceEx(ResStream.Memory, ResStream.Size, nil, @FontsCount) <> 0);
  finally
    ResStream.Free;
  end;
end;

function LoadResourceFontByID( ResourceID : Integer; ResType: PChar ) : Boolean;
var
  ResStream  : TResourceStream;
  FontsCount : DWORD;
begin
  ResStream := TResourceStream.CreateFromID(hInstance, ResourceID, ResType);
  try
    Result  := (AddFontMemResourceEx(ResStream.Memory, ResStream.Size, nil, @FontsCount) <> 0);
  finally
    ResStream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if LoadResourceFontByName('MyFont1', RT_RCDATA) then Label1.Font.Name := 'My Custom Font1';
  if LoadResourceFontByID(2, RT_FONT) then Label2.Font.Name := 'My Custom Font2';   
end.

顺便说一下:如果我需要将其嵌入到我的EXE文件中,我知道我应该有字体的再分配权。

但问题是,如果字体名称(我使用我的自定义字体1 我的自定义字体2 )不是字体的实际名称,则字体确实如此没有正确加载并显示未知的字体字符。

我的问题是,虽然我在功能中使用了 ResStream.Free ,但我必须再次定义 FormClose FormDestroy 保护内存泄漏的事件?

2 个答案:

答案 0 :(得分:3)

您的代码中有多处错误。

  1. export default { filters: { reverse: function(value) { return value.split('').reverse().join(''); } } }; 返回LoadResourceFont()。您正尝试将该值分配给Boolean属性,由于TLabel.Font.Name不是Boolean,因此您无法执行此操作。您还尝试将String分配给Boolean属性,该属性甚至不是为其分配值的有效标识符。

  2. 您第一次拨打TLabel.Font[2]时指的是错误的资源名称。

  3. LoadResourceFont()的第一个参数是LoadResourceFont(),但您对String的第二次调用是尝试传递全局LoadResourceFont()变量({{1} }})预期Hinstance

  4. 您尝试将第二种字体作为RCDATA资源加载,而实际上它是FONT资源。

  5. 要执行您尝试的操作,您需要先调用THandle将字体加载到字体表中,然后将String设置为所需的字体名称font(在TTF文件中定义的名称,而不是文件名或资源名称),例如:

    LoadResourceFont()

答案 1 :(得分:0)

Label.Font没有下标,因此Label2.Font[2]无效。

此外,将LoadFontResource函数的布尔结果分配给任何类型的Label.Font显然不起作用,因为该布尔结果永远不会是字体。 / p>

我建议您学习使用Delphi进行编程的基础知识,并在担心从内存加载自定义字体之前,先研究TFont的VCL / FMX文档。