IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Lister les CharSets d'une font


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut Lister les CharSets d'une font
    Bonjour,

    Trouvé récemment ce petit bout de code Delphi mais on dirait que j'ai un souci d'énumération, regardez, en haut à gauche mon mémo, et dessous le snippet :
    Nom : charsets.png
Affichages : 772
Taille : 33,5 Ko

    Bon, je n'ai pas essayé avec Arial Narrow Bold (je ne l'ai pas), mais les résultats sont identiques avec Arial, Arial Bold, Arial Rounded MT Bold et GNUtypewriter.

    Alors bien sûr il m'a fallu adapter, en espérant que je ne casse pas quelque chose :
    La proc de callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    function EnumCharSets(
      var LogFont: TEnumLogFontEx;
      var Metric: TNewTextMetricEx;
      FontType: Longint;
      //Strings: TStrings): Integer; stdcall; -- original mais ne compile pas
      Data: LParam):LongInt; stdcall;
    var
      L: TStringList;
      S: String;
      I: Integer;
      ID: Integer;
    begin
      L  := TStringList(ptrint(Data));
      ID := LogFont.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;
      L.Add(S);
    //  Strings.Add(S); -- original
      result := 1;
    end;
    et son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.GetAvailableCharSets(const FaceName: string; CharSets: TStrings);
    var
      DC: THandle;
      LogFont: TLogFont;
    ////EDIT : sert à rien !  L: TStringList; // nouveau, inspiré d'un post sur FreePascal *
    begin
    ////  L := TStringList.Create; // nouveau
    //  DC := GetDC(GetDesktopWindow); -- proc inconnue sous Linux
      DC := GetDC(0);
      if DC <> 0 then
        try
          FillChar(LogFont, SizeOf(LogFont), 0);
          Move(FaceName[1], LogFont.lfFaceName, Length(FaceName));
          LogFont.lfCharSet := DEFAULT_CHARSET;
          EnumFontFamiliesEx(DC, @LogFont, @EnumProc, ptrint(lParam(CharSets)), 0); // changé sinon ne compile pas (ajout "ptrint")
    ////sert à rien !      CharSets.AddStrings(L); // ajout pour renvoyer les données au mémo
        finally
    //      ReleaseDC(GetDesktopWindow, DC)
          ReleaseDC(0, DC)
        end
    end;
    Le problème, c'est qu'il est impossible de jouer en mode pas-à-pas avec une proc de callback, à chaque entrée le i du compteur de boucle est à 0...

    Merci pour le coup de main,

    ---
    * : http://forum.lazarus.freepascal.org/...?topic=20193.0

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    hello,
    Jipété ce n'est pas la peine de réinventer la roue, dans Lazarus il y a un exemple qui te liste toutes les polices avec leurs CHARSET :
    lazarus\examples\fontenum

    Nom : Polices-Lazarus.png
