Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Font ohne Installation verwenden (https://www.delphipraxis.net/192110-font-ohne-installation-verwenden.html)

EWeiss 20. Mär 2017 23:33

Font ohne Installation verwenden
 
Ja es gibt hier schon einige Threads für das Problem.
Und das Ergebnis ist dies

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject) ;

begin
  AddFontResource('c:\FONTS\MyFont.TTF') ;
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;

procedure TForm1.FormDestroy(Sender: TObject; var Action: TCloseAction) ;

begin
  RemoveFontResource('C:\FONTS\MyFont.TTF') ;
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;
end;
Nur wenn das jeder empfiehlt warum stürzt meine Anwendung dann hier ab ?

Delphi-Quellcode:
GdipCheck(GdipCreateFontFamilyFromName(UseFont, nil, Fam));
Wo liegt das Problem?

gruss

Luckie 20. Mär 2017 23:52

AW: Font ohne Installation verwenden
 
Rückgabewerte und Fehlerbehandlung? Wie sieht der Code drumherum aus? Funktioniert es mit einer schon installierten Schrift?

EWeiss 20. Mär 2017 23:59

AW: Font ohne Installation verwenden
 
Zitat:

Funktioniert es mit einer schon installierten Schrift?
Ja.

Zitat:

Rückgabewerte und Fehlerbehandlung?
Keine nur AV. GenericError

gruss

Luckie 21. Mär 2017 00:15

AW: Font ohne Installation verwenden
 
Zitat:

Zitat von EWeiss (Beitrag 1364890)
Zitat:

Rückgabewerte und Fehlerbehandlung?
Keine nur AV. GenericError

Deswegen sollst du ja eine machen, damit man sieht wo es genau schief geht, ohne dass es dir gleich um die Ohren fliegt.

EWeiss 21. Mär 2017 00:22

AW: Font ohne Installation verwenden
 
Zitat:

Zitat von Luckie (Beitrag 1364893)
Zitat:

Zitat von EWeiss (Beitrag 1364890)
Zitat:

Rückgabewerte und Fehlerbehandlung?
Keine nur AV. GenericError

Deswegen sollst du ja eine machen, damit man sieht wo es genau schief geht, ohne dass es dir gleich um die Ohren fliegt.

Bringt nichts..
Diese Funktion ist einfach zu GDI+ nicht kompatible.
Die Rückgabe ist zwar true( VCL) aber nicht gleich True für GDI+

Ich muss das hier verwenden.

GdipPrivateAddFontFile

gruss

himitsu 21. Mär 2017 07:46

AW: Font ohne Installation verwenden
 
Wie wäre es mit den etwas besser dokumentierten APIs? (MSDN)

AddFontResource oder besser AddFontResourceEx

Standardmäßig braucht man im Windows keine erhöhten Rechte.
Selbst in Server-Windowsen kann jeder Benutzer diese APIs nutzen, bzw. im Explorer auf "Installieren" klicken.
Bei AddFontResourceEx kann man angeben, ob Windows den Font automatisch wieder entlädt (auch wenn dein Programm mal abstürzt) und ob der FontName aufgelistet werden soll (z.B. bei den FontName-Properties im DropDown).
Auch wenn der Name nicht aufgelistet wird, kann man ihn direkt dem FonName zuweisen und verwenden.

(bei Fonts gibt es im GDI+ auch niemals eine Exception/Fehlermeldung, sollte man einen nichtregistrierten Namen angeben :stupid: ... das wird einfach nur "heimlich" durch registrierte Ersatzfonts oder Standardfonts ersetzt)


PS: In deinem BeispielCode und dem nichtverlinkten Hierwurdedasschonberedetthread finde ich die Zeile mit "GdipCreateFontFamilyFromName" irgendwie nicht.

EWeiss 21. Mär 2017 07:58

AW: Font ohne Installation verwenden
 
Zitat:

(bei Fonts gibt es im GDI+ auch niemals eine Exception/Fehlermeldung, sollte man einen nichtregistrierten Namen angeben ... das wird einfach nur "heimlich" durch registrierte Ersatzfonts oder Standardfonts ersetzt)
Hast du das schon gemacht bzw.. Versucht?

