2016-03-25 18 views
-2

Ich habe ein Delphi XE-Projekt mit der folgenden Ressource:Laden Schriftart aus Ressourcendatei

Project1

I function LoadResourceFont und versuchte den folgenden Code verwendet haben:

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. 

By the way : Ich weiß, dass ich Redistributionsrechte für die Schriftart haben sollte, wenn ich es in meine EXE-Datei einbetten muss.

Aber das Problem ist, dass, wenn der Schriftname (I My Custom Font1, My Custom Font2 verwendet habe) ist nicht der tatsächliche Name der Schriftart, wird die Schriftart nicht richtig geladen und zeigt eine unbekannte Schrift Charakter.

Meine Frage ist, ob obwohl ich ResStream.Free in dem founctions verwendet habe, aber ich habe wieder definieren FormClose und FormDestroy Ereignis Speicher Leakage oder nicht zu schützen?

+0

'Label2.Font [2]' warum sollte es kompilieren? Was soll diese Aussage bedeuten? –

+0

Ich brauche, dass Label1 Schriftart aus RCDATA Typ Resource geladen werden sollte und Label2 Font sollte von FONT Type Resource geladen werden. –

+0

Wie wäre es mit den Definitionen Ihrer Funktionen? Das stoppt die Zuweisung von booleschen Zeichenfolgen. Es wird Ihnen auch sagen, was mit den Rückgabewerten Ihrer Funktionen zu tun ist. –

Antwort

0

Label.Font hat keine tiefgestellten Zeichen, daher ist Label2.Font[2] ungültig.

Auch funktioniert offenbar nicht zu einer Label.Font jeglicher Art, die boolean Ergebnis Ihrer LoadFontResource Funktion zuweisen, so dass boolean Ergebnis wird nie eine Schrift sein.

Ich würde vorschlagen, dass Sie die Grundlagen der Programmierung mit Delphi lernen und auch die VCL/FMX-Dokumentation für TFont studieren, bevor Sie sich über das Laden von benutzerdefinierten Schriftarten aus dem Speicher Gedanken machen.

+2

Ich bin mir nicht sicher, ob das wirklich die Frage beantwortet. –

+0

Wirklich das ist mein Problem nicht gelöst. Ich muss meinen Code kompilieren und korrekt arbeiten. –

+4

@Rob: Die Frage sagt * Ich bin nicht in der Lage zu kompilieren *. Ich erklärte, warum es nicht kompilieren wird - es ist ungültiger Code für die Gründe, die ich beschrieb. Es gibt keine andere Frage oder Problem beschrieben (der Titel tut auch nicht). –

2

Ihr Code enthält mehrere Fehler.

  1. LoadResourceFont() gibt ein Boolean. Sie versuchen, diesen Wert der TLabel.Font.Name-Eigenschaft zuzuweisen, die Sie nicht ausführen können, da eine keine String ist. Sie versuchen auch, die Boolean einer TLabel.Font[2]-Eigenschaft zuzuweisen, die nicht einmal eine gültige Kennung ist, der ein Wert zugewiesen werden soll.

  2. Ihr erster Anruf an LoadResourceFont() gibt den falschen Ressourcennamen an.

  3. Der erste Parameter von LoadResourceFont() ist ein String, aber Ihr zweiter Aufruf von LoadResourceFont() versucht, den global Hinstance Variable (ein THandle) zu passieren, wo ein String erwartet wird.

  4. Sie versuchen, die zweite Schriftart als RCDATA-Ressource zu laden, wenn es sich tatsächlich um eine FONT-Ressource handelt.

zu tun, was Sie versuchen, müssen Sie LoadResourceFont() zuerst nennen die Schriftart (en) in der Schriftart-Tabelle zu laden, und dann können Sie die TLabel.Font.Name an die Schrift Namen der gewünschten Schriftart (den Namen gesetzt definiert in der TTF-Datei, nicht der Dateiname oder Ressourcenname), zB:

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

Ich vermute, dass dies nicht funktioniert, da AddFontMemResourceEx so aussieht, als würde es einen Pseudo-Handle abrufen. Denken Sie darüber nach, wenn die Anzahl der Zeichen größer als 1 ist, welches Zeichen der Schriftart zurückgegeben wird. Auch RemoveFontMemResourceEx ruft den Handle "ein Handle zu einer Font-Ressource" auf, was meiner Meinung nach genauer ist. –

+0

@SertacAkyuz: Danke, ich habe meine Antwort aktualisiert. –

+0

@Sertac Akyuz: Sie haben absolut Recht. Erste Chance Ausnahme bei $ 75965B68. Ausnahmeklasse EResNotFound mit der Nachricht 'Ressource 2 nicht gefunden'. Process1.exe (19900) und der Label2-Font werden ebenfalls nicht geladen. –

Verwandte Themen