Affichages : 868
Taille : 69,4 Ko

    Ami calmant, J.P (sans T)

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut JP,
    Citation Envoyé par jurassic pork Voir le message
    hello,
    Jipété ce n'est pas la peine de réinventer la roue, dans Lazarus il y a un exemple qui te liste toutes les polices avec leurs CHARSET :
    lazarus\examples\fontenum
    Je n'ai jamais rien compris à cet exemple (que je connaissais), dans la mesure où je le trouve contre-intuitif, sans aucune explication, et je n'ai jamais capté pourquoi je pouvais toujours cliquer dans la liste des styles, je ne voyais jamais sa prise en compte dans la grille du bas.
    Jamais !
    Lié à Linux ? À ma vieille version de Lazarus ? Pourtant, il me semble que cet exemple était déjà là en 0.9 et j'ose espérer que les gens qui proposent des exemples les ont au moins vu fonctionner dans un environnement.

    (c'est d'ailleurs ce qu'on pourrait reprocher au dossier examples de Laz : l'absence d'une information nous disant clairement dans quel contexte il est opérationnel)

    Ensuite, recopier bêtement un exemple n'est pas très satisfaisant intellectuellement, je préfère me battre avec un bout de code pour bien le maîtriser.

    Bon, je note que sur ta copie d'écran tu nous annonces être à la tête de 342 polices, ouch !
    Ça va, l'ascenseur, quand tu as un document à rédiger avec un traitement de textes ?

    D'où l'idée qui me trotte dans la tête d'essayer d'organiser tout ça, et même s'il existe déjà des organiseurs, je n'ai pas trouvé mon bonheur dans les paquets dispo -- il y aurait bien FontMatrix, la copie d'écran est alléchante mais ça doit être une vieille version car une fois installé et lancé, ça ne lui ressemble pas du tout...

    Bref, j'ai la nécessité le besoin l'envie d'essayer de comprendre un peu tout ça, tout en sachant que même gucharmap (pour Gnome) et KCharSelect (pour Kde) ne sont pas fichus d'afficher les mêmes informations pour la même police en examen !

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    suite à la découverte hier soir à pas d'heure de deux discussions intéressantes
    https://forum.lazarus.freepascal.org...?topic=33141.0
    https://gitlab.com/freepascal.org/fp...-/issues/32495
    , j'ai un peu avancé mais il me reste une catastrophe sur les bras :

    Nom : fontenum.png
Affichages : 279
Taille : 87,6 Ko

    Dans cette image on remarque à gauche un TMemo de contrôle sous le bouton "List >> Memo", dont j'ai fait afficher le texte en rapport avec la police sélectionnée dans la liste "Fontfaces", son souci est qu'il y a des valeurs qui ne s'affichent pas, remplacées par des zones vides (les "..." solitaires), plus une curiosité : dans la ListBox le nom a une première lettre en majuscule, que l'on ne voit pas dans les infos remontées dans le memo (ne pas confondre le W de Webdings avec le _W du nom de dossier !)
    Et la catastrophe est liée à la grosse liste CacheList.Items qui affiche 355 entrées quand la ListBox n'en montre que 183.

    Pourquoi ? Parce que CacheList récupère tout, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Vollkorn Bold Italic ...Vollkorn-BoldItalic ...Vollkorn .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-BoldItalic.ttf ...Vollkorn-BoldItalic.ttf ***
    Vollkorn Bold ...Vollkorn-Bold ...Vollkorn .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-Bold.ttf ...Vollkorn-Bold.ttf ***
    Vollkorn Italic ...Vollkorn-Italic ...Vollkorn .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-Italic.ttf ...Vollkorn-Italic.ttf ***
    Vollkorn Medium Italic ...Vollkorn-MediumItalic ...Vollkorn Medium .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-MediumItalic.ttf ...Vollkorn-MediumItalic.ttf ***
    Vollkorn Medium ...Vollkorn-Medium ...Vollkorn Medium .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-Medium.ttf ...Vollkorn-Medium.ttf ***
    Vollkorn Semibold Italic ...Vollkorn-SemiboldItalic ...Vollkorn Semibold .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-SemiboldItalic.ttf ...Vollkorn-SemiboldItalic.ttf ***
    Vollkorn Semibold ...Vollkorn-Semibold ...Vollkorn Semibold .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-Semibold.ttf ...Vollkorn-Semibold.ttf ***
    Vollkorn ...Vollkorn-Regular ...Vollkorn .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-Regular.ttf ...Vollkorn-Regular.ttf ***
    qui compte pour 8, donc, quand la ListBox "Fontfaces" n'affichera qu'une ligne Vollkorn.

    Et ça, je n'arrive pas à m'en sortir : comment filtrer la sortie de CacheList ?
    Je rappelle qu'il y a 0 zéro nib' keud' aide sur le sujet...
    Alors comment faire la différence entre FindPostScriptFontName et GetPostScriptFontName par exemple ?

    Et je ne parle pas des AV's à l'exécution, certainement liés à des non-initialisations ou similaires, mais sans aide, c'est laborieux, d'autant plus que dessous vous allez trouver 2 fonts qui sont hors standard : il leur manque HumanFriendlyName, PostScriptName, FamilyName !
    Enfin, "il leur manque" c'est ce que j'écris vite, parce qu'en regardant avec un éditeur hexa dans ean13.ttf, je me rends compte que le champ ean13 y est présent plusieurs fois, alors question : la police est mal écrite ou c'est le code qui a du mal avec le folklore des fonts ?

    On notera sur l'image le TEdit tout en bas qui affiche correctement le nom de la font cliquée dans la liste et tout en haut dans le titre le nom complet, qui n'est pas bon...

    Fin du contenu du TMemo, avec les 2 fonts hors standard qui commencent par ... ... ... et qui fonctionnent très bien quand même ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [330 lignes précédentes supprimées pour alléger]
    TeXGyreTermes-Italic ...TeXGyreTermes-Italic ...TeXGyreTermes .../usr/share/fonts/fonts_shared/texgyre/texgyretermes-italic.otf ...texgyretermes-italic.otf ***
    TeXGyreTermes-Regular ...TeXGyreTermes-Regular ...TeXGyreTermes .../usr/share/fonts/fonts_shared/texgyre/texgyretermes-regular.otf ...texgyretermes-regular.otf ***
    TribOutlineSCapsSSK Italic ...TribOutlineSCapsSSK-Italic ...TribOutlineSCapsSSK .../usr/share/fonts/fonts_shared/divers_W/TRIBOSCI.TTF ...TRIBOSCI.TTF ***
    TribOutlineSCapsSSK Regular ...TribOutlineSCapsSSK ...TribOutlineSCapsSSK .../usr/share/fonts/fonts_shared/divers_W/TRIBOSC_.TTF ...TRIBOSC_.TTF ***
    TribSCapsSSK Italic ...TribSCapsSSK-Italic ...TribSCapsSSK .../usr/share/fonts/fonts_shared/divers_W/TRIBSCI_.TTF ...TRIBSCI_.TTF ***
    TribSCapsSSK Regular ...TribSCapsSSK ...TribSCapsSSK .../usr/share/fonts/fonts_shared/divers_W/TRIBSC__.TTF ...TRIBSC__.TTF ***
    Unifont CSUR ...UnifontCSURMedium ...Unifont CSUR .../usr/share/fonts/truetype/unifont/unifont_csur.ttf ...unifont_csur.ttf ***
    Unifont Sample Medium ...UnifontSampleMedium ...Unifont Sample .../usr/share/fonts/truetype/unifont/unifont_sample.ttf ...unifont_sample.ttf ***
    Unifont ...UnifontMedium ...Unifont .../usr/share/fonts/truetype/unifont/unifont.ttf ...unifont.ttf ***
    Unifont Upper ...UnifontUpperMedium ...Unifont Upper .../usr/share/fonts/truetype/unifont/unifont_upper.ttf ...unifont_upper.ttf ***
     ... ... .../usr/share/fonts/fonts_shared/divers_W/ean13.ttf ...ean13.ttf ***
     ... ... .../usr/share/fonts/fonts_shared/divers_W/webdings.ttf ...webdings.ttf ***
    Van DijkITC-Bold ...Van DijkITC-Bold ...Van Dijk .../usr/share/fonts/fonts_shared/Manuscrites/vandijkb.ttf ...vandijkb.ttf ***
    Veluvana ...Veluvana ...Veluvana .../usr/share/fonts/fonts_shared/Softerviews/Veluvana/Veluvana.otf ...Veluvana.otf ***
    Vivaldi Italic ...Vivaldii ...Vivaldi .../usr/share/fonts/fonts_shared/Manuscrites/Vivaldii.ttf ...Vivaldii.ttf ***
    Vladimir Script ...VladimirScript ...Vladimir Script .../usr/share/fonts/fonts_shared/Manuscrites/vladimir.ttf ...vladimir.ttf ***
    Vollkorn Bold Italic ...Vollkorn-BoldItalic ...Vollkorn .../usr/share/fonts/fonts_shared/vollkorn/Vollkorn-BoldItalic.ttf ...Vollkorn-BoldItalic.ttf ***
    les 7 autres lignes de Vollkorn sont ci-dessus.
    wasy10 ...wasy10 ...wasy10 .../usr/share/fonts/truetype/lyx/wasy10.ttf ...wasy10.ttf ***
    J'ai préparé un zip, pour les courageux, avec les 2 fonts bizarres, et des liens et des commentaires dans mainunit.pas : fontenum.zip

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    je ressuscite ce vieux truc car j'ai besoin d'accéder à des fichiers contenant des fontes, et il sont où, ces fichiers ? Mystère...

    J'ai tenté d'utiliser ce post, mais je ne suis pas sorti de l'auberge car selon la police choisie, c'est le SIGSEGV et impossible à débugger en pas à pas...

    Citation Envoyé par jurassic pork Voir le message
    Jipété ce n'est pas la peine de réinventer la roue, dans Lazarus il y a un exemple qui te liste toutes les polices avec leurs CHARSET :
    lazarus\examples\fontenum

    Nom : Polices-Lazarus.png
Affichages : 868
Taille : 69,4 Ko
    Ah ben nan, ça me liste des fonts que LibreOffice ne voit pas, et LibreOffice m'en affiche certaines que FontEnum n'énumère pas...

  6. #6
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour Jipété,

    J'ai trouvé ça.

    A mon avis, tes soucis avec la manipulation des fontes ne font que débuter, parce qu'il y a à la fois l'émulation de la fonction EnumFontFamiliesEX dans le widgetset GTK et le comportement de l'OS qui peut différer ce celui de Windows, et peut être même entre versions du sous-système graphique...

    bb

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    J'ai trouvé ça.
    Ben ça, ça fonctionne (si on fait abstraction du fait que "Fixed Pitch" et "Mono Font" remontent la même liste de polices).

    Citation Envoyé par bb84000 Voir le message
    A mon avis, tes soucis avec la manipulation des fontes ne font que débuter, parce qu'il y a à la fois l'émulation de la fonction EnumFontFamiliesEX dans le widgetset GTK et le comportement de l'OS qui peut différer de celui de Windows, et peut-être même entre versions du sous-système graphique...
    Mais là tu m'achèves . Je te sens bien pessimiste .
    Courage, on va s'en sortir (enfin, j'espère...)

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Yep !

    Citation Envoyé par bb84000 Voir le message
    A mon avis, tes soucis avec la manipulation des fontes ne font que débuter,
    et j'ai bien l'impression de toucher ça du doigt, exemple avec l'option Underline de FontEnumeration (et aussi l'énumération des fontes) :

    J'ai constaté avec stupéfaction que non seulement FontEnumeration ne m'énumère qu'une déclinaison de Vollkorn alors que j'en ai trois, mais en plus cet outil est incapable d'afficher le souligné qui pourtant est bien géré par LibreOffice :

    En haut FontEnum avec une seule ligne de Vollkorn, dessous, les trois lignes dans LO
    Nom : top-fontenumeration_bottom-libreoffice.png
