RETROUVER LE NOM D'UNE POLICE DE CARACTÈRES AVEC LE REGISTRE
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
30 mai 2004 à 22:56
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 2006
-
11 juin 2004 à 21:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 11 juin 2004 à 21:04
J'ai refait le code (pas en entier bien sûr): création d'une petite unité à part que tous pourront reprendre. Par ailleurs, le problème de GetWindowsDirectory est règlé.
Plusieurs choses sur ce projet:
1) pourquoi ne pas avoir utilisé Screen.Fonts ? L'intérêt est nul puisque cela ne nous donne pas le nom du fichier. De plus, le nom donné par Screen.Fonts n'est pas le nom de la clé dans le registre: respectivement "Arial" et "Arial (TrueType)".
2) avant la mise à jour, il n'y avait que la TListBox et on ne voyait pas très rapidement le nom des polices. J'ai donc ajouté un TListView. Critique: si j'avais énuméré les valeurs du registre puis lu leur contenu, ça aurait été plus rapide. Certes, mais cette méthode n'illustre pas le principe du projet.
3) Le TListView ne fait pas la liste de toutes les polices du système mais seulement de celles qui se trouvent dans un dossier précis donné par l'utilisateur. Si je sélectionne 5 polices et que je les met dans un dossier, si je demande au programme de me donner leurs noms, je n'aurais que leurs noms (et pas les autres). Par défaut, dans le programme, le répertoire est c:\windows\fonts\. Mais en modifiant le programme, on arrive facilement à quelques résultats.
J'espère avoir été compréhensible...
cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 3 juin 2004 à 21:11
[DelphiProg]
1) J'ai admis que la majeure partie des gens ont un simple c:\windows\.
2) Je ne connaissais pas GetWindowsDirectory, mais une autre qui détecte C:\Program Files\. C'est surement pas si différent ??
3) Pourtant, je fais l'effort de séparer les codes. J'ai justement fait une procédure qui peut être réutilisable, mais je ne peux toujours pas m'empêcher d'utiliser l'interface. Une procedure avec 40000 paramètres n'est pas forcément agréable. De plus, il suffit de remplacer que quelques lignes...
[DrJerome]
1) Je n'ai pas détecté direct dans le fichier, car je ne suis pas renseigné au niveau des entêtes et de la manière dont les fichiers TTF sont bâtis. Donc, le registre est facile...
2) Ton code à l'air sympa.
[DelphiCool]
Je suis toujours dans l'excellent bon vieux Win98 et ne connait pas la disposition de WinXP. Ce décalage temporel sera prochaînement résolu.
DelphiCool
Messages postés455Date d'inscriptionmardi 24 juillet 2001StatutMembreDernière intervention10 mars 2009 31 mai 2004 à 13:40
je crois que le mieux c'est que tu créer une variable globale (windows et system)
et tu recherche les chemin avec les API windows
J'ai XP Pro et pas de répertoire WINNT
DelphiCool
Messages postés455Date d'inscriptionmardi 24 juillet 2001StatutMembreDernière intervention10 mars 2009 31 mai 2004 à 13:23
comme dit delphiprog.
il est preférable de mettre ceci dans FormCreate
var Arr :Array[0..255]of char;
Windows :string;
begin
GetWindowsDirectory(Arr, 255);
Windows := Arr;
if Windows[length(Windows)] <> '\' then Windows := Windows + '\';
frPolices.Show;
EnumFiles( cbPolices.Items, Windows + '\fonts', '*.ttf;*.fon');
end;
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 31 mai 2004 à 09:58
j'avais fait une autre méthode différente pour analyser les polices et leur nom interne (c'est pas la meilleure méthode là non plus...j'en conviens !)
Toutefois, il y a 3-4 ans en arrière, j'ai fait un logiciel de création de police d'écriture (je créais les caractères par des courbes de Bézier), il est possible de prendre directement le nom réél d'une police dans son code (fichier ttf par exemple) c'est ce que j'utilisais dans mon logiciel, si un jour j'ai le temps, je ressortirai ce code...
Voici 2 images de mon logiciel (que je n'ai jamais commercialisé car fait pour le plaisir dès le départ :)
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 30 mai 2004 à 22:56
J'aurais quelques remarques à faire :
1- le disque sur lequel est installé Windows est supposé être c:. Or, sur une machine en multiboot, on peut installer différents Windows sur diférentes partitions.
2- le répertoire d'installation de Windows est par défaut \Windows (ou \WinNT) mais ce n'est pas une obligation.
Comme je l'ai déjà fait remarquer à d'autres membres sur ce site, il existe une fonction dans les API qui donne le répertoire d'installation de windows (toutes versions) : GetWindowsDirectory.
Alors, servez-vous en !
3- je regrette que, trop souvent, le code qui serait intéressant s'il était facilement réutilisable, se trouve mélangé avec le code nécessaire à la gestion d'un interface. Ce qui oblige :
- soit à faire des copier/coller dans une autre application, (la plus mauvaise solution)
- soit à séparer les deux pour qu'il devienne enfin réellement facilement réutilisable. Mais cela entraine un travail parfois insurmontable pour certains.
DE-COU-PLER, il FAUT découpler le code de l'interface du code que l'on veut réutiliser. Comment ? eh bien tout simplement en créant une unité supplémentaire et en n'exposant dans sa partie interface que ce qui est réellement utile les d'autres unités.
Cela dit, comme le code est bien écrit, ces remarques devraient pouvoir être appliquées facilement.
Beau travail.
11 juin 2004 à 21:04
Plusieurs choses sur ce projet:
1) pourquoi ne pas avoir utilisé Screen.Fonts ? L'intérêt est nul puisque cela ne nous donne pas le nom du fichier. De plus, le nom donné par Screen.Fonts n'est pas le nom de la clé dans le registre: respectivement "Arial" et "Arial (TrueType)".
2) avant la mise à jour, il n'y avait que la TListBox et on ne voyait pas très rapidement le nom des polices. J'ai donc ajouté un TListView. Critique: si j'avais énuméré les valeurs du registre puis lu leur contenu, ça aurait été plus rapide. Certes, mais cette méthode n'illustre pas le principe du projet.
3) Le TListView ne fait pas la liste de toutes les polices du système mais seulement de celles qui se trouvent dans un dossier précis donné par l'utilisateur. Si je sélectionne 5 polices et que je les met dans un dossier, si je demande au programme de me donner leurs noms, je n'aurais que leurs noms (et pas les autres). Par défaut, dans le programme, le répertoire est c:\windows\fonts\. Mais en modifiant le programme, on arrive facilement à quelques résultats.
J'espère avoir été compréhensible...
3 juin 2004 à 21:11
1) J'ai admis que la majeure partie des gens ont un simple c:\windows\.
2) Je ne connaissais pas GetWindowsDirectory, mais une autre qui détecte C:\Program Files\. C'est surement pas si différent ??
3) Pourtant, je fais l'effort de séparer les codes. J'ai justement fait une procédure qui peut être réutilisable, mais je ne peux toujours pas m'empêcher d'utiliser l'interface. Une procedure avec 40000 paramètres n'est pas forcément agréable. De plus, il suffit de remplacer que quelques lignes...
[DrJerome]
1) Je n'ai pas détecté direct dans le fichier, car je ne suis pas renseigné au niveau des entêtes et de la manière dont les fichiers TTF sont bâtis. Donc, le registre est facile...
2) Ton code à l'air sympa.
[DelphiCool]
Je suis toujours dans l'excellent bon vieux Win98 et ne connait pas la disposition de WinXP. Ce décalage temporel sera prochaînement résolu.
31 mai 2004 à 13:40
et tu recherche les chemin avec les API windows
J'ai XP Pro et pas de répertoire WINNT
31 mai 2004 à 13:23
il est preférable de mettre ceci dans FormCreate
var Arr :Array[0..255]of char;
Windows :string;
begin
GetWindowsDirectory(Arr, 255);
Windows := Arr;
if Windows[length(Windows)] <> '\' then Windows := Windows + '\';
frPolices.Show;
EnumFiles( cbPolices.Items, Windows + '\fonts', '*.ttf;*.fon');
end;
31 mai 2004 à 09:58
(http://jerome-rod.chez.tiscali.fr//images/glyf1.JPG
et
http://jerome-rod.chez.tiscali.fr//images/glyf2.JPG)
l'indien que j'ai créé en caractère de police et que j'ai mis dans mon, logo :
http://jerome-rod.chez.tiscali.fr//jroddore.gif
DrJerome JROD DorotheeJ
31 mai 2004 à 09:53
http://www.phidels.com/php/index.php3?page=../php/pagetelechargementzip.php3&id=515
j'avais fait une autre méthode différente pour analyser les polices et leur nom interne (c'est pas la meilleure méthode là non plus...j'en conviens !)
Toutefois, il y a 3-4 ans en arrière, j'ai fait un logiciel de création de police d'écriture (je créais les caractères par des courbes de Bézier), il est possible de prendre directement le nom réél d'une police dans son code (fichier ttf par exemple) c'est ce que j'utilisais dans mon logiciel, si un jour j'ai le temps, je ressortirai ce code...
Voici 2 images de mon logiciel (que je n'ai jamais commercialisé car fait pour le plaisir dès le départ :)
http://jerome-rod.chez.tiscali.fr//images/glyf1.JPG
http://jerome-rod.chez.tiscali.fr//images/glyf2.JPG
30 mai 2004 à 22:56
1- le disque sur lequel est installé Windows est supposé être c:. Or, sur une machine en multiboot, on peut installer différents Windows sur diférentes partitions.
2- le répertoire d'installation de Windows est par défaut \Windows (ou \WinNT) mais ce n'est pas une obligation.
Comme je l'ai déjà fait remarquer à d'autres membres sur ce site, il existe une fonction dans les API qui donne le répertoire d'installation de windows (toutes versions) : GetWindowsDirectory.
Alors, servez-vous en !
3- je regrette que, trop souvent, le code qui serait intéressant s'il était facilement réutilisable, se trouve mélangé avec le code nécessaire à la gestion d'un interface. Ce qui oblige :
- soit à faire des copier/coller dans une autre application, (la plus mauvaise solution)
- soit à séparer les deux pour qu'il devienne enfin réellement facilement réutilisable. Mais cela entraine un travail parfois insurmontable pour certains.
DE-COU-PLER, il FAUT découpler le code de l'interface du code que l'on veut réutiliser. Comment ? eh bien tout simplement en créant une unité supplémentaire et en n'exposant dans sa partie interface que ce qui est réellement utile les d'autres unités.
Cela dit, comme le code est bien écrit, ces remarques devraient pouvoir être appliquées facilement.
Beau travail.