Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Auflisten der TFontCharset eines bestimmten Fonts (https://www.delphipraxis.net/166884-auflisten-der-tfontcharset-eines-bestimmten-fonts.html)

Ookami 4. Mär 2012 11:22

Auflisten der TFontCharset eines bestimmten Fonts
 
Hallo Gemeinde,

Was möchte ich den haben?
Jeder Font hat eine bestimmte Anzahl von Länderspezifischen Charsets, die auch bei jedem Font unterschiedlich sind. Ich suche nach einer Lösung, die verschiedenen Charsets eines Fonts in eine Liste zu lesen. Ich meinte mal eine Lösung gehabt zu haben, aber die funktioniert wohl unter win7 nicht mehr.

Die Lösung, die ich unter WinXP mal hatte konnte ich auch wiederfinden unter
http://www.swissdelphicenter.ch/de/showcode.php?id=892

Tja, nur leider funktioniert die nicht mehr wie gesagt und so sehr ich mich abstrample, hab ich im Netz nichts zu diesem Thema gefunden, zumindest nichts, das mich auch nur annährend in die Richtung führt.

Leider kann ich den Code nicht so ganz nachvollziehen, daher die Frage, ob einer von Euch eine andere Lösung hat.

Luckie 4. Mär 2012 11:57

AW: Auflisten der TFontCharset eines bestimmten Fonts
 
Kannst du unter Windows 7 debuggen?

Ookami 4. Mär 2012 12:46

AW: Auflisten der TFontCharset eines bestimmten Fonts
 
Hallo Luckie,

mein großer Ratgeber, du hast mir bislang immer tolle Tips gegeben.

Zur Antwort auf deine Frage: Nein, kann ich nicht.
Zumindest in die Funktion mit dem EnumProc komm ich gar nicht rein.

Sieht quasi so aus, als ob die Funktion gar nicht aufgerufen wird.
Da ich mit dieser Art Aufruf s.
Delphi-Quellcode:
EnumFontFamiliesEx(DC, LogFont, @EnumProc, lParam(CharSets), 0);
leider auch nicht vertraut bin, komm ich nicht klar.

Luckie 4. Mär 2012 12:58

AW: Auflisten der TFontCharset eines bestimmten Fonts
 
Die Funktion enummeriert alle Schriften und zu jeder Schrift wir die Callback Funktion EnumProc aufgerufen. Im Parameter EnumLogFontEx von EnumProc stehen, dann in einem Record die Informationen zu betreffenden Schrift drin.

Setz doch mal einen Breakpunkt auf die erste Zeile nach dem Schlüsselwort Begin von der FunktionEnumProc und guck, ob du dahin kommst.

Anscheinend haben die Characterset Konstanten. Eventuell haben sich diese Werte unter Windows 7 geändert. Zu beachten ist weiter hin, dass es davon eine Unicode und eine Ansi Version gibt. Wenn deine Delphi Version standardmäßig Unicode verwendet könnte es Probleme geben, das der Code aus dem SwissDelphiCenter bestimmt schon so halt ist, dass er noch kein Unicode berücksichtigt. Ich habe leider keine Unicode Delphi Version und kann das leider auch nicht testen. Aber du kannst mal S explizit als AnsiString deklarieren und EnumFontFamiliesExA aufrufen.

Ookami 4. Mär 2012 17:41

AW: Auflisten der TFontCharset eines bestimmten Fonts
 
Hallo Luckie,

danke noch mal für deine Antwort, leider konnte ich mich nicht vorher dransetzen.
Die Familie hat mich daran gehindert. :)

Nichtsdestotrotz jetzt bin ich wieder dran.

Ich habe mal die Konstanten in der Unit Windows geprüft und die stimmen.

Dann bin ich hergegangen und habe die Strings in Ansistring gewandelt.

Delphi-Quellcode:
  TCharSetRec = packed record
    Name: Ansistring; [COLOR="Red"]<-- hier[/COLOR]
    ID: Integer
  end;


function EnumProc(const EnumLogFontEx: TEnumLogFontEx;
const   NewTextMetricEx: TNewTextMetricEx;
VAR     FontType: Integer;
         Strings: TStrings): Integer; stdcall;
var     I: Integer;
         ID: Integer;
         S: AnsiString; [COLOR="Red"]<-- hier[/COLOR]
begin
     ID := EnumLogFontEx.elfLogFont.lfCharSet;
     S := Format('Unknown charset %d', [ID]);
     for I := 0 to NumCharSets - 1 do
       if CharSets[I].ID = ID then
       begin
         S := CharSets[I].Name;
         Break;
       end;
     Strings.Add(S);
     Result := 1
end;

und dann noch

procedure GetAvailableCharSets(const FaceName: AnsiString; CharSets: TStrings); [COLOR="Red"]<-- hier[/COLOR]
var      DC: THandle;
          LogFont: TLogFontA;
begin
     DC := GetDC(GetDesktopWindow);
     if DC <> 0 then
     try
      FillChar(LogFont, SizeOf(LogFont), 0);
      Move(FaceName[1], LogFont.lfFaceName, Length(FaceName));
      LogFont.lfCharSet := DEFAULT_CHARSET;
      [COLOR="Red"]EnumFontFamiliesExA[/COLOR](DC, LogFont, @EnumProc, lParam(CharSets), 0);
     finally
      ReleaseDC(GetDesktopWindow, DC)
     end
end;
tja, leider ohne Erfolg. Ich setzte meinen Haltepunkt auf die 1. Zeile der EnumProc, aber ich komme einfach nicht da rein.
Wenn ich es richtig weiß, ist @EnumProc doch ein Zeiger auf die Funktion EnumProc.
Ich habe diese Technik noch nicht wirklich soweit verinnerlicht, dass ich sagen könnte, "ok, hab's kapiert"

vielleicht aber hast du nen Link auf ne gute Doku, zumindest lernen und begreifen möcht ich das schon mal, wenn ich's auch nicht gleich brauche.


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