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 :

BGRABitmap : obtenir la taille d'une string en pixels [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut BGRABitmap : obtenir la taille d'une string en pixels
    Bonjour à toutes et à tous,

    Je cherche à connaître la taille en pixels d'une chaîne afin de la cadrer dans une image, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TAffCarte.Infos_GPS(X, Y: Integer; Txt: String; bmp: TBGRABitmap; clText, clFond: TBGRAPixel);
    var
      h1, h2: Integer;
    begin
      bmp.FontHeight := 36;
      bmp.FontAntialias := true;
      bmp.FontStyle := [fsBold];
      h1:= bmp.Canvas.Font.GetTextWidth(Txt);
      h2:= bmp.Canvas.GetTextWidth(Txt);
     
      bmp.FillRoundRectAntialias(X-l/2, Y-15, X+l/2, Y+15, 10, 10, clFond, [rrDefault], True);
      bmp.TextOut(X-l/2, Y-10, Txt, clText);
    end;
    Si la taille du texte affiché est bien en rapport avec "FontHeight", chacune des deux lignes (h1 et h2) me renvoie systématiquement 188, qui est en rapport avec le texte choisi, mais qui n'est absolument pas en rapport avec la taille de police choisie.

    Que faut-il faire pour avoir un nombre de pixels en rapport avec la taille de la police ?

    Cordialement.

    Pierre

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bon, j'ai trouvé "une" solution, mais bon sang que c'est bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TAffCarte.Infos_GPS(X, Y: Integer; Txt: String; bmp: TBGRABitmap; clText, clFond: TBGRAPixel);
    var
      h, l: Integer;
    begin
      bmp.FontHeight := 20;
      bmp.Canvas.Font.Size:= 15;
      bmp.FontStyle := [fsBold];
      l:= bmp.Canvas.Font.GetTextWidth(Txt);
      h:= bmp.Canvas.Font.GetTextHeight(Text);
      bmp.FillRoundRectAntialias(X-10-l/2, Y-h/2, X+10+l/2, Y+h/2, 8, 8, clFond, [rrDefault], True);
      bmp.TextOut(X-l/2, Y-h/2, Txt, clText);
    end;
    - C'est le "bmp.FontHeight" qui donne la taille du texte mais ne ne joue absolument pas sur les valeurs l et h
    - C'est le " bmp.Canvas.Font.Size" qui donne les valeurs correctes de l et h, mais ne joue pas sur la taille de la police.

    NOTA : FontHeight = 4/3 de Size

    J'ai refais au moins 56 fois les manips pour être sûr de mon coup !

    Allez comprendre

    Si vous avez une meilleure solution, je suis preneur.

    Cordialement.

    Pierre

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Pas une petite idée de solution ?

    Parce que si sous Windows, ça se passe correctement, sous Linux, les longueurs obtenues ne sont pas bonnes, généralement trop petites.

    Cordialement.

    Pierre

  4. #4
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Pas une petite idée de solution ?

    Parce que si sous Windows, ça se passe correctement, sous Linux, les longueurs obtenues ne sont pas bonnes, généralement trop petites.

    Cordialement.

    Pierre
    Salut Pierre essaye de poster dans le forum Anglais, Circular est plus actif de ce côté et Lainz intervient très souvent. Ils seront mieux amenés à te répondre sur le sujet

    https://forum.lazarus.freepascal.org...oard,46.0.html

    Voici quelques sujets qui pourront peut-être t'aider
    https://forum.lazarus.freepascal.org...html#msg286182
    https://forum.lazarus.freepascal.org...html#msg313075
    https://forum.lazarus.freepascal.org...html#msg315743

    A+
    • "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

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci BeanzMaster, grâce aux liens que tu m'as donnés, j'ai trouvé cette instruction "TextSize" qui fonctionne bien sous Windows, mais qui n'en fait qu'à sa tête sous Linux :

    Si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      s: TSize;
    begin
      with bmp do
      begin
     ...
        s:= TextSize(Txt);
    j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fntrbase.pas(266,9) Error: Incompatible types: got "TSize" expected "LongWord"
    Bon, je change en LongWord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      s:LongWord;
    begin
      with bmp do
      begin
     ...
        s:= TextSize(Txt);
    j'obtiens alors la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fntrbase.pas(266,9) Error: Incompatible types: got "TSize" expected "LongWord"
    Comment se sort-on de ce piège infernal ?

    Cordialement.

    Pierre

  6. #6
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Hello ton erreur du type viens de l'ordre dans lequel sont declarées les unités. Je ne suis pas chez moi pour vérifier, regarde la fonction textsize dans bgrabitmap pour voir où est déclaré TSize. Il se trouve peut-être dans bgratypes et ce n'est donc pas celui qui est declaré dans Lazarus par défaut dans je ne sais plus quelle unité ("system", "graphics" ou LclTypes).

    A+
    Jerome
    • "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

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    BeanzMaster, dans mon unité principale, j'ai déplacé les unités "BGRA" en tête de liste, mais apparemment, cela ne change rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses
      BGRABitmapTypes, BGRABitmap, Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
      Dialogs, LResources,  ComCtrls, StdCtrls, ExtCtrls, Buttons, Menus, Grids,
      Types, Math,
    {$IFDEF Linux}
      unix,
    {$ENDIF}
      GPSUtils, GestionTuiles, InfosSat, LectureGPS, Convert;
    Mais peut-être que ce n'est pas ce qu'il faut faire ?

    Cordialement.

    Pierre

  8. #8
    Expert confirmé
    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
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    BeanzMaster, dans mon unité principale, j'ai déplacé les unités "BGRA" en tête de liste, mais apparemment, cela ne change rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses
      BGRABitmapTypes, BGRABitmap, Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
      Dialogs, LResources,  ComCtrls, StdCtrls, ExtCtrls, Buttons, Menus, Grids,
      Types, Math,
    {$IFDEF Linux}
      unix,
    {$ENDIF}
      GPSUtils, GestionTuiles, InfosSat, LectureGPS, Convert;
    Mais peut-être que ce n'est pas ce qu'il faut faire ?

    Cordialement.

    Pierre
    Il faut mieux lplacer ces unités à la fin (après ton unité Convert) Car si TSize se trouve dans BGRABitmapTypes, il sera surchargé par celui qui est ici dans "Types" qui est déclaré après dans le uses, et si il y a un TSize dans GPSUtils, ce sera lui qui sera pris en charge par défaut .
    Sous Windows TSize est également définie dans l'unité Windows, si je me souviens bien.

    Donc si TextSize utilise le TSize de BRGABitmapTypes, il faut placer ces unités ( BGRABitmapTypes, BGRABitmap) en dernière position.
    Ou sinon deuxième solution, dans le code il faut spécifier d'ou TSize provient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Var
      aSize : BGRABitmapTypes.TSize;
    • "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

  9. #9
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci BeanZMaster pour ces propositions.

    Le fait de déplacer l'endroit de déclaration des unités n'a pas résolu le problème.

    J'ai alors modifié le TSize en BGRABitmapTypes.TSize, là, un message d'erreur me dit que TSize n'existe pas. Je clique alors sur l'instruction "TextSize()" qui me renvoie à l'unité "BGRADefaultBitmap" qui me renvoie au fichier "typshrdh.inc". J'essaie alors "typshrdh.TSize" ; une erreur me dit que cela n'existe pas.

    Me vient alors l'idée de créer ce type dans une de mes unités (GPSUtils). je crée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TSize = record
      cx, cy: longInt;
    end;
    et je fais : "GPSUtils.TSize, ce qui me donne l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fntrbase.pas(274,9) Error: Incompatible types: got "TYPES.TSize" expected "GPSUTILS.TSize"
    Bon, allons-y pour un "Types.TSize" et là, Oh merveille, ça fonctionne ! En effet, l'unité "Types" renvoie au fichier "typshrdh.inc" via un "include" (ce j'aurais peut-être dû faire au lieu de "typshrdh.TSize").

    Et, cerise sur le gâteau, le cadrage est bon !

    Quels chemins de traverse quand même.

    Merci beaucoup BeanzMaster

    Cordialement.

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mesurer la taille d'une String en pixels
    Par PerpetualSnow dans le forum Silverlight
    Réponses: 7
    Dernier message: 18/02/2009, 16h04
  2. [JS] Taille d'une string en px
    Par Shivan dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/07/2006, 14h16
  3. [JDK1.5] Obtenir Annotation à partir d'une String
    Par pitoubicou dans le forum Langage
    Réponses: 9
    Dernier message: 29/03/2006, 18h37
  4. [C#][TextBox] Comment obtenir la longeur d'une string
    Par l_ourson69 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/12/2005, 10h14
  5. [JDBC] Forcer la taille d'une string
    Par julio123 dans le forum JDBC
    Réponses: 4
    Dernier message: 10/06/2004, 09h43

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