2016-03-25 2 views
-2

私は、次のリソースでのDelphi XEのプロジェクトを抱えています:私はfunction LoadResourceFontを使用し、次のコードを試してみましたロードフォント

Project1

:ところで

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ファイルに埋め込む必要がある場合、フォントの再配布権を持っているべきであることを知っています。

しかし、問題は、フォント名は(私はマイカスタムFont1マイカスタムfont2でを使用していた)フォントの実際の名前ではない場合、フォントが正しくロードされ、未知のフォントを示していないということですキャラクター。

私の質問は、しかしかどうか、私はfounctionsにResStream.Freeを使用していたということです、まだ私はメモリー・リークかどうかを保護するために再びFormCloseFormDestroyイベントを定義する必要がありますか?

+0

'Label2.Font [2]'なぜそれをコンパイルする必要がありますか?ファイル名またはリソース名ではなく、TTFファイル内で定義します。その声明が意味するものは何ですか? –

+0

私は、Label1のフォントをRCDATAタイプのリソースからロードする必要があり、Label2のフォントはFONTタイプのリソースからロードする必要があります。 –

+0

あなたの関数の定義を調べるのはどうですか?それはストリングにブール値を割り当てるのを止めるでしょう。また、関数の戻り値をどのように伝えるかを示します。 –

答えて

0

Label.Fontには添え字がないため、Label2.Font[2]は無効です。そのブール結果はフォントになることはありませんよう

また、いかなる種類のLabel.FontにごLoadFontResource関数のboolean型の結果を割り当てることが明らかに、機能しません。

Delphiを使用したプログラミングの基礎を学び、メモリからカスタムフォントを読み込む前にTFontのVCL/FMXドキュメントを調べることをお勧めします。

+2

これは本当に質問に答えているのか分かりません。 –

+0

これは本当に私の問題を解決していません。コンパイルしてコードを正しく動作させる必要があります。 –

+4

@Rob:質問によれば*私はコンパイルできません。私はそれがなぜコンパイルされないのか説明しました - 私が記述した理由のために無効なコードです。尋ねられた他の質問や問題はありません(タイトルはどちらもありません)。 –

2

あなたのコードにはいくつかのエラーがあります。

  1. LoadResourceFont()Boolean返します。その値をTLabel.Font.Nameプロパティに割り当てようとしていますが、BooleanStringではないため、できません。 BooleanTLabel.Font[2]プロパティに割り当てようとしています。これは値を割り当てるための有効な識別子でもありません。

  2. 最初にLoadResourceFont()を呼び出すと、間違ったリソース名が指定されています。 LoadResourceFont()

  3. 最初のパラメータはStringですが、LoadResourceFont()にあなたの2番目の呼び出しはStringが期待されているグローバル変数HinstanceTHandle)を通過しようとしています。

  4. 実際にFONTリソースである場合、2番目のフォントをRCDATAリソースとして読み込もうとしています。

はあなたがしようとしている何を行うには、(名前を、あなたは、フォントテーブルにフォントをロードする LoadResourceFont()が最初に呼び出す必要があり、その後、あなたは希望するフォントの書体名に TLabel.Font.Nameを設定することができます

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 Font Name 1'; 

    if LoadResourceFontByID(2, RT_FONT) then 
    Label2.Font.Name := 'My Font Name 2'; 
end; 
+0

疑似ハンドルを取得するようなAddFontMemResourceExのように見えますが、これはうまくいかないと思います。フォントカウントが1より大きい場合、どのフォントのハンドルが返されるかを考えてください。また、RemoveFontMemResourceExはハンドル "フォントリソースへのハンドル"を呼び出します。これはより正確です。 –

+0

@SertacAkyuz:ありがとう、私は私の答えを更新しました。 –

+0

@Sertac Akyuz:あなたは絶対に正しいです。 $ 75965B68での最初のチャンスの例外。例外クラスEResNotFoundに 'リソース2が見つかりません'というメッセージが表示されます。 Project1.exe(19900)を処理し、Label2フォントも読み込まれません。 –