Affichages : 247
Taille : 46,7 Ko

    Alors que faire ? Dégager ce couple FPC/Laz ? Mais le remplacer par quoi ?

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    EDIT_EDIT_EDIT : tout ce qui est en rapport avec Vollkorn est faux, lire le post suivant /EDIT

    Des précisions sur mon post d'avant-hier :

    bb84000 avait parfaitement raison, la gestion des polices c'est une prise de tête hallucinante...

    Heureusement, dans mon malheur j'ai trouvé un outil que je recommande chaudement, j'ai nommé https://fontdrop.info/ dans lequel il suffit de droper un fichier .ttf ou .otf et hop !, ça nous sort tout un tas d'infos, le problème étant que malgré ça, on ne sait pas trop ce qui se passe entre les fonts, les os et les programmes utilitaires, exemple avec Bellweather Sans, que j'aime bien pour ses chiffres minuscules, mais qui a une curieuse manière de gérer le souligné ainsi que la mise à disposition des tailles disponibles :
    FontEnumeration en haut et devant sous Linux, en bas et derrière sous W7 :
    Nom : bellweather_linux-w7.png
Affichages : 248
Taille : 86,9 Ko

    Comparez la quantité d'infos concernant les Styles, le Charset et la taille disponible, avec une astérisque sous W7 (qui met la pagaille à l'ouverture suivante de l'outil puisqu'il s'ouvre sur la dernière fonte vue avec ses paramètres et que 24* n'est pas un paramètre valide...)
    Et notez aussi l'absence de souligné sous W7, souligné plus que minimaliste sous Linux, le gag étant qu'avec LibreOffice il est correct :
    Nom : bellweather_LO.png
