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.