Font Datei.ttf

Für Installationen unter Windows
hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Font Datei.ttf

Beitrag von hbr »

Hallo,
gibt es für Windows Programierte Programme eine Möglichkeit
*.ttf Schriftdateien in einem Lazarus Programm einzubinden?

Gruß

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Font Datei.ttf

Beitrag von af0815 »

Mit der Forumssuche unter "font einbinden" finde ich mal das:
https://lazarusforum.de/viewtopic.php?f ... +einbinden
und weiteres. Ist damit deine Frage beantwortet ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Nein,
das habe ich schon gelesen und nicht verstanden.
Das bezieht sich alles auf Linux.

Kann man eine nicht installierte Schrift in ein LZ Programm (wie z.B. ein .po Datei) einbinden?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Font Datei.ttf

Beitrag von af0815 »

hbr hat geschrieben:
Mo 22. Aug 2022, 17:02
Das bezieht sich alles auf Linux.
Erster Post - der Link bezieht sich auf Windows Only Lösungen.
Zitat:
My question is this: How can one do the same without using AddFontMemResourceEx, since it's Windows only, under a Linux OS?
Dort wird auch auf https://stackoverflow.com/questions/298 ... -in-delphi verwiesen.

Ich verwende einen Installer um die Dateien korrekt zu installieren, dazu gehören auch Schriftarten, Vorlagen etc. Mit Fonts ist es so wie mit Bildern, man muss verdammt auf die Copyrigths aufpassen. Nur einfach einen Font einbetten ist nicht so, nur so nebenbei.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Vielen Danke, gesehen,
aber sehr kompliziert.

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Font Datei.ttf

Beitrag von wp_xyz »

Warum muss der Font in die Exe eingebunden werden? Wenn das ein spezieller Font ist, der benötigt wird, liefere ihn zusammen mit deiner Anwendung aus, schreibe einen Installer, z.B. mit InnoSetup, und installiere ihn zusammen mit der Anwendung regulär in Windows, ggfs mit den nötigen Rechten. Dann muss sich dein Programm nicht mehr darum kümmern.

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Ist halt ein Programm welches ab XP von einem Stick läuft, welches keinerlei Spuren auf dem Rechner hinterlässt, es soll auch nichts installiert werden.

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

AddFontMemResourceEx() kommt auch nicht in Frage, weil es erst ab Win2000 laufen soll, ich weis aber auch nicht in welcher Unit sich es befinden soll.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Font Datei.ttf

Beitrag von af0815 »

Sorry, aber wenn du auf Plattformen arbeiten willst, die vor Win7 sind, so wird es eng. Dann solltest du keine Kunststücke mehr betreiben wie eigene Fonts etc.
Wenn aber geforderrt, dann solltest du mal suchen was es vor AddFontMemResourceEx gegeben hat.

Hier siehst du ev. wie man Windows sagt wo ein Font liegt https://www.delphipraxis.net/409574-post.html#483417 . Dann kannst du den Font auch am USB-Stick haben, nur Windows sagen, das dort ein Font ist mittels AddFontResourceA laden soll.
Info: https://docs.microsoft.com/en-us/window ... tresourcea

Das müsste alles in der Unit windows sein.
Wenn ich dannach suche finde ich es hier:
C:\Data\lazdev\fpcsrc\packages\winunits-jedi\src\jwawingdi.pas 386 KB PAS-Datei 17.11.2021 13:16:00 17.11.2021 13:16:00 22.05.2022 09:04:11 54
4534 function AddFontResourceA(lpszFileName: LPCSTR): Integer; stdcall;
4535 {$EXTERNALSYM AddFontResourceA}
4536 function AddFontResourceW(lpszFileName: LPCWSTR): Integer; stdcall;
4537 {$EXTERNALSYM AddFontResourceW}
4538 function AddFontResource(lpszFileName: LPCTSTR): Integer; stdcall;
4539 {$EXTERNALSYM AddFontResource}
5087 function AddFontResourceExA(lpszFilename: LPCSTR; fl: DWORD; pdv: PVOID): Integer; stdcall;
5088 {$EXTERNALSYM AddFontResourceExA}
5089 function AddFontResourceExW(lpszFilename: LPCWSTR; fl: DWORD; pdv: PVOID): Integer; stdcall;
5090 {$EXTERNALSYM AddFontResourceExW}
5091 function AddFontResourceEx(lpszFilename: LPCTSTR; fl: DWORD; pdv: PVOID): Integer; stdcall;
5092 {$EXTERNALSYM AddFontResourceEx}
7870 _AddFontResourceA: Pointer;
7872 function AddFontResourceA;
7874 GetProcedureAddress(_AddFontResourceA, gdi32, 'AddFontResourceA');
7878 JMP [_AddFontResourceA]
7883 _AddFontResourceW: Pointer;
7885 function AddFontResourceW;
7887 GetProcedureAddress(_AddFontResourceW, gdi32, 'AddFontResourceW');
7891 JMP [_AddFontResourceW]
7896 _AddFontResource: Pointer;
7898 function AddFontResource;
7900 GetProcedureAddress(_AddFontResource, gdi32, 'AddFontResource' + AWSuffix);
7904 JMP [_AddFontResource]
10054 _AddFontResourceExA: Pointer;
10056 function AddFontResourceExA;
10058 GetProcedureAddress(_AddFontResourceExA, gdi32, 'AddFontResourceExA');
10062 JMP [_AddFontResourceExA]
10067 _AddFontResourceExW: Pointer;
10069 function AddFontResourceExW;
10071 GetProcedureAddress(_AddFontResourceExW, gdi32, 'AddFontResourceExW');
10075 JMP [_AddFontResourceExW]
10080 _AddFontResourceEx: Pointer;
10082 function AddFontResourceEx;
10084 GetProcedureAddress(_AddFontResourceEx, gdi32, 'AddFontResourceEx' + AWSuffix);
10088 JMP [_AddFontResourceEx]
13214 function AddFontResourceA; external gdi32 name 'AddFontResourceA';
13215 function AddFontResourceW; external gdi32 name 'AddFontResourceW';
13216 function AddFontResource; external gdi32 name 'AddFontResource' + AWSuffix;
13382 function AddFontResourceExA; external gdi32 name 'AddFontResourceExA';
13383 function AddFontResourceExW; external gdi32 name 'AddFontResourceExW';
13384 function AddFontResourceEx; external gdi32 name 'AddFontResourceEx' + AWSuffix;

