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

Langage Delphi Discussion :

Ajuster automatiquement la taille d'une police en fonction de la largeur d'un label


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Ajuster automatiquement la taille d'une police en fonction de la largeur d'un label
    Bonjour,

    Je cherche un moyen d'ajuster automatiquement la taille de la police en fonction de la largeur du label.

    Quelqu'un aurait une piste ou un bout de code

    Merci d'avance

    jld

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Canvas.TextWidth('Mon texte') renvoit la largeur en pixel d'un texte donné.
    C'est peut-être une piste ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Bonjour,

    Alors, je te conseilles tout d'abord d'utiliser cette fonction, présentée dans la FAQ :
    Comment connaître la largeur et la hauteur en pixels d'un texte ?
    A partir de là, tu vas pouvoir créer une deuxième fonction que l'on va appeler CalculeTaille. Il s'agira dans cette fonction :
    - de récupérer (en faire une copie) de la police de caractère utilisée par ton Label,
    - et de faire varier sa propriété Size de 0 à -255 jusqu'à ce que la largeur du texte calculée dépasse la largeur maxi que tu aura fixé (celle de ton label)

    Mise en pratique :
    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
     
    //Fonction de la FAQ
     
    Function TextSize(Phrase : string; Police : TFont = nil) : TPoint; 
    var 
      DC: HDC; 
      Rect: TRect; 
      C : TBitmap; 
    begin 
      C := TBitmap.create; 
      try
      if police <> nil then  C.canvas.Font := police; 
     
        Rect.Left := 0; 
        Rect.Top:=0; 
        Rect.Right:=0; 
        Rect.Bottom:=0; 
        DC := GetDC(0); 
        C.Canvas.Handle := DC; 
        DrawText(C.Canvas.Handle, PChar(Phrase), Length(Phrase), Rect, (DT_EXPANDTABS or DT_CALCRECT)); 
        C.Canvas.Handle := 0; 
        ReleaseDC(0, DC); 
        result.X:=Rect.Right-Rect.Left; 
        result.Y:=Rect.Bottom-Rect.Top; 
     finally
        C.Free; 
      end;
    end;
     
    function TailleAuto(ALabel:TLabel;LargeurMax:integer);
    var F:Font;
         i:integer;
    begin
       F:=TFont.create;
       try
         F.Assign(ALAbel.Font);
         F.size:=0;
         while TextSise(ALabel.Caption;F).y<LargeurMax do F.size:=F.size-1;
         //La taille de police précédente tenait dans la largeur du Label
         if F.size<0 then F.size:=F.size+1;
         //On modifie la taille de la police du Label
         ALAbel.Font.size:=F.size;
       finally
         F.free;
       end;
    end;
     
    //Utilisation
    begin
    .....
      Label1.caption:='Mon Texte';
      TailleAuto(Label1,Label1.Width);
    .....
    end;

    Sinon, la taille du Label peut être dynamique (propriété AutoSize mise à True), c'est à dire que sa taile changera en fonction du contenu du Caption. C'était peut-être tout simplement ça que tu cherchais, donc voilà.
    Bidouilleuse Delphi

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    Merci pour l'aide

    Ca marche très bien aux ajustements suivants près :

    - Ne pas initialiser F.Size à 0 dans TailleAuto
    - Faire un while sur TextSize().x > LargeurMax

    Résultat : un label ayant sont autosize = false voit la taille de sa police varier selon la taille (nombre de caractères) qu'il contient. Attention variation en diminution pas en augmentation. Mais c'est ce que je cherchais.

    A bientôt et encore merci

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par jlderrien Voir le message
    Bonsoir,

    Merci pour l'aide

    Ca marche très bien aux ajustements suivants près :

    - Ne pas initialiser F.Size à 0 dans TailleAuto
    - Faire un while sur TextSize().x > LargeurMax

    Résultat : un label ayant sont autosize = false voit la taille de sa police varier selon la taille (nombre de caractères) qu'il contient. Attention variation en diminution pas en augmentation. Mais c'est ce que je cherchais.

    A bientôt et encore merci
    De rien
    En fait j'ai balancé le code directement sans tester parce que je n'avais pas mon Delphi sous la main.
    Je l'ai écrit directement comme ça dans la fenètre d'édition du forum. Heureuse de voir que tu t'en sois sorti et que tu aies trouvé les modifications à apporter par toi même.

    bises,
    Chloé
    Bidouilleuse Delphi

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    mon grain de sel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Size: Integer;
    begin
      Label1.Canvas.Font := Label1.Font;
      while Label1.Canvas.TextWidth(Label1.Caption) < Label1.Width do
      begin
        Size := Label1.Canvas.Font.Size;
        Label1.Canvas.Font.Size := Size + 1;
      end;
      Label1.Font.Size := Size;
      Label1.Height := Label1.Canvas.TextHeight(Label1.Caption);
    end;
    ce code ne gère que le grossissement
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Super, je prends aussi

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/11/2008, 12h05
  2. Réponses: 5
    Dernier message: 06/07/2007, 13h50
  3. Ajustement de la taille d'une fenêtre
    Par biquet dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 15/03/2007, 13h20
  4. A quoi correspond la taille d'une police ?
    Par JuLiOoOoO dans le forum Moteurs 3D
    Réponses: 1
    Dernier message: 07/03/2007, 23h29
  5. Changer la taille d'une police SDL_ttf.
    Par Kerwando dans le forum SDL
    Réponses: 4
    Dernier message: 06/06/2006, 12h10

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