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 :

Comment récupérer précisément la taille d'un texte ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut Comment récupérer précisément la taille d'un texte ?
    Bonjour à vous, j'ai galéré pour trouver un moyen de connaitre la largeur et la hauteur en pixel d'un text, j'ai réussi à pondre cela :

    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
    // Pour connaitre la largeur d'un texte
    Function TextSize(Phrase : string; Police : TFont = nil) : TPoint;
    var
      C : TBitmap;
      S, S1, S2 : string;
      J : Integer;
    begin
    S := Phrase;
     
    C := TBitmap.create;
    if police <> nil then
       C.canvas.Font := police;
    S1 := S;
    J := 0;
    while S1 <> '' do
       begin
       if (pos(#13, S1) <= 0) and (S1 <> '') then
          S2 := S1 else
          S2 := copy(S1, 1, pos(#13, S1)-1);
       delete(s1, 1, length(s2)+2);
     
       if C.Canvas.textwidth(S2) > J then J := C.Canvas.textwidth(S2);
       end;
    Result.X := J;
    Result.Y := C.canvas.TextExtent(S).cY* (Countchar(S, #13)+1);
    C.free;
    end;
    J'ai un peu peur que ce soit long car c'est pas franchement optimisé. Quelqu'un aurait-il mieux svp

    Merci, Arrown

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Oui j'ai mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function TextSize(Text : string; AFont : TFont = nil) : TPoint;
    begin
      with TBitmap.Create do
      try
        if AFont <> nil then
          Font := AFont;
        Result := Point(Canvas.TextWidth(Text), Canvas.TextHeight(Text));
      finally
        Free;
      end;
    end;
    C'est tout

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Non, ton truc ne marche pas, il faut que je regarde mieux pourquoi, mais il me renvoie des valeurs incorrectes

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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
    Exact, ça ne renvoie qu'une approximation...
    sauf si tu utilises une police à largeur fixe

  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 : 54
    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
    Sinon, ça m'a l'air bien ç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
     
    function TextSize(Phrase:string;police:TFont=nil):TPoint;
    var
      DC: HDC;
      X: Integer;
      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;
        result.Y:=Rect.Bottom;
    finally
      C.Free;
    end;
    end;

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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
    Personne n'a trouvé mieux ? Ai-je gagné ?

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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
    Je propose un UP de ce thread pour la FAQ delphi

  8. #8
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    384
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 384
    Points : 473
    Points
    473
    Par défaut
    Il existe auusi les fonctions de TCanvas TextHeight & TextWidth ou la fonction TextExtent qui renvoie les 2 en même temps
    je pense que c'est ce que tu veux d'obtenir car ton texte tu dois bien l'écrire sur un Canvas

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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 rbh
    Il existe auusi les fonctions de TCanvas TextHeight & TextWidth ou la fonction TextExtent qui renvoie les 2 en même temps
    je pense que c'est ce que tu veux d'obtenir car ton texte tu dois bien l'écrire sur un Canvas
    Lis bien les posts précédents : TextHeight & TextWidth ne donnent pas la taille éxacte au pixel près. Les valeurs qui sont renvoyées par ces fonctions ne sont qu'approximatives sauf si tu utilises dans ton canvas une police de caractères à largeur fixe.

    Essayes, tu verras

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par waskol
    Personne n'a trouvé mieux ? Ai-je gagné ?
    Si, ma procédure est plus rapide ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      P : Tpoint;
      I : Integer;
      VCardinal : Cardinal;
    begin
    label5.caption := 'SALUT'+Slinebreak+'dfsf';
     
    Vcardinal := GTC;
    for I := 0 to 999 do
       P := utout.TextSize(label5.caption, label5.font);
    Showmessage(GTC - Vcardinal);
    bitbtn5.caption := inttostr(P.X)+','+inttostr(P.y)
    En faisant cela SUR MON ORDI (oui, c'est différent pour tt le monde) Ta procédure donne en moyenne "90"

    Et en appellant ma procédure, cela donne (avec les même résultat bien sur) "80" de GTC.

    J'ai donc gagné 8)

  11. #11
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    comment tu voit la vitesse d'execution d'un code ??

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Chez moi, GTC = GetTickCount (désolé, j'avais oublié de décrire)

    donc je calcul le temps d'une proc en nombre de cycle qu'elle a mit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      VCardinal : Cardinal; 
    begin 
    Vcardinal := GetTickCount ; 
    ......................................... TON CODE
    Showmessage(GetTickCount - Vcardinal); 
    end;
    Voilà, ca te donne une indication.

  13. #13
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Salut Arrown,

    Heu, juste un truc...

    C'est quoi GTC et utout ???
    Issus de quelle bibliothèque ???

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Utout est une de mes units perso ou il y a ... Tout.

    Et GTC, comme dit plus haut est un raccourci de GetTickCount.

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

Discussions similaires

  1. [DEBUTANT] Comment récupérer le contenu d'une zone texte
    Par josémaria dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/02/2007, 01h24
  2. comment récupérer la valeur d'une zone texte ?
    Par jessy212 dans le forum Access
    Réponses: 2
    Dernier message: 24/08/2006, 14h59
  3. comment récupérer la valeur d'un objet text dans crystal XI
    Par Dseb dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 27/07/2006, 10h07
  4. Comment récupérer le contenu de plusieurs fichiers textes ?
    Par calimero2611 dans le forum Langage
    Réponses: 9
    Dernier message: 19/02/2006, 15h45
  5. Réponses: 7
    Dernier message: 15/09/2005, 06h37

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