C:\Data\lazdev\fpcsrc\rtl\win\wininc\ascdef.inc 62 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 22.06.2022 14:23:35 2
297 function AddFontResource(_para1:LPCSTR):longint; external 'gdi32' name 'AddFontResourceA';

C:\Data\lazdev\fpcsrc\rtl\win\wininc\ascfun.inc 64 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 22.06.2022 14:23:35 2
300 function AddFontResourceA(_para1:LPCSTR):longint; external 'gdi32' name 'AddFontResourceA';

C:\Data\lazdev\fpcsrc\rtl\win\wininc\unidef.inc 62 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 17.11.2021 13:16:01 2
298 function AddFontResource(_para1:LPCWSTR):longint; external 'gdi32' name 'AddFontResourceW';

C:\Data\lazdev\fpcsrc\rtl\win\wininc\unifun.inc 65 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 22.06.2022 14:23:35 2
297 function AddFontResourceW(_para1:LPCWSTR):longint; external 'gdi32' name 'AddFontResourceW';

C:\Data\lazdev\fpcsrc\rtl\win16\winprocsh.inc 66 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 17.11.2021 13:16:01 1
602 function AddFontResource(lpszFilename: LPCSTR): SmallInt; external 'GDI';

C:\Data\lazdev\fpcsrc\rtl\wince\wininc\coredll.inc 202 KB INC-Datei 17.11.2021 13:16:01 17.11.2021 13:16:01 17.11.2021 13:16:01 4
1874 function AddFontResource(_para1:LPCWSTR):longint; external KernelDLL name 'AddFontResourceW';
1875 function AddFontResourceW(_para1:LPCWSTR):longint; external KernelDLL name 'AddFontResourceW';
Wenn du eine Lösung suchst, so wirst du dir aus den Infos was zusammenstellen müssen. Fertig ist da nichts.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Super, Danke.

Wenn es Funktioniert hilft mir das schon weiter.

Ich habe aber noch einige Fragen, wäre dankbar für eine Antwort.

Da ich nur ein Fontdatei benötige,
muss ich wie in Beispiel "post.html#483417" unbedingt eine Ressourcen Datei haben?
Kann man die Datei nicht direkt mit Pfadangabe einfügen?
Wenn eine Res-Datei angegeben werden muß, Fontdatei mit Pfad?
Warum sollen die Fonts beim Programm Ende wieder entfernt werden?
Wenn das Programm beendet wird steht der Font doch sowieso nicht mehr z. Verfügung,
weil das Programm ja beendet wurde, kann man das sich nicht ersparen?

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Nachtrag,
wo bitte ist der Name der ".rc" Deklariert?
Die ".rc" Datei muß doch einen Namen haben?

Code: Alles auswählen

 Res := TResourceStream.Create(hInstance, 'ResFont' + IntToStr(f), PChar('RF' + IntToStr(f)));
    Res.SaveToFile('TmpFont' + IntToStr(f)' + .ttf');
    FreeAndNil(Res);
    AddFontResource(PChar('TmpFont' + IntToStr(f) + '.ttf'));
Dateiname im Projektverzeichnis "?.rc"

Z.B. Inhalt der Datei
ResFont1 RF1 "verdanaz.ttf"
......

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Font Datei.ttf

Beitrag von PascalDragon »