Affichages : 238
Taille : 3,5 Ko

    Et tout ça parce qu'en étudiant la police Vollkorn, j'ai découvert ça (où on notera que dans W7 les listbox Styles et Sizes sont mieux remplies qu'avec Bellweather -- Pourquoi ? Comment ?) :
    en haut, souligné ok dans W7, en bas Linux et pas de souligné !
    Nom : fontenum-Vollkorn.png
Affichages : 245
Taille : 108,3 Ko

    Notez aussi que le même code remonte 3 fonts Vollkorn sous W7 mais 1 seule sous Linux...

    À titre de comparaison, Arial dans les mêmes conditions, Linux en haut W7 en bas Underline coché taille 16 :
    Nom : Arial_Linux-W7.png
Affichages : 237
Taille : 71,7 Ko
    Tout est identique et correct.

    C'est vraiment décourageant, déprimant, désolant, etc.

    Bon, si j'ai le courage, je vais écrire aux auteurs des deux polices capricieuses...

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir,

    je poste parce que je viens de découvrir deux trucs qui me font halluciner.

    Dans le code de l'un des premiers posts de cette discussion, que j'ai voulu reprendre pour essayer de comprendre pourquoi aujourd'hui je n'arrive à rien, j'ai découvert que cette procédure qui fonctionnait en son temps m'envoie bouler sur les roses à la compil sans en avoir changé une virgule !
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TForm1.FormShow(Sender: TObject);
    var
      DC: THandle;
      LogFont: TLogFont;
    begin
      LogFont.lfFaceName := '';
      LogFont.lfCharSet := DEFAULT_CHARSET;
      LogFont.lfPitchAndFamily := 0;
      //lfPitchAndFamily -- Must be set to zero for all language versions of the operating system.
      // trouvé ce commentaire un jour qqpart, il me suit de code en code,
      // de prog en prog, il faudrait faire des tests plus poussés...
      DC := GetDC(0);
      if DC <> 0 then begin
        //EnumFontFamilies(DC, nil, @EnumFontClBack, Integer(Self));
        // Combobox vide si pas "Ex" et LogFont -- dessus ok sous D7, dessous ok sous Linux pas testé sous D7
        EnumFontFamiliesEx(DC, @LogFont, @EnumFontClBackEx, Integer(Self), 0);
        ReleaseDC(0, DC)
      end;
    end;
    Le gag est là, ligne 16 ci-dessus, si jamais quelqu'un voulait utiliser ça un jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumFontFamiliesEx(DC, @LogFont, @EnumFontClBackEx, Integer(Self), 0);
    Il faut transformer cette ligne en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumFontFamiliesEx(DC, @LogFont, @EnumFontClBackEx, LParam(Self), 0);

    Quant au commentaire de l'ami Bernard, il sera content de savoir pourquoi on a parfois envie de se taper la tête contre les murs.
    il y a une piste avec le second commentaire du bout de code -- ce qui induit en erreur c'est le fait qu'en Delphi c'est bon.

    Citation Envoyé par bb84000 Voir le message
    A mon avis, tes soucis avec la manipulation des fontes ne font que débuter, parce qu'il y a à la fois l'émulation de la fonction EnumFontFamiliesEX dans le widgetset GTK et le comportement de l'OS qui peut différer ce celui de Windows, et peut être même entre versions du sous-système graphique...
    Parce qu'en désespoir de cause face à un code qui compile mais ne fait rien, j'ai découvert, après avoir lancé le binaire dans un terminal, la... phrase que tue ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumFontFamilies is not yet implemented for this widgetset
    Mais la mettre en œuvre n'empêche pas de compiler et d'exécuter sans erreur, sans message, sans rien !

    Je vous vois venir, vous allez me dire qu'il ne s'agit pas des mêmes fonctions, l'une a "Ex" au bout, c'est vrai, mais comme un idiot j'ai toujours pensé que les machins nommés avec Ex étaient apparus après la publication de celles qui ne l'ont pas, un peu comme des ajouts pour compléter des choses basiques, comme les boîtes de Meccano complémentaires quand on était minots.
    Mais là non, c'est l'inverse on dirait.

    Le temps que je perds, c'est impressionnant...
    Et si j'attaque le matin confiant et détendu, le soir venu j'ai l'impression d'avoir passé la journée sur un ring avec des méchants sournois en face,

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir,

    Citation Envoyé par Jipété Voir le message
    ça me liste des fonts que LibreOffice ne voit pas, et LibreOffice m'en affiche certaines que FontEnum n'énumère pas...
    Pour la première remarque (ça me liste des fonts que LibreOffice ne voit pas), j'ai une piste :
    étant entendu que j'ai fait une version avec fpTTF du lien que j'ai donné (qui permet de trouver le fichier et son emplacement), j'ai fini par me rendre compte du gag, que je résume dans ce petit tableau :
    remplissage | fontenum orig | fontenum + fpTTF | LibreOffice |
    font sans problème | ok | ok | ok |
    font à pb (lequel ?) | ok (?) | Access Violation | pas listé |
    (désolé, je ne me souviens plus comment on définit une police à chasse fixe, donc le tableau est très moche. Et je ne sais pas pourquoi il y a des sauts de ligne.)
    Petite démo : en haut l'original à peine retouché (il y avait un petit défaut à la troisième ligne des exemples et, franchement, je n'ai pas besoin des lignes 4 et 5 pleines de polices asiatiques et autres, donc ça dégage), et en bas mon fork avec fpTTF.pp et l'ajout d'un TStatusBar pour récupérer le fichier et son chemin :
    Nom : fontenum_sans-avec_fpttf.png
