Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Screen.Fonts gibt nicht aktuelle Fontliste (https://www.delphipraxis.net/159488-screen-fonts-gibt-nicht-aktuelle-fontliste.html)

Memnarch 30. Mär 2011 12:46

Screen.Fonts gibt nicht aktuelle Fontliste
 
Tag allerseits.

Wenn ich per copyfile eine fontdatei(ttf) in den windows fonts ordner kopiere, reagieren alle windows applikationen(wordpad, word etc) automatisch darauf und ergänzen ihre liste.

Screen.fonts tut das NICHT. Also hab ich mal die windows message WM_FONTCHANGE gesendet, und in meiner form darauf gelauscht. Wird die message getriggert, bekomme ich nochimmer die alte liste. Erst beim zweitenmal triggern bekomme ich die neue fontliste(zweites mal manuel getriggerd, also ist schon etwas zeit vergangen, per knopfdruck).

Hab auch schon versucht indem ich ResetFonts aufgerufen habe, damit er durch die fontliste enumeriert. Aber es bringt nichts. Wie kann ich auf solche Events richtig reagieren?
Wenn andere applikationen auf ein simples filecopy im FontOrdner reagieren, muss es doch auch per Delphi möglich sein oder nicht?

MFG
Memnarch

Satty67 30. Mär 2011 15:31

AW: Screen.Fonts gibt nicht aktuelle Fontliste
 
Geht auch selbst enumerieren? Also einfach auf den Luxus von Screen.Fonts verzichten...

Delphi-Quellcode:
function EnumFontsProc(lplf, lptm : Pointer; dwType: Word; PStringList : Pointer):Integer; stdcall;
var
  s : String;
begin
  s := PLogFont(lplf)^.lfFaceName;
  case dwType of
    DEVICE_FONTTYPE  : s := 'DEV: ' + s;
    RASTER_FONTTYPE  : s := 'PRN: ' + s;
    TRUETYPE_FONTTYPE : s := 'TTF: ' + s;
  end;
  TStringList(PStringList^).Add(s);
  Result := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  try
    EnumFonts(Canvas.Handle, NIL, @EnumFontsProc, @sl);
    Memo1.Text := sl.Text;
  finally
    sl.Free;
  end;
end;

himitsu 30. Mär 2011 16:07

AW: Screen.Fonts gibt nicht aktuelle Fontliste
 
Delphi überwacht das Verzeichnis nicht.

Neuere Windows-Versionen sollten dieses "einfache" Kopieren abfangen und es in ein Installieren umwandeln und dann eine entsprechende Änderungs-Message im System an alle Anwendungen verschicken.
Ältere Windows fangen es nicht ab und versenden keine Messages.

> So oder so, es wäre besser, wenn man den offiziellen Weg geht und die Schriftart über die entsprechenden WinAPIs (welche ich jetzt nicht kenn) installieren.

Nun kannst du in deinem Delphiprogramm noch die Windows-Message behandeln und dort der Fonstklasse sagen sie soll ihre Liste mal neu laden.

Memnarch 30. Mär 2011 16:09

AW: Screen.Fonts gibt nicht aktuelle Fontliste
 
Screen.Fonts macht EXAKt dasselbe. Aber das problem hab ich inzwischen gelößt. Delphi reagiert nur dann exakt, wenn ich auch AddFontResource nutze, ansonsten etwas später.

Tja...und nun? Die fonts können NICHT permanent installiert werden. Beim nächsten start ist alles futsch. In der MSDN steht dazu nur, man müsse es in die registry eintragen...ach und WO?. Das problem ist, das unter HKey_LocalMachine\Software\Microsoft\WindowsNT\Fon ts zwar alle fonts gelisted sind, dortige einträge aber nicht zählen.

Diese einträge sind nur für die Fakeansicht des Windos\Fonts ordners. Der zeigt nämlich nicht seinen inhalt, sondern was in der Registry steht. Klasse.

Wenn ich die font datei per copyfile in den fonts ordner verfrachte und AddFontResource aufrufe, hab ich den font erst permanent, wenn einmal der Windows\Fonts ordner geöffnet wurde. Danach ist ein entfernen nicht mehr möglich. Wenn ich RemoveFontResource aufrufe und es schaffe die datei im Fonts ordner zu löschen, und den dazugehörigen Key(den die ansicht zeigt ja nicht die dateien), dan zeigen noch immer alle applikationen meine font an. erst nach einem neustart verschwindet der geisterfont aus dem system.

Jemand nen ratschlag wie ich einen Font vernünftig in den Fonts ordner installiere und deinstalliere?

@Himitsu: GENAU diese apis suche ich. Ich finde die nicht.

EDIT: Ok ich habs jetzt. File rüberkopieren, In den oben genannten Fonts schlüssel der Registry einen eintrag machen, AddFontResources aufrufen, sendmessage WM_FONTCHAnge, in umgekehrter reihenfolge zum löschen. phew >.<

MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr.

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