![]() |
Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
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
Delphi-Quellcode:
verbunden.
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
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
Delphi-Quellcode:
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
Delphi-Quellcode:
ein plus Eingabetaste.
BRCC32 MyFonts.rc
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
Delphi-Quellcode:
fügt ihr diese Zeile ein
implementation
Delphi-Quellcode:
{$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:
Hier der Helfer der die Font einbindet:
private
{ Private declarations } FontHandle: THandle; public
Delphi-Quellcode:
Im Konstruktor die Font Laden:
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; (als Anwendungsbeispiel habe ich ein Label genommen)
Delphi-Quellcode:
Im Destruktor die Font freigeben:
procedure TForm1.FormCreate(Sender: TObject);
begin FontHandle := LoadResourceFontByName('FONTNAME', 'FONTS'); if FontHandle <> 0 then Label1.Font.Name := 'Wie lautet der Name der Font?'; end;
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
Delphi-Quellcode:
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)
Label1.Font.Name := 'Wie lautet der Name der Font?';
Hinweis: Wenn man die geladene Font im kompletten Programm haben/nutzen möchte, sollte man
Delphi-Quellcode:
es so im Konstruktor anmelden und alle Komponenten die diese auch bekommen sollen, müßten
if FontHandle <> 0 then Font.Name := 'Wie lautet der Name der Font?';
Delphi-Quellcode:
in deren Property stehen haben.
ParentFont = True
|
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Ich habe direkt eine Frage zu Schritt 1 und 2:
Kann man nicht genauso Datei -> Neu -> Textdatei -> .rc-Datei und es dort hineinschreiben? Damit gehört die Datei zum Projekt und die IDE kümmert sich bei jedem Kompilieren darum dass die .res-Datei vorliegt. |
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Superwichtig, macht Euch im VORFELD von dem Copyright & Bedingungen der Font schlau, man darf nicht alles einfach so machen!
|
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Zitat:
Jeder hat da so seine Vorlieben wie was womit usw, ich nannte halt die Methode die für mich Okay ist. |
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Die Variable FontsCount ist überhaupt nicht initialisiert! :warn:
|
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Zitat:
Delphi-Quellcode:
sogar zweimal :-D Ne glaube aber
FontHandle
Delphi-Quellcode:
ist ein reiner
FontsCount
Delphi-Quellcode:
Parameter, also muss nicht zwingend initialisiert werden.
out
|
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Nun ja, man findet schon etwas
![]() ![]() |
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Zitat:
Zitat:
Zitat:
|
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Ich finde es unnötig Fonts in die Resource einzubinden bin da lieber flexibel falls ich ihn doch mal schnell ändern möchte.
Aber wie du sagst jedem das sein. Ich erstelle den Font indirekt ohne ihn extra zu registrieren und verwende ihn dann. Besser wäre auch noch den Font Namen selbst zurückzugeben anstatt ihn zu übergeben.
Delphi-Quellcode:
function GDIP_PrivateFontCollection(var FontCollection: Pointer
): GPSTATUS; stdcall; begin PrvFontCollection := TGPPrivateFontCollection.Create; FontCollection := PrvFontCollection.nativeFontCollection; result:= PrvFontCollection.GetLastStatus; end;
Delphi-Quellcode:
function GDIP_PrivateAddFontFile(filename: PWideChar
): GPSTATUS; stdcall; begin result := PrvFontCollection.AddFontFile(filename); end;
Delphi-Quellcode:
function GDIP_GdipGetFontCollectionFamilyCount(var count: Integer
): GPSTATUS; stdcall; begin count := PrvFontCollection.GetFamilyCount; result:= PrvFontCollection.GetLastStatus; end;
Delphi-Quellcode:
function GDIP_FontFamilyCreate(Count: Integer; var pFontFamily: array of TGPFontFamily
): GPSTATUS; stdcall; var numFound: Integer; FontFamily: array of TGPFontFamily; begin SetLength(FontFamily, Count + 1); FontFamily[Count] := TGPFontFamily.Create; result:= FontFamily[Count].GetLastStatus; GDIP_GetFamilies(Length(FontFamily), FontFamily, numFound); pFontFamily[Count] := FontFamily[Count]; end;
Delphi-Quellcode:
function GDIP_GetFamilies(numSought: Integer; out gpfamilies: array of TGPFontFamily;
out numFound: Integer ): GPSTATUS; stdcall; begin result := PrvFontCollection.GetFamilies(numSought, gpfamilies, numFound); end;
Delphi-Quellcode:
Bsp.
function TSkinEngine.LoadPrivateFontCollection(Path: string; var FontCollection: Pointer;
var FontName: string ): GPSTATUS; stdcall; var i: integer; Count: integer; gFontFamily: array of TGPFontFamily; begin Result := GenericError; if FileExists(Path) then begin GDIP_PrivateFontCollection(FontCollection); GDIP_PrivateAddFontFile(PWideChar(Path)); GDIP_GdipGetFontCollectionFamilyCount(Count); SetLength(gFontFamily, Count + 1); for i := 0 to Count - 1 do GDIP_FontFamilyCreate(i, gFontFamily); for i := 0 to count - 1 do // Get the font family name. gFontFamily[i].GetFamilyName(FontName); Result := OK; end; end;
Delphi-Quellcode:
gruss
if not Assigned(TTFCaption) then
GDIP_LoadPrivateFontCollection(SpriteResPath + 'lcd.ttf', TTFCaption, FontCaption); |
AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.
Stimmt, ich habe
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz