AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fontname aus *.TTF-Datei auslesen

Ein Thema von Catbytes · begonnen am 3. Jan 2005 · letzter Beitrag vom 3. Jan 2005
Antwort Antwort
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#1

Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 00:25
Hallo,

ich habe hier mehrere Fonts in Form von *.TTF-Dateien vorliegen, die nicht als Schriftart in Windows registriert sind.

Mit

Code:
AddFontResource('dateiname.ttf');
registriere ich den Font zur zeitweisen Benutzung.

Wenn ich jetzt aber den Font einem Label zuordnen möchte, brauche ich ja den Fontnamen.

Beispiel:
Habe hier ein Font mit Dateinamen "14minute.ttf". Der Fontname lautet aber "14 minutes". Also müßte ich ja den Label mit

Code:
Label1.Font.Name:='14 minutes';
zuweisen. Doch wie komme ich an den Fontnamen?

Der stimmt zwar manchmal mit dem Dateinamen überein, aber eben nicht immer.

Interessant wäre natürlich auch Zusatzinfos zum Font, wie z.B. Schriftstil (fett, kursiv etc.) usw.

Hat da jemand 'ne Idee?

TFont geht ja IMHO nur mit Systemschriftarten, also mit Schriftarten, die schon in Windows registriert sind.

Vielleicht denke ich auch einfach zu kompliziert und die Lösung liegt so nahe
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 01:23
Zitat von Catbytes:
Hat da jemand 'ne Idee?
Ich glaube da bleibt dir der Weg über die Registry nicht erspart.

Code:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
Code:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 01:34
Für HKEYLM braucht man doch Administratorrechte oder?

MfG Florian
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 01:38
Nur wenn man schreibend zugreift, aber er braucht ja nur lesen und gucken, wie die Schrift heißt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#5

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 01:38
Zitat von flomei:
Für HKEYLM braucht man doch Administratorrechte oder?
Man muss ja nicht mit KEY_ALL_ACCESS auf den Schlüssel zugreifen. Ein KEY_QUERY_VALUE oder ein KEY_READ sollten reichen
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#6

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 03:33
Hallo,

vielen Dank erstmal für die Antworten.

Das Problem ist ja, daß der Font kein Windows-Standardfont ist.

Sprich unter:

Code:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts
wird mir folgendes angezeigt:
http://www.catbytes.de/fonts1.jpg

Und unter:

Code:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
folgendes:
http://www.catbytes.de/fonts2.jpg

Wie man sieht ist vom Font "14 minutes" leider nichts zu sehen.

Witzig ist aber, was mir Word anzeigt:
http://www.catbytes.de/word_fontliste.jpg

Ich habe auch die gesamte Registry nach "minute" bzw. "minutes" durchsucht - Nichts

Es muß doch eine Möglichkeit geben, einen Fontdateinamen zu übergeben, aber trotzdem den Fontnamen herauszubekommen. Sonst hätte ja der ganze Befehl:

Code:
AddFontResource('14minute.ttf');
keinen Sinn, da ich ja nie damit arbeiten könnte - Fontname und Fontdateiname unterscheiden sich ja.

Übrigens: Nach dem Aufruf (und weiteren Routinen) entferne ich den Font natürlich mit:

Code:
RemoveFontResource('14minute.ttf');
wieder (trotzdem bleibt er in Word erhalten).

Sinn des ganzen: Ich baue gerade eine Fontseite im Netz auf. Für jeden Font brauche ich natürlich ein Vorschaubild - ich habe 3.000 Fonts vorliegen. Delphi soll nun jeden Font in einem bestimmten Verzeichnis kurz mit "AddFontResource" einbinden, ein Schnappschuß (*.JPG) wird geschossen, der Font wird mit "RemoveFontResource" wieder 'entladen' und ich habe mein Vorschaubild. So soll das ganze Verzeichnis durchgerattert werden. Admin-Rechte oder so wären also kein Problem, da das Programm sowieso nie meinen Rechner verlassen wird.

Hat noch jemand eine andere Idee?
Catbytes
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 05:05
wär es nicht einfacher, wenn du die fonts irgendwie mit delphi direkt "öffnest" ?
also ohne registrieren und wieder unregistrieren usw
ich denke mal, du kannst die 14minutes.ttf deshalb benutzen, weil windows evtl das fontdir durchsucht und nicht durch die registry wurschtelt.. aber das wäre ja total untypisch für windoof *g*
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#8

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 12:39
Hallo,

Zitat von supermuckl:
wär es nicht einfacher, wenn du die fonts irgendwie mit delphi direkt "öffnest" ?
also ohne registrieren und wieder unregistrieren usw
ich denke mal, du kannst die 14minutes.ttf deshalb benutzen, weil windows evtl das fontdir durchsucht und nicht durch die registry wurschtelt.. aber das wäre ja total untypisch für windoof *g*
nunja - für meinen Screenshot muß ja das Label kurz den Font bekommen - also muß ich ihn kurz registrieren.

