Hallo Gemeinde,
ich hoffe ich gebe mal was brauchbares wieder da ich seit mehreren Stunden, auch mit Hilfe der
DP-Suche zu keinem Ziel gekommen bin.
CodeLib ist ja um Beiträge zu leisten für normal User gesperrt, also erst mal hier rein.
Hier die Ausgangs-Situation:
Man möchte eine Schriftart (in meinem Fall eine .TTF Datei) in die .exe integrieren und logischerweise auch benutzen.
Ich fand sehr viele Beispiele die diese Font irgendwo zwischenspeichern um sie dann zu Nutzen.
Meist waren diese Beispiele mit einer Globalen
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
verbunden.
Das liegt alles weit ab von dem was ich erreichen wollte.
Hier eine mini Anleitung wie man mit Delphi eine Font einbindet und darauf zugreift ohne das die Font irgendwo extern gespeichert werden muss. Vielleicht fallen euch ja noch andere Möglichkeiten ein, da würde ich mich freuen diese Kennenzulernen!
Schritt 1:
Das erzeugen einer .RES Datei, dies ist der wichtigste Schritt, denn ohne den hat man Pustekuchen.
Mir gelingt dies am einfachsten mit einem x-Beliebigen Editor, Notepad++ ist bei mir im Einsatz.
Erzeugt also eine leere Datei mit folgenden Inhalt
FONTNAME FONTS "Name der.ttf"
Dabei steht FONTNAME als Identifizierer innerhalb der Resource.
Dabei steht FONTS als Resourcenverzeichniss.
Und der Dateiname sollte so sein wie er ist, gültig.
Speichert die Datei als "MyFonts.rc" ab.
Öffnet eine CMD und gebt
BRCC32 MyFonts.rc
ein plus Eingabetaste.
Wenn alles gut gegangen ist hat man nun eine "MyFonts.res" Datei, yippieh!
-Schritt 1 = erledigt
Schritt 2:
Öffnet ein Projekt wo ihr die Font braucht oder fangt ein komplett neues an, beides geht.
Unter der Zeile
implementation
fügt ihr diese Zeile ein
{$R MyFont.res}
Damit landet die Font auch in der .exe, ohne das geht nichts.
-Schritt 2 = erledigt
Schritt 3:
Jetzt muss man Windows und der Anwendung auch irgendwie mitteilen das es diese Font überhaupt gibt, ich mache es so:
Das hier wird global gebraucht, ich habs in der Class Definition drinnen:
Delphi-Quellcode:
private
{ Private declarations }
FontHandle: THandle;
public
Hier der Helfer der die Font einbindet:
Delphi-Quellcode:
function LoadResourceFontByName(const ResourceName: string; ResType: PWideChar): THandle;
var
ResStream : TResourceStream;
FontsCount : DWORD;
begin
ResStream := TResourceStream.Create(hInstance, ResourceName, ResType);
try
Result := AddFontMemResourceEx(ResStream.Memory, ResStream.Size, nil, @FontsCount);
finally
ResStream.Free;
end;
end;
Im Konstruktor die Font Laden:
(als Anwendungsbeispiel habe ich ein Label genommen)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
FontHandle := LoadResourceFontByName('FONTNAME', 'FONTS');
if FontHandle <> 0 then Label1.Font.Name := 'Wie lautet der Name der Font?';
end;
Im Destruktor die Font freigeben:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveFontMemResourceEx(FontHandle);
end;
Das wars auch schon, 3 kleine Schritte und man ist am Ziel.
Viel Spaß dabei!
Ps:
mit
Label1.Font.Name := 'Wie lautet der Name der Font?';
ist weder der Dateiname noch der Resourcenname gemeint, sondern der Name der Fest in der .TTF hinterlegt ist! (am einfachsten für mich jedenfalls, mit TotalCommander auf .TTF Datei gehen und F3 drücken, da unter "Font bzw ID" schauen, je nach dem)
Hinweis:
Wenn man die geladene Font im kompletten Programm haben/nutzen möchte, sollte man
if FontHandle <> 0 then Font.Name := 'Wie lautet der Name der Font?';
es so im Konstruktor anmelden und alle Komponenten die diese auch bekommen sollen, müßten
ParentFont = True
in deren Property stehen haben.