Denn da bist du im Irrtum.. und wie es kracht.
Ich lasse es gerne absichtlich krachen. Das Programm soll sich beenden wenn Fehler bei der Verwendung von GDI+ auftreten.
Sonst hätte ich diesen Thread gar nicht erstellen müssen.

Das muss und soll krachen wenn ein Fehler auftritt. Fam wäre in dem Fall NIL.
Delphi-Quellcode:
GdipCheck(GdipCreateFontFamilyFromName(UseFont, nil, Fam));
Zitat:

Standardmäßig braucht man im Windows keine erhöhten Rechte.
Das hat mit Rechten nichts zu tun sondern einfach damit das du die Windows API von GDI nicht für GDI+ verwenden kannst.

GDI+ Muss seinen Font von der Festplatte oder woher auch immer mit
Delphi-Quellcode:
privateFontCollection: TGPPrivateFontCollection;


FontCollection einholen.

Delphi-Quellcode:
privateFontCollection.AddFontFile('c:\Windows\Fonts\Arial.ttf');

Zitat:

In deinem BeispielCode und dem nichtverlinkten Hierwurdedasschonberedetthread
Soll ich dir jetzt hier die ganzen hundert Threads mit diesen Thema auflisten ?

Zitat:

finde ich die Zeile mit "GdipCreateFontFamilyFromName" irgendwie nicht.
Warum willst du diese finden?
Die wird verwendet in meiner Library sobald man GDIP_DrawTextToDC verwendet Button beschriftet oder Labels addiert..

gruss

himitsu 21. Mär 2017 09:40

AW: Font ohne Installation verwenden
 
Zitat:

Zitat von EWeiss (Beitrag 1364917)
Hast du das schon gemacht bzw.. Versucht?

Der einfachste Test:
Label.Font.FontName im OI zuweisen und dann schauen was nicht passiert
oder irgendwas ala
Delphi-Quellcode:
Canvas.Font.FontName := 'GibtEsNicht';
Canvas.DrawText(...);
Nirgendwo wird ein Fehler geworfen.


Zitat:

Zitat von EWeiss (Beitrag 1364917)
Soll ich dir jetzt hier die ganzen hundert Threads mit diesen Thema auflisten ?

Warum willst du diese finden?

Weil du nur schreibst "geht nicht" und sagst "ich hab diese Lösung von wo anders" aber dazu auch kein weiteres Wort.
Sollen wir uns das jetzt alles durchlesen, anstatt du einfach mal ein/zwei weiterfphrende Links gibst?


Das Einzige Problem was wir z.B. bei AddFontResourceEx haben ist Microsoft Office.
Der Dreck hookt sich krankhaft überall ins System und bei einigen Kunden passiert es dann, dass der Aufruf dieser API niemals zurückkehrt (hängt), bis man MS Office abschießt/deinstalliert.

EWeiss 21. Mär 2017 09:49

AW: Font ohne Installation verwenden
 
Delphi-Quellcode:
Canvas.Font := 'GibtEsNicht';
Canvas.DrawText(...);
Es hat nichts mit GDI+ zu tun.. sorry das ist VCL(GDI) und hier funktioniert die altbewährte Methode über GDI.
Also das funktioniert AddFontResourceEx mit GDI

Zitat:

Weil du nur schreibst "geht nicht" und sagst "ich hab diese Lösung von wo anders" aber dazu auch kein weiteres Wort.
Ich habe nirgendwo geschrieben "Geht nicht" (Nur gesagt das meine Anwendung abstürzt mit diesen Lösungsansätzen)
Ich habe nirgends geschrieben "ich hab diese Lösung von wo anders"

Zitat:

aber dazu auch kein weiteres Wort
Doch.. ;)
Und zwar das her
Zitat:

Ja es gibt hier schon einige Threads für das Problem.
Ich habe hier gesucht und in Verbindung mit meiner Frage einige Threads mit den gleichen Thema gefunden.
Nur alle die Informationen die fast alle gleich sind funktionieren nicht mit GDI+ das ist Fakt!

Warum habe ich oben beschrieben.
Aber ich möchte mich mit niemanden hier streiten von daher :cheers:

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz