Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schrift aus Ressource nutzen (https://www.delphipraxis.net/147757-schrift-aus-ressource-nutzen.html)

Shubit 15. Feb 2010 21:09


Schrift aus Ressource nutzen
 
Ja eigentlich gibt es zu dem Thema schon 2-3 ähnliche Topics aber die beziehen sich eher darauf die Schrift zu extrahieren, registrieren und dann zu nutzen. Wie kann ich die Schrift direkt aus der Ressource nutzen ohne diese Umwege zu gehen?

Luckie 15. Feb 2010 21:16

Re: Schrift aus Ressource nutzen
 
Was spricht dagegen den herkömmlichen Weg zu nehmen? Warum muss es jetzt wieder eine Sonderlösung sein, die wahrscheinlich sogar wesentlich komplizierter zu implementieren ist?

Reinhard Kern 16. Feb 2010 01:02

Re: Schrift aus Ressource nutzen
 
Zitat:

Zitat von Shubit
Ja eigentlich gibt es zu dem Thema schon 2-3 ähnliche Topics aber die beziehen sich eher darauf die Schrift zu extrahieren, registrieren und dann zu nutzen. Wie kann ich die Schrift direkt aus der Ressource nutzen ohne diese Umwege zu gehen?

ganz einfach: du schreibst deinen eigenen TrueType-Renderer. Den von Windows kannst du ja nicht benutzen.

Gruss Reinhard

himitsu 16. Feb 2010 06:27

Re: Schrift aus Ressource nutzen
 
Es gibt in den WinAPIs auch eine, welche (angeblich) den Font aus der Resource läd, aber ich weiß jetzt nicht wie diese API heißt.


[add]
Nach AddFontResource braucht ihr nicht suchen, das ist was ganz Anderes.

Hier erstmal, wie man einen Font in die Resourcen reinmacht:
http://msdn.microsoft.com/en-us/library/aa381043.aspx

s-off 16. Feb 2010 06:35

Re: Schrift aus Ressource nutzen
 
Zitat:

Zitat von Luckie
Was spricht dagegen den herkömmlichen Weg zu nehmen? Warum muss es jetzt wieder eine Sonderlösung sein, die wahrscheinlich sogar wesentlich komplizierter zu implementieren ist?

Was spricht dagegen, auch mal über den Tellerrand hinauszuschauen, und auch mal zu versuchen, Alternativlösungen zu finden?
Klar, in diesem Fall ist der 'herkömmliche' Weg sicherlich die Muster- bzw. die einfachste Lösung.

Ich würde mal behaupten, dass sich die DP bzw. deren Nutzer nicht damit zufrieden geben sollte, auf Standardfragen auch immer nur Standardantworten zu geben, bzw. den 'herkömmlichen' weg aufzuzeigen; auch wenn ein anderer Weg 'wesentlich komplizierter zu implementieren ist'. Schaden kann es jedenfalls nicht - und wenn es nur Lernzwecken dient. Wer weiß, vielleicht kommt ja am Ende ganz was tolles daraus, und wir haben einen neuen 'TrueType-Renderer' :mrgreen:

Wo wäre die Menschheit heute, wenn sie sich immer mit dem 'herkömmlichen' Weg zufrieden gegeben hätte?

Blackheart 16. Feb 2010 07:54

Re: Schrift aus Ressource nutzen
 
schau mal hier vieleicht hilft das ja.

himitsu 16. Feb 2010 08:26

Re: Schrift aus Ressource nutzen
 
MSDN-Library durchsuchenAddFontMemResourceEx und MSDN-Library durchsuchenRemoveFontMemResourceEx und diese liegen schon mindestens seit Delphi 7 in der Windows-Unit rum.

Die so "installierten", bzw. geladenen Fonts sind nur innerhalb der entsprechenden Anwendung gültig.

Infos zu den nötigen Font-Resourcen:
http://msdn.microsoft.com/en-us/library/aa381043.aspx

Folgende Codes sind ungetested und nur Anhand der Quellen zusammengebastelt:
Delphi-Quellcode:
Function LoadResFont(Const ResName: String; ResType: PChar = RT_FONT; InstalledFonts: PLongWord = nil): THandle; Overload;
  Var Res: TResourceStream;
    Count: LongWord;

  Begin
    Res := TResourceStream.Create(HInstance, PChar(ResName), ResType);
    Try
      Result := AddFontMemResourceEx(Res.Memory, Res.Size, nil, @Count);
      If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
    Finally
      Res.Free;
    End;
  End;

Function LoadResFont(ResID: Integer; InstalledFonts: PLongWord = nil): THandle; Overload;
  Var Res: TResourceStream;
    Count: LongWord;

  Begin
    Res := TResourceStream.CreateFromID(HInstance, ResID, RT_FONT);
    Try
      Result := AddFontMemResourceEx(Res.Memory, Res.Size, nil, @Count);
      If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
    Finally
      Res.Free;
    End;
  End;

Function LoadResFont(FontStream: TStream; InstalledFonts: PLongWord = nil): THandle; Overload;
  Var Size: Integer;
    Mem:   Pointer;
    Count: LongWord;

  Begin
    Size := FontStream.Size - FontStream.Position;
    Mem := GetMemory(Size);
    Try
      FontStream.ReadBuffer(Mem^, Size);
      Result := AddFontMemResourceEx(Mem, Size, nil, @Count);
      If Assigned(InstalledFonts) Then InstalledFonts^ := Count;
    Finally
      FreeMemory(Mem);
    End;
  End;

Procedure UnloadResFont(Font: THandle);
  Begin
    RemoveFontMemResourceEx(Font);
  End;
Da die Daten nicht direkt mit der Resource verknüpft sind, wären theoretisch sogar andere Quellen möglich,
darum ist als Beispiel FontStream:TStream mit vorhanden.

Shubit 16. Feb 2010 19:56

Re: Schrift aus Ressource nutzen
 
@Luckie: Bei dir ist die Erde auch noch ne eine Scheibe, weil dir das ganze Zeug mit der Kugel zu kompliziert ist was? Son Depp der Galileo, dass der da auch son komplizierten Weg gehen musste, war doch viel leichter mit der Scheibe ...

@Reinard: Coole Idee, aber ich glaub in Anbetracht meiner anfängerhaften Programmierkenntnisse wird daraus so schnell nichts ;)

