AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

Ein Thema von KodeZwerg · begonnen am 21. Sep 2018 · letzter Beitrag vom 2. Apr 2021
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 12:55
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.
Probiere es doch einfach aus? ^_^
Jeder hat da so seine Vorlieben wie was womit usw, ich nannte halt die Methode die für mich Okay ist.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.216 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 12:57
Die Variable FontsCount ist überhaupt nicht initialisiert!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:00
Die Variable FontsCount ist überhaupt nicht initialisiert!
Dafür FontHandle sogar zweimal Ne glaube aber FontsCount ist ein reiner out Parameter, also muss nicht zwingend initialisiert werden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:10
Die Variable FontsCount ist überhaupt nicht initialisiert!
Wozu auch?
Dafür FontHandle sogar zweimal
Sorry, lösch das FontHanlde := 0 und gut ist.

Verzeihung falls doppelt. Dann los Admins, löscht das schnell wieder.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.216 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:14
Stimmt, ich habe in der Doku nicht gesehen dass der Parameter wohl wirklich ein reiner out-Parameter ist. Normalerweise steht das immer schön drin.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:14
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:
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;
Bsp.
Delphi-Quellcode:
    if not Assigned(TTFCaption) then
      GDIP_LoadPrivateFontCollection(SpriteResPath + 'lcd.ttf', TTFCaption, FontCaption);
gruss

Geändert von EWeiss (21. Sep 2018 um 13:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:29
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.
Na genau deswegen habe ich doch diesen Thread erstellt, um auch andere Ansichten / Möglichkeiten zu erfahren, abgesehen von Post #1.
Also Danke Dir für diese Variante!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 13:34
Zitat:
Ich finde es unnötig Fonts in die Resource einzubinden
Sagen wir besser es ist flexibler kommt halt auf den Verwendungszweck an welche Variante man verwenden möchte.
Es gibt ja immer mehrerer Varianten.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 21. Sep 2018, 18:04
Eine weitere Möglichkeit eine Font in einer .exe abzulegen wäre so...
So kann keiner auf die schnelle die Font extrahieren da sie nun nicht mehr in Resource liegt.


Anleitung:
kopiert die Font in Euer Projekt-Root rein.
entpackt die Datei im Anhang auch dahin.
öffnet eine CMD und ruft bin2inc "Name der Font-Datei" auf.
nun solltet ihr eine "Dateiname.inc" erhalten haben.

für dieses Beispiel nehmen wir an Datei lautet MyFont.ttf die nun MyFont.inc geworden ist und in der das Array auch so heißt.
ihr könnt/müßt sogar manchmal die .inc umbennen und bearbeiten wenn original dateiname als array-bezeichner unzulässig ist.
bin2inc ist halt für generellen krams da, nicht explizit für font integration.

startet Delphi mit Eurem Projekt.
fügt unter implementation diese zeile ein: {$I MyFont.inc}
nun brauchen wir auch noch eine funktion die uns die font bereit stellt, das mache ich so:
Delphi-Quellcode:
function LoadInternalFont: THandle;
var
  FontsCount : DWORD;
begin
  Result := AddFontMemResourceEx(@MyFont, Length(MyFont), nil, @FontsCount);
end;
ersetzt halt "MyFont" mit euren namen.
so hier könnte man es benutzen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FontHandle := LoadInternalFont;
  if FontHandle <> 0 then Label1.Font.Name := 'Name der Font?';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  RemoveFontMemResourceEx(FontHandle);
end;

edit
ps:
nicht erschrecken, dateigröße von .inc ist idR sehr viel größer aber keine bange, im kompilat ist es wieder binär.
also größentechnisch ist da kein doller unterschied ob per resource oder intern/direkt in .exe
Angehängte Dateien
Dateityp: 7z bin2inc.7z (27,2 KB, 16x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (21. Sep 2018 um 18:17 Uhr)
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Schriftart in .exe als Resource einbinden und ohne export auch benutzen.

  Alt 28. Mär 2021, 10:01
Hallo,
ich suche gerade eine einfache Möglichkeit um Symbole zu nutzen, die in verschiedenen Größen dann auch gut aussehen. Also skalierbar sind und auch einfach in Farben geändert werden können. SVG würde ich gerne nutzen aber ich möchte einfach keine fremden Komponenten nehmen. Mir sind die meist viel zu unübersichtlich, sprich 5 PAS-Dateien oder Source-Abschnitte die ich gar nicht dann aufrufe. Und verstehen will ich das ganze dann auch immer. Da mach ich stets lieber alles selbst Also mir kam gerade die Idee wegen IconFonts, die so im Web genutzt werden. Also bin ich auf diesem Beitrag gestoßen, da es hier wichtig ist, eine TTF in der EXE einzubinden und nicht in Windows zu registrieren. Also damit einfach stets die Symbole vorhanden sind und sie in meinem Programm angezeigt werden können.

Wie schon erwähnt, mit fremden TTFs darf man nicht alles machen. Jetzt habe ich noch "fontello.com" gefunden. Das ist doch eine "MIT Lizenz" Oder nicht? Also darüber könnte ich doch einfach meine Symbol-TTF erstellen und mit dem Beispiel hier dies alles umsetzen, ohne irgendwelche Lizenzen zu kaufen oder zu beachten?

Wenn das so ist, wäre das wohl auch für andere eine einfache Idee für skalierbare Symbole für die eigene Anwendung. Mir fällt aber noch etwas dazu ein. In Windows gab oder gibt es noch irgendwelche Schriftartglättungs-Einstellungen. Nicht das meine Idee jetzt am Ende doch nicht so toll ist, weil der Endbenutzer in Windows evtl. eine Einstellung hat und die Symbole doch nicht so schön ausschauen.

Jedenfalls könnte man durch eine Doppelbelegung (in zwei Farben + versetzter Pixel) auch Symbole vielleicht in eine 2Farb-Technik etwas aufhübschen. So zumindest die Idee.

Ausprobiert habe ich jetzt aber noch nichts.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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