hbr hat geschrieben:
Di 23. Aug 2022, 08:45
Kann man die Datei nicht direkt mit Pfadangabe einfügen?
Wenn eine Res-Datei angegeben werden muß, Fontdatei mit Pfad?
Wenn die API dir nur das zur Verfügung stellt, dann musst du das eben so hinnehmen.
hbr hat geschrieben:
Di 23. Aug 2022, 08:45
Warum sollen die Fonts beim Programm Ende wieder entfernt werden?
Wenn das Programm beendet wird steht der Font doch sowieso nicht mehr z. Verfügung,
weil das Programm ja beendet wurde, kann man das sich nicht ersparen?
Wenn du nur AddFontResource verwendest, dann solltest du hinter dir aufräumen, da - wie die Dokumentation erwähnt - die Schriftart für alle verfügbar ist - und bleibt. Wenn du AddFontResourceEx mit FR_PRIVATE oder AddFontMemResourceEx nutzt, dann musst du nicht hinter dir aufräumen, da Windows das dann für dich macht.
hbr hat geschrieben:
Di 23. Aug 2022, 09:20
Nachtrag,
wo bitte ist der Name der ".rc" Deklariert?
Die ".rc" Datei muß doch einen Namen haben?

Code: Alles auswählen

 Res := TResourceStream.Create(hInstance, 'ResFont' + IntToStr(f), PChar('RF' + IntToStr(f)));
    Res.SaveToFile('TmpFont' + IntToStr(f)' + .ttf');
    FreeAndNil(Res);
    AddFontResource(PChar('TmpFont' + IntToStr(f) + '.ttf'));
Dateiname im Projektverzeichnis "?.rc"

Z.B. Inhalt der Datei
ResFont1 RF1 "verdanaz.ttf"
......
Der Dateiname der rc-Datei muss mit dem übereinstimmen, was in der {$R ...}-Direktive angegeben ist, mit der die Ressource in das Programm eingebunden wird.
FPC Compiler Entwickler

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Font Datei.ttf

Beitrag von hbr »

Hallo,
brauche noch einmal Hilfe.

Also in meiner .lpr steht {$R *.res} also alle .res im Projektverzeichnis werden berücksichtigt.
Gebe ich nun in meiner main z.B. {$R font.res} ein, heist es doppelte vergabe.

Aber mein "Font" wird nicht gefunden.
Es heißt immer Resourge "Font" not found.
Was könnte es sein ?

Res := TResourceStream.Create(hInstance, 'Font' , PChar('RF'));

Resource datei heißt font.res.
Font RF "12640.ttf"


Error. Error while compiling resource -> Compile with -vd for more details. Check for duplicates

Msg=Error while compiling resources -> Compile with -vd for more details. Check for duplicates.
MsgID=9029
FPC Msg=exec_e_error_while_compiling_resources=9029

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Font Datei.ttf

Beitrag von fliegermichl »

Nein {$R *.res} steht in jeder Unit welche Formulare definiert und bindet nur unitname.res ein.
Alle anderen Resourcen müssen entweder mit {$R dateiname.res} zur Compilezeit eingebunden werden.

Du hast aber auch die Möglichkeit unter Projekt -> Projekteinstellungen -> Resourcen eigene Resourcen in die exe einzulinken. Diese können dann zur Laufzeit mit LoadResource geladen werden.

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Font Datei.ttf

Beitrag von PascalDragon »

hbr hat geschrieben:
Di 23. Aug 2022, 11:24
Also in meiner .lpr steht {$R *.res} also alle .res im Projektverzeichnis werden berücksichtigt.
Nein, der Asterisk heißt hier, dass der Name der aktuellen Datei ergänzt wird.
hbr hat geschrieben:
Di 23. Aug 2022, 11:24
Gebe ich nun in meiner main z.B. {$R font.res} ein, heist es doppelte vergabe.
Hast du noch irgendwo anders ein $R font.res? Heißt deine Unit oder dein Programm vielleicht font?
hbr hat geschrieben:
Di 23. Aug 2022, 11:24
Aber mein "Font" wird nicht gefunden.
Es heißt immer Resourge "Font" not found.
Was könnte es sein ?

Res := TResourceStream.Create(hInstance, 'Font' , PChar('RF'));

Resource datei heißt font.res.
Font RF "12640.ttf"
Nimm doch mal einen anderen Namen als das ach so generische „Font”. Es kann sein, dass durch eine der LCL Units vielleicht auch schon eine „Font” Ressource reinkommt. Wobei du ja auch einen benutzerdefinierten Typ („RF”) angegeben hast, also sollte das eigentlich nicht das Problem sein, was heißt, dass doch irgendwas von dir doppelt reinkommt. Hast du das Font RF "12640.ttf" wirklich in der font.res stehen? Wenn ja, sollte das in eine font.rc und du gibst dann {$R font.rc} an.
FPC Compiler Entwickler

Antworten