Affichages : 301
Taille : 129,2 Ko
    Dans cet exemple, on voit tout en bas les infos relatives à la font Veluvana, que j'ai d'abord cliquée dans la liste des "Fontfaces", puis le résultat du clic sur "Webdings", qui fait désordre...

    Va falloir que je me fende d'un rapport de bug (et j'aime pas ça, c'est compliqué à rédiger.)
    D'un autre côté, si LibreOffice ET FontEnum forked ont un problème, c'est peut-être un problème avec la police, d'autant plus que d'autres polices ont le même pb d'AV.
    Suis un peu désappointé, là.

    Si déjà on pouvait régler le souci du point d'arrêt non respecté, ça serait peut-être plus simple.
    Mais là, je n'ai aucune espèce d'idée...

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Ah, pendant qu'on y est, il y a cet exemple, aussi, que j'aurais bien aimé voir fonctionner ; je ne montre que les changements pour pouvoir compiler (parce que ça aussi, c'est la misère) :

    original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function EnumProc2(var elf: TEnumLogFont;
      var ntm: TNewTextmetric;
      FontType: Integer;
      listbox: TListbox): Integer; stdcall;
    var
      S: string;
    begin
      if fonttype = TRUETYPE_FONTTYPE then
    ma manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function EnumProc2(var elf: TEnumLogFont;
      var ntm: TNewTextmetric;
      FontType: Integer;
    //  listbox: TListbox): Integer; stdcall;
      Data: lParam): Integer; stdcall; // nouveau
    var
      S: string;
      listbox: TListbox; // nouveau
    begin
      listbox:= TListbox(ptrint(Data)); // nouveau
      if fonttype = TRUETYPE_FONTTYPE then
    Et le résultat est désespérément vide...

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    À suivre...

    https://forum.lazarus.freepascal.org...html#msg483491

    EDIT : ah, j'allais oublier de vous parler du résultat parfois différent entre FontEnumeration et LibreOffice, regardez :
    Nom : fontenum_vs_LibreOffice.png
Affichages : 262
Taille : 62,8 Ko

    à gauche (FontEnumeration) 1 police absente à droite (LibreOffice), à droite 2 polices absentes à gauche,
    Ça peut s'expliquer, ça ? Et se corriger (ie, les deux listes identiques) ?

    Bon week-end,

  14. #14
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir,

    je suis épuisé et je n'arrive plus à réfléchir...

    Face à un bout de code de 5 lignes environ, je me suis dit "allez, tant pis, je vais leur foutre les boules, qu'ils comprennent ma misère" et donc, étant tombé sur cette page avec un gros titre D7 et bien sûr le bout de code, après grosses misères pour le faire compiler, ne donnant rien de chez rien, j'ai démarré mon vieux couple win2k/D7 et là, en 30 secondes (le temps de corriger les bidouilles lazariennes et retrouver le code original), voilà le résultat :

    Nom : enumfonts_d7.png
Affichages : 650
Taille : 20,8 Ko

    Vous voulez le code pour essayer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function EnumFontClBack(var lp: TEnumLogFont;
      var tm: TNewTextMetric;
      dwType: LongInt;//DWORD; -- la SEULE chose changée par rapport au site - on notera qu'en D7 pas de problème à retourner à l'origine.
      lpData: lParam): Integer; stdcall;
    begin
      Result := 1;
      with TForm1(lpData), Combobox1 do
      begin
        Items.Add(lp.elfLogFont.lfFaceName);
      end;
    end;
     
    procedure TForm1.FormShow(Sender: TObject);
    var
      DC: THandle;
    begin
      DC := GetDC(0);
      if DC <> 0 then begin
        //EnumFontFamilies(Canvas.Handle, nil, @EnumFontClBack, Integer(Self)); // ligne d'origine toute seule
        EnumFontFamilies(DC, nil, @EnumFontClBack, Integer(Self));
        ReleaseDC(0, DC)
      end;
    end;
     
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
      label1.Font.Name := Combobox1.Text;
    end;

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,

    (attention c'est du lourd)

    Quand je pense au temps que j'ai perdu sur cette affaire alors que dès le début ça ne pouvait pas fonctionner, ne vous étonnez pas que je haïsse les guignols qui codent ce genre d'EDI avec zéro doc intelligente derrière !

    Quoi quoi, je suis en colère ce matin ? Un peu mon neveu !
    Je me souvenais avoir lu, dans les premiers bouts de code fournis, le commentaire suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      //lf.lfPitchAndFamily := 0;  //Set this to FIXED_PITCH on Linux/GTK2
      lf.lfPitchAndFamily := FIXED_PITCH; // et donc voilà
    Nota : rien pour nous prévenir, dans le code du dossier "examples/fontenum", merci les guignols !

    Donc j'ai tenté en le rajoutant aux 5 misérables lignes présentées hier soir, et pas mieux : aucun résultat, combobox vide

    J'en ai eu marre, j'ai démarré la machine virtuelle XP avec la 1.6rc1 et là, le strict code Delphi (mise à part la microscopique correction dwType: LongInt;// DWORD; sinon pas de compilation) fonctionne tip-top ! Revoir le post précédent pour le code et le lien.

    C'est donc encore un problème de widgetset ou que sais-je d'autre sous Linux !

    Et rien, rien, rien nulle part pour l'indiquer ! Je les hais !

    Ah lala, si je pouvais jeter ce Lazarus et le remplacer par quelque chose d'opérationnel ou à tout le moins, de bien documenté, qu'est-ce que je serais content...

    Et ils ont pas honte d'écrire ça, là :
    LCLIntf is a Lazarus unit that provides compatibility with Delphi in a cross-platform way.
    Parce que hier soir à pas d'heure je lisais encore ici les instructions pour pouvoir manipuler ces structures sans rien pour m'indiquer que j'allais dans le mur...

  16. #16
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut que de misères, juste un petit truc dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function EnumFontClBack(var lp: TEnumLogFont;
      var tm: TNewTextMetric;
      dwType: LongInt;//DWORD; -- la SEULE chose changée par rapport au site - on notera qu'en D7 pas de problème à retourner à l'origine.
      lpData: lParam): Integer; stdcall;
    De mémoire, a la place de stdCall cela ne serai pas plutôt cdecl sous Linux ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  17. #17
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    :coucou;
    Citation Envoyé par BeanzMaster Voir le message
    juste un petit truc dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function EnumFontClBack(var lp: TEnumLogFont;
      var tm: TNewTextMetric;
      dwType: LongInt;//DWORD; -- la SEULE chose changée par rapport au site - on notera qu'en D7 pas de problème à retourner à l'origine.
      lpData: lParam): Integer; stdcall;
    De mémoire, à la place de stdCall cela ne serait pas plutôt cdecl sous Linux ?
    Je viens de tester, l'erreur apparaît au niveau de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumFontFamilies(DC, nil, @EnumFontClBack, Integer(Self));
    le curseur clignote au bout de @EnumFontClBack avec l'erreur
    Error: Incompatible type for arg no. 3:
    Got "<address of function
    (var tagENUMLOGFONTA,var TNewTextMetric,LongInt,LPARAM):LongInt;CDecl>",
    expected "<procedure variable type of function
    (var tagENUMLOGFONTA,var TNewTextMetric,LongInt,LPARAM):LongInt;StdCall>"
    J'en conclus que l'animal veut un stdcall !

    Citation Envoyé par BeanzMaster Voir le message
    Salut que de misères,
    La plus grosse étant que je ne vais pas pouvoir bosser sur les fonts comme je l'aurais voulu (et comme je l'aurais pu en restant dans le monde Windows, )

  18. #18
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Je ne sais pas si cela pourras t'aider dans l'exemple cité par J.P (sans T) dans laz1.8rc4 j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    function EnumFontsNoDups(
      var LogFont: TEnumLogFontEx;
      var Metric: TNewTextMetricEx;
      FontType: Longint;
      Data: LParam):LongInt; stdcall;
    var
      L: TStringList;
      S: String;
    begin
      L := TStringList(ptrint(Data));
      S := LogFont.elfLogFont.lfFaceName;
      if L.IndexOf(S)<0 then
        L.Add(S);
      result := 1;
    end;  
     
     
    procedure TfrmMain.LoadFontList;
    var
      DC: HDC;
      lf: TLogFont;
      L: TStringList;
      i: Integer;
    begin
      // this could be have done also with screen.fonts
      // but here, we have the list filtered by Charset
      lf.lfCharSet := GetCharSet;
      lf.lfFaceName := '';
      case cbPitch.ItemIndex of
        1: i:=FIXED_PITCH;
        2: i:=VARIABLE_PITCH;
        3: i:=MONO_FONT;
        else
          i:=DEFAULT_PITCH;
      end;
      lf.lfPitchAndFamily := i;
     
      {$ifdef debug}
      debugln('LoadFontList: for charset=',CharSetToString(lf.lfcharset));
      {$endif}
     
      L := TStringList.create;
      lbStyles.Clear;
      lbCharset.Clear;
      lbSizes.Clear;
     
      DC := GetDC(0);
      EnableEvents(False, lbFamily);
      try
        StartTimer;
        EnumFontFamiliesEX(DC, @lf, @EnumFontsNoDups, ptrint(L), 0);
        EndTimer;
        L.Sort;
        lbFamily.Items.Assign(L);
        lbFamily.Itemindex := -1;
     
        RestoreSelection(lbFamily);
        if lbFamily.ItemIndex<0 then begin
          if lbFamily.Items.Count>0 then
            lbFamily.ItemIndex := 0;
        end;
        LoadFamilyFonts(-1);
     
        Label4.Caption := format('Fontfaces, found %d, %d ms',[lbFamily.Items.Count, FTime]);
      finally
        EnableEvents(True, lbFamily);
        ReleaseDC(0, DC);
        L.Free;
      end;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    dans laz1.8rc4 j'ai ça
    T'as vu, ils ont sorti une rc5, pouhhh, je tremble...

    Citation Envoyé par BeanzMaster Voir le message
    dans l'exemple cité par J.P (sans T) dans laz1.8rc4 j'ai ça
    Oui, c'est l'exemple du dossier Fontenum. tu sais que pendant mes recherches je suis tombé sur des posts où le gars expliquait qu'il ne comprenait rien à cette ihm (comme moi), dont il ne comprend pas le fonctionnement (comme moi), et qu'il ne sait pas par quel bout prendre pour comprendre comment ça fonctionne -- comme moi.

    À quoi je rajouterai que lorsque j'arrive à faire réagir la grille de texte, en bas, c'est toujours en "regular" : je n'y ai jamais vu "bold" ou "italic".

    Citation Envoyé par BeanzMaster Voir le message
    Je ne sais pas si cela pourra t'aider
    Ce qui m'aiderait ça serait que quelqu'un sous Linux et Qt me dise comment se comporte le minuscule et fonctionnel bout de code Delphi que j'ai posté en dernier.

  20. #20
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour Yves, et les autres.

    Citation Envoyé par tourlourou Voir le message
    Il faudrait un peu de code pour mieux comprendre l'abord des choses.
    Alors j'ai retrouvé ça, dont je pars,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function EnumFontsNoDups(var LogFont: TEnumLogFontEx; var Metric: TNewTextMetricEx;
    //FontType: Longint; Data: LParam): LongInt; extdecl; // original de 2017 --> ne compile plus
      FontType: Longint; Data: LParam): LongInt; StdCall; // ok
    var
      L: TStrings;
      S: String;
    begin
      L := TStrings(PtrInt(Data));
      S := LogFont.elfLogFont.lfFaceName;
      if L.IndexOf(S) < 0 then begin
        L.Add(S);
        // ajout d'autres instructions pour récupérer des infos dans LogFont,
        // mais ça met une pagaille indescriptible et ça m'a bouffé des jours de ma vie
      end;
      Result := 1;
    end;
     
    procedure GetScreenFontsList(FontList: TStrings);
    var
      lf: TLogFont;
      DC: HDC;
    begin
      lf.lfCharSet := DEFAULT_CHARSET;
      lf.lfFaceName := '';
      lf.lfPitchAndFamily := 0;
      DC := GetDC(0);
      try
        EnumFontFamiliesEx(DC, @lf, @EnumFontsNoDups, PtrInt(FontList), 0);
      finally
        ReleaseDC(0, DC);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetScreenFontsList(lbFonts.Items); // lbFonts est une listbox avec Sorted à True (+ pratique).
    end;
     
    procedure TForm1.lbFontsSelectionChange(Sender: TObject; User: boolean);
    begin
      // l'idée est donc de partir de là pour la pêche aux infos et le reste.
    end;
    et les 2 commentaires que j'ai rajoutés expliquent tout, je pense.

    Plus ta précision, qui me dit d'aller jouer ailleurs que dans la proc de callback, si j'ai bien compris.

    Grand merci pour m'avoir ôté cette horrible épine du pied,

Discussions similaires

  1. [Debutant] Lister les tables d'une base de données
    Par Konrad Florczak dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/07/2005, 16h24
  2. Lister les tables d'une base
    Par pg_user dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/05/2005, 10h41
  3. [reseaux] Lister les processus sur une machine donnée
    Par BEAUJAULT dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 29/07/2004, 15h55
  4. [ODBC] Intranet en PHP : Lister les tables d'une base Access
    Par fblouet dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/10/2003, 14h46
  5. Lister les tables d'une Base
    Par YanK dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/10/2003, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo