Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Name von Unicode-Zeichen (https://www.delphipraxis.net/193150-name-von-unicode-zeichen.html)

Ydobon 1. Jul 2017 09:36

AW: Name von Unicode-Zeichen
 
An den Spaß kann ich mich noch gut erinnern. Habe mich dann sogar bei Microsoft's Typography registriert um die Infos und Tools zu benutzen (Registrierung ist heute wohl nicht mehr nötig). Richtig erschreckend wie viele Fehler in den ganz normalen Schriftarten stecken.

Bei GetGlyphIndices zeigt ein Index von $FFFF an, dass die Glyphe nicht enthalten ist (bei ScriptGetCMap ist es selbstverständlich die 0). Dann braucht man noch die jeweilige default Glyphe.

Letztlich habe ich dann die ganz harte Methode benutzt, das direkte Auslesen der CMAP-Tabellen. Für cmap4 wäre das ein Beispiel.

Und ich erwähne noch einmal: http://www.babelstone.co.uk/Software/BabelMap.html

TiGü 3. Jul 2017 09:32

AW: Name von Unicode-Zeichen
 
Da ich leider nicht im Besitz der Komponenten bin (TB2..., SpTBX...), kann ich dein Programm nicht kompilieren.
Zwei Sachen fallen mir jedoch beim durchschauen auf:

Es ist etwas suboptimal, bei jedem Aufruf von GetCharName die DLL getuname.dll zu laden und entzuladen.
Hier wäre es besser, einmal statisch die Funktion GetUName in Quelltext zu definieren und zu verwenden.

Du hast meine GetCharExists-Funktion im Prinzip einfach nur kopiert, ohne zu verstehen das dort passiert.
Mein Code diente zu Testzwecken und muss natürlich angepasst werden.
So wird nämlich hier immer die Schrift des Hauptformulars verwendet, ohne auf Änderungen in cbbFontListChange einzugehen.
Hier weist du ja explizit die Schrift von cbbFontList.SelectedFont den TreeView und dem Vorschaufenster zu.
Es wäre auch Ressourcen schonender, wenn du dir die Instanzen von IDWriteGdiInterop einmalig beim Programmstart holst und als Membervariable des Formulars führst.
Eine Neuerzeugung von IDWriteFont ist dann nur noch notwendig, wenn cbbFontListChange aufgerufen wird.

Somit würde sich die GetCharExists-Funktion verkürzen auf:

Delphi-Quellcode:
function TfrmMain.GetCharExists(const Chr: Char): Boolean;
var
  HR: HRESULT;
  CharacterExists: BOOL;
begin
  Result := btnShowAllChars.Checked;
  if Result then
    Exit;

  if Assigned(FWriteFont) then
  begin
    HR := FWriteFont.HasCharacter(Ord(Chr), CharacterExists);
    Result := SUCCEEDED(HR) and CharacterExists;
  end;
end;
Die einmalige Erzeugung von IDWriteGdiInterop und die Neuerzeugung von IDWriteFont beim Schriftartwechsel überlasse ich dir mal als Fingerübung. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.
Seite 3 von 3     123   

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-2025 by Thomas Breitkreuz