Die Fontdatei liegt übrigens nicht im FontDir, sondern im Programmverzeichnis (also in dem Verzeichnis, wo das selbst erstellte Delphi-Programm liegt).

BTW: Die Tipp aus der Code-Library
http://www.delphipraxis.net/internal...ct.php?t=10873
wir ad-absurdum geführt, weil auch hier am Ende steht:
Code:
Edit1.Font.Name := 'Echter Name der Schrift (nicht Dateiname)';
Die Frage ist nur: Wie?

Noch andere Ideen?
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#9

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 16:07
Zitat von Catbytes:
Noch andere Ideen?
Dieser Link sollte deine Probleme lösen.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#10

Re: Fontname aus *.TTF-Datei auslesen

  Alt 3. Jan 2005, 19:40
Hallo,

danke Sprint!

Ich werde mir Deine Lösung später ansehen - beim kurzen überfliegen sieht das auch sehr gut aus.

Mittlerweile habe ich mir aus verschiedenen Quellen im Netz was eigenes gebastelt.

Die Autoren sind unbekannt. Sollte sich einer wiedererkennen, einfach melden

Code:
type
  TTableDirectory = record
    Tag: LongInt;
    CheckSum: LongInt;
    Offset: LongInt;
    Length: LongInt;
  end;

  TNamingTable = record
    Format: Word;
    Count: Word;
    StringOffset: Word;
  end;

  TNameRecord = record
    PlatformID: Word;
    SpecificID: Word;
    LanguageID: Word;
    NameID: Word;
    Length: Word;
    Offset: Word;
  end;

function GetTypeFaceName(TrueTypeFile: string): string;
var
  I, FileHandle: Integer;
  TableDirectory: TTableDirectory;
  NamingTable: TNamingTable;
  NameRecord: TNameRecord;
  LongSwap: LongInt;
  Buffer: array[0..255] of Char;
  WideResult: string;
  MSNameFound: Boolean;

begin
  MSNameFound := False;
  Result := '';
  Buffer := '';
  WideResult := '';
  FileHandle := FileOpen(TrueTypeFile, fmOpenRead);
  if FileHandle < 0 then
    Exit;

  FileSeek(FileHandle, 12, 0);
  repeat
    if FileRead(FileHandle,
      TableDirectory,
      SizeOf(TableDirectory)) < SizeOf(TableDirectory) then
    begin
      FileClose(FileHandle);
      Exit;
    end;
  until TableDirectory.Tag = $656D616E; // tag_NamingTable - Name

  LongSwap := TableDirectory.Offset shr 16;
  TableDirectory.Offset := Swap(TableDirectory.Offset) shl 16 + Swap(LongSwap);
  FileSeek(FileHandle, TableDirectory.Offset, 0);
  FileRead(FileHandle, NamingTable, SizeOf(NamingTable));

  repeat
    if FileRead(FileHandle, NameRecord, SizeOf(NameRecord)) < SizeOf(NameRecord)
      then
    begin
      FileSeek(FileHandle, TableDirectory.Offset, 0);
      FileRead(FileHandle, NamingTable, SizeOf(NamingTable));
      repeat
        if FileRead(FileHandle, NameRecord, SizeOf(NameRecord)) <
          SizeOf(NameRecord) then
        begin
          FileClose(FileHandle);
          Exit;
        end;
      until (Swap(NameRecord.PlatformID) = 3) and (Swap(NameRecord.NameID) = 4);
      MSNameFound := True;
      Break;
    end;
  until (Swap(NameRecord.PlatformID) = 1) and (Swap(NameRecord.NameID) = 4);

  FileSeek(FileHandle,
    Swap(NamingTable.StringOffset) + Swap(NameRecord.Offset) +
    TableDirectory.Offset,
    0);
  FileRead(FileHandle, Buffer, Swap(NameRecord.Length));
  NameRecord.Length := Swap(NameRecord.Length);

  if not MSNameFound then
    WideResult := Copy(Buffer, 0, NameRecord.Length)
  else
  begin
    I := 1;
    repeat
      WideResult := WideResult + Buffer[I];
      Inc(I, 2);
    until I > NameRecord.Length;
  end;
  Result := WideResult;
  FileClose(FileHandle);
end;
Wer das ganze Programm möchte (so'n kleiner TTF-Viewer den ich jetzt zum testen geproggt habe), kann sich das ganze hier runterladen:
http://www.catbytes.de/fonts4u.zip

Mit Source natürlich (249kb).

Danke nochmals an alle. Den Source werde ich für die Code-Library vorschlagen...
Catbytes
  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 21:26 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