@Blackheart: Das entspricht eigentlich eher dem was ich nicht wollte (die Schriften erst zu extrahieren etc ...), aber darauf werd ich wohl zurückkommen menn himitsus Lösungsidee nicht funktioniert bzw. so überkompliziert wird wie Luckie profezeit

@himitsu: Also ich arbeite mit Delphi 2010 und habe die Schriftart jetzt unter Projekt => Ressourcen hinzugefügt. Dabei wird dann auch gleich eine ID festgelegt. Bleiben noch folgende Fragen:
1. Was ist ein PLongWord und woher krieg ich diese Variable die die Installed Fonts angibt?
2. Was mach ich dann mit dem HFont, kann man das auch irgendwie in ein TFont umwandeln und damit dann Label1.Font belegen?

daywalker9 16. Feb 2010 20:01

Re: Schrift aus Ressource nutzen
 
Ein PLongWord ist ein Zeiger auf ein LongWord.

HFONT kannst du wie folgt behandeln:

HFONT ist letztendlich auch nur ein Handle auf dein Font.


Delphi-Quellcode:
procedure NewFont;
var
  lFont : tFont;
  lCount : pLongWord;
begin
  new(lCount);
  lFont := tFont.Create;
  lFont.Handle :=LoadResFont('MyFont',lCount);
end;

Shubit 16. Feb 2010 20:21

Re: Schrift aus Ressource nutzen
 
Und wozu ist das LongWord dann gut?


Also meine Ressourcen Datei sieht jetzt wie folgt aus:
1 Font "D:\\fonts\\Anywhere.ttf"

und hab ich versucht mit beim FormCreate dem MyLabel die Schriftart aus der Ressource zuzuweisen:
Delphi-Quellcode:
procedure TForm1.OnCreate(Sender: TObject);
var
  lCount : pLongWord;
begin
  new(lCount);
  MyLabel.Font.Handle := LoadResFont(1,lCount);
end;
Allerdings scheint er es dann einfach auf die im Formular als Standard eingestellte Schriftart zu setzen :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 1 von 2  1 2      

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