AGB  ·  Datenschutz  ·  Impressum  







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

Screen.Fonts gibt nicht aktuelle Fontliste

Ein Thema von Memnarch · begonnen am 30. Mär 2011 · letzter Beitrag vom 30. Mär 2011
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Screen.Fonts gibt nicht aktuelle Fontliste

  Alt 30. Mär 2011, 11:46
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Screen.Fonts gibt nicht aktuelle Fontliste

  Alt 30. Mär 2011, 14:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

AW: Screen.Fonts gibt nicht aktuelle Fontliste

  Alt 30. Mär 2011, 15:07
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Screen.Fonts gibt nicht aktuelle Fontliste

  Alt 30. Mär 2011, 15:09
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

Geändert von Memnarch (30. Mär 2011 um 15:45 Uhr)
  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:07 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