Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Font dynamisch laden (ohne Installieren) (https://www.delphipraxis.net/63058-font-dynamisch-laden-ohne-installieren.html)

NeoXan 13. Feb 2006 15:40


Font dynamisch laden (ohne Installieren)
 
Hallo,

wollte mich mal erkundigen, ob es möglich ist eine Font zu benutzen, ohne sie zu installieren bzw. registrieren. "Einfach" nur kurzeitig damit z.B. einen Satz schreiben. Die Datei liegt vor und ist nicht in einer Resource oder ähnlichem.

Wenn ich z.B. auf eine TT Schriftart klicke dann kommt dieser Windows Dialog und da wird sie ja auch angezeigt, ohne installiert zu sein.

vielen Dank
Florian

PS:
2. Frage gleich hinterher, wenn ich den Dateinamen XYZ__.TTF habe, die Font heißt 'ABC'. Wie komme ich an den eigentlichen Font Namen, wenn ich lediglich den Dateinamen besitze?

cfmx 13. Feb 2006 15:45

Re: Font dynamisch laden (ohne Installieren)
 
Hallo,

unter SwissDelphiCenter.ch findest du die Lösung für dein Problem.

Gruß
Stefan

P.S.: Sorry, für die sehr kurze Antwort, aber ich bin gerade im Arbeitsstress ;-)

NeoXan 13. Feb 2006 22:36

Re: Font dynamisch laden (ohne Installieren)
 
Hatte ich mir schon angesehen, aber das ist ja das Problem. Die Fonts werden installiert und danach wieder deinstalliert.

Was wäre z.B. wenn die Font, welche installiert wird, schon(!) vorhanden ist? Dann wird sie ja beim beenden entfernt!
Außerdem habe ich dann immernoch das Problem, dass ich von dem Dateinamen nicht gleich auf den FontNamen zurückschließen kann.

Ist das mit dem TTF Windows Dialog so eine Interne Sache, oder ließe sich das "nachbauen".

Trotzdem Danke
Florian

Kroko1999 14. Feb 2006 06:00

Re: Font dynamisch laden (ohne Installieren)
 
Zitat:

Zitat von NeoXan
...
Was wäre z.B. wenn die Font, welche installiert wird, schon(!) vorhanden ist? Dann wird sie ja beim beenden entfernt!
...

Wie wäre es mit ausprobieren :?:
PS: Sichere den Font vorher! :lol:

Flocke 14. Feb 2006 09:23

Re: Font dynamisch laden (ohne Installieren)
 
Die Schriftartenanzeige von Windows (FONTVIEW.EXE) benutzt die API-Funktionen AddFontResourceW und RemoveFontResourceW immer, d.h. es wird nicht überprüft, ob die Schriftart bereits installiert ist.

Die weiteren Informationen über die Schrift erhält das Programm über die undokumentierte Funktion GetFontResourceInfoW.

Es gibt übrigens *NUR* die Unicode-Version dieser Funktion - daher wird das Ding unter 95/98/ME nicht existieren. Unter 95c gibt's "GetFontResourceInfo", das liefert aber immer false (not implemented). Unter 98/ME kann ich es hier nicht prüfen.

Hier ein kleines Beispiel:
Delphi-Quellcode:
procedure PrintFontToCanvas(Canvas: TCanvas; Font: WideString);
type
  TGetFontResourceInfoW = function(Name: PWideChar; var BufSize: Cardinal;
    Buffer: pointer; InfoType: Cardinal): LongBool; stdcall;
var
  naf, k, y: integer;
  gfri: TGetFontResourceInfoW;
  lf: array of TLogFontW;
  lfsz: Cardinal;
  hfnt: HFONT;
  Name: WideString;
begin
  gfri := GetProcAddress(GetModuleHandle('gdi32.dll'), 'GetFontResourceInfoW');
  if @gfri = nil then
    raise Exception.Create('GetFontResourceInfoW in gdi32.dll nicht gefunden');

  if LowerCase(ExtractFileExt(Font)) = '.pfm' then
    Font := Font + '|' + ChangeFileExt(Font, '.pfb');

  naf := AddFontResourceW(PWideChar(Font));
  try
    if naf > 0 then
    begin
      SetLength(lf, naf);
      lfsz := naf * SizeOf(TLogFontW);
      if not gfri(PWideChar(Font), lfsz, @lf[0], 2) then
        raise Exception.Create('GetFontResourceInfoW fehlgeschlagen');

      y := 0;

      naf := lfsz div SizeOf(TLogFont);
      for k := 0 to naf - 1 do
      begin
        hfnt := CreateFontIndirectW(lf[k]);
        try
          Name := lf[k].lfFaceName;

          Canvas.Font.Handle := hfnt;
          Canvas.TextOut(0, y, Name);
          inc(y, Canvas.TextHeight('X'));
          Canvas.TextOut(0, y, 'The quick brown fox jumps over the lazy dog');
          inc(y, Canvas.TextHeight('X'));
          Canvas.Font.Handle := 0;
        finally
          DeleteObject(hfnt);
        end;
      end;
    end;
  finally
    RemoveFontResourceW(PWideChar(Font));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 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