10
votes

FireMonkey: Ajout d'une police de la ressource à la mémoire et l'utiliser

dans vcl , je pourrais charger une police de la ressource et sans l'enregistrer, je pourrais l'utiliser à partir de la mémoire.

Voici le code que j'utilise et ça marche dans VCL : xxx

in firemonkey je viens de changer bouton1.font.name à bouton1.font.family mais malheureusement La police n'a pas changé. Je pense donc que ce code n'est pas compatible avec FireMonkey.

SO en FireMonkey, comment puis-je charger une police de la ressource et l'enregistrer temporaire en mémoire et l'utiliser directement à partir de là?

Mise à jour:

J'ai vu ces pages: Installer la police dans FireMonkey , Comment utiliser des polices externes? < p> Selon MME la réponse, il semble qu'il n'y ait pas de solution pour cela problème dans FMX. Mais peut-être que nous pourrions charger la police si nous l'installons avant d'exécuter l'application. J'ai essayé presque tout, mais je ne peux toujours pas charger la police.


10 commentaires

Je suppose que votre fonction réussit dans les cas VCL et FMX?


Bien sûr, il compile, car est syntaxiquement correct. La question est de retourner le statut de réussite dans les deux cas ou non? Veuillez vérifier les erreurs chaque fois que possible.


@Freeconsulting dans les deux VCL et FMX , la fonction renvoie true . Je ne sais pas mais je pense que quelque chose ne va pas avec FontSteport: entier; j'ai changé integer à DWORD mais rien ne s'est passé ( msdn.microsoft.com/en-us/library / Windows / Bureau / ... )


PCFONTS Le paramètre n'est pas important, il reçoit simplement nombre de polices ajoutées à partir de la ressource (doit être > = 1 à son retour).


J'ai manqué d'idées, désolé. Mais j'aimerais souligner pour que les futurs lecteurs de la ressource de police de chargement fonctionnent correctement (voir révisions ) et le problème pourrait exister Dans une manipulation de la chaîne de type FMX TypeFace (peut-être pas énumérable police provoque une certaine influence).


Pourrait être associé: Stackoverflow.com/a/18413827/205376


Est-ce que quelqu'un a trouvé une solution ou une solution de contournement? - Je peux utiliser des polices personnalisées sur iOS et OS X, mais pas sur Windows à cause de ce problème.


@Hans je pense qu'il n'y a toujours pas de solution de loin en FM :(


@Sky Avez-vous trouvé une solution à cela pour Windows. J'ai pu trouver des solutions pour OSX, iOS et Android mais pas Windows ...


@lowrider n ° je n'ai pas :(


3 Réponses :


1
votes

Il y a aussi STYLOPSETTS.SSMSFamily: Propriété booléenne dans New Delphi et doit être définie sur FALSE pour avoir une famille de polices personnalisée travaillant. La même chose avec la taille, le style et le fontcolor.


5 commentaires

Je pense que ce n'est pas la raison parce que lorsque je change myFontName dans bouton1.font.name: = 'MyFontName'; à une police existante (comme Tahoma ou SEGOE UI), le change de police.


Essayez avec la taille de la police de bouton ;-)


Mettez Tbutton sur la tformologie par défaut, définissez la taille de la police sur 55, puis accédez à la case à cocher StyledSettings et à la case SSSIZE à basculer - puis jetez un coup d'œil à ce qui arrive au texte sur Tbutton lorsque vous basculez!


Je vois ce que tu veux dire. Mais mon problème ne concerne pas stynessets . Je peux changer la police comme je l'ai dit dans le premier commentaire.


En choisissant la nouvelle police de la famille dans le temps de conception, cela fonctionne. Si vous voulez faire la même chose dans le temps d'exécution, je pense que vous devriez utiliser des styles. Concevez un nouveau style de bouton à l'aide de TstyleLeBook et changez-le au moment de l'exécution :)



1
votes

Ceci peut ou non aider.

Disclaimer

Cela nécessite des recherches supplémentaires que je ne suis pas encore entourée, mais je crois que c'est un bon point de départ.

lien pour la page MSDN: - collections de police personnalisées

Vous devez utiliser l'unité WinapI.D2D1 (vous aurez peut-être besoin de FMX.TextLayout et de FMX.CANVAS.D2D également) pour accéder à l'API DirectWrite. Vous pouvez utiliser cela pour vous rendre dans les usines DirectWrite qui vous permettront de définir et de charger une police à partir de disque.

Une fois que vous avez chargé la police AFAIK, il devrait ensuite être disponible sur l'ensemble de l'application et, espérons-le, tous les contrôles FireMonkey. Il est tout à fait possible que FireMonkey n'éroduit que des polices à la charge de l'application, de sorte que cela peut tous être pour rien.

Comme je l'ai dit, cela nécessite des recherches que je n'ai pas encore devenues, alors ne fonctionnez que si vous êtes également personnalisé de peindre votre contrôle (que je serai) et que je ne serai peut-être pas approprié.


0 commentaires

0
votes

Je pense avoir une réponse, qui n'était possible que grâce à beaucoup d'aide de Roy Nelson du personnel de soutien d'Embarcadero qui m'a pointé dans la bonne direction.

J'ai vérifié que cela fonctionne avec Berlin 10.1 (sans le Patch d'anniversaire appliqué) Sous Windows 10, 64 bits, mais je ne garantis pas que cela fonctionnera sur toutes les versions de compilateur / Versions Windows et toute perspicacité dont d'autres personnes ont à offrir seraient très intéressantes d'entendre. P>

Premier Désactivé, je pense que le problème d'insurmontable (actuellement) commence par la tentative d'utilisation addfontmemresourceex strong>, comme cela produit des polices qui ne sont pas énormes et pour FireMonkey pour convertir une police TrueType installée en une police D2D graphiquement rendue. ce qu'il utilise réellement - il doit d'abord être capable de le trouver. P>

Remplacement de AddFontMemResourceEx strong> avec addfontresource strong> avec un fichier de polices temporaire que vous écrivez de la Les ressources résolvent ce problème, mais cela ne suffit pas. Après son installation, vous devez forcer le moteur de rendu TextLayout à reconstruire sa liste de polices que vous pouvez faire avec appel à deux lignes de l'unité fmx.canvas.d2d.pas forte>. P>

UnregisterCanvasClasses; //this tells it to forget everything it knows
RegisterCanvasClasses; //this tells it to learn it again based on the current state of this system, which now includes our dynamically loaded font.


2 commentaires

Oh, au fait, je pense que c'est une façon extrêmement inélégante de faire cela et je pousse que Embarcadero rend cette automatique pour toute police que vous installez dans les images / ressources d'un projet. Pour Mac et Windows. Et vous pouvez uppouver le rapport de bogue d'origine si vous êtes d'accord Quality.EmbarCadero.com/Browse/rSp-17030 .


Hmmm .. j'ai testé cela sur une machine Windows 7 64 bits et cela n'a pas fonctionné. Quelqu'un a des pensées? (Autre que "Oh, merde")