AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Font dynamisch laden (ohne Installieren)
Thema durchsuchen
Ansicht
Themen-Optionen

Font dynamisch laden (ohne Installieren)

Ein Thema von NeoXan · begonnen am 13. Feb 2006 · letzter Beitrag vom 14. Feb 2006
Antwort Antwort
NeoXan
(Gast)

n/a Beiträge
 
#1

Font dynamisch laden (ohne Installieren)

  Alt 13. Feb 2006, 16:40
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?
  Mit Zitat antworten Zitat
cfmx

Registriert seit: 3. Dez 2003
Ort: Drachselsried
22 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Font dynamisch laden (ohne Installieren)

  Alt 13. Feb 2006, 16:45
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
Stefan Sturm
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#3

Re: Font dynamisch laden (ohne Installieren)

  Alt 13. Feb 2006, 23:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Font dynamisch laden (ohne Installieren)

  Alt 14. Feb 2006, 07:00
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!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Font dynamisch laden (ohne Installieren)

  Alt 14. Feb 2006, 10:23
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)) = '.pfmthen
    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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:56 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