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 :

Calculer la largeur optimale d'un TEdit


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut Calculer la largeur optimale d'un TEdit
    Bonjour

    Je voudrais définir la largeur d'un TEdit pour qu'elle ne dépasse pas la largeur maximum utile, c'est à dire celle du nombre de "W" qui est la lettre la plus large.

    Il faut que cela dépende automatiquement de la police du TEdit et du MaxLength (>0 ici).

    Pour trouver la bonne largeur de MonEdit je fais ce qui suit, que j'ai dû récupérer quelque part :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var C : TControlCanvas;
     
    C:=TControlCanvas.Create;
    C.control:=MonEdit;
    C.Font.Assign(MonEdit.Font); // peut-être pas utile ?
    W := C.TextWidth(StringOfChar('W', MonEdit.MaxLength) );  
    MonEdit.ClientWidth := W ;
    Malheureusement, la largeur ainsi calculée est trop petite (généralement d'un peu plus d'1 caractère).

    Savez-vous ce qui cloche ? Peut-être n'ai-je pas le bon canvas ?

    Merci pour vos suggestions.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    trouvé l’exemple suivant dans l'aide de Delphi 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    S := 'Pascal Objet est le langage qu''il me faut';
      T := Canvas.TextWidth(S);
      if T > Edit1.Width then
        Edit1.Width := T + 10;
      Edit1.Text := S;
    Aucune explication sur le "+10" ...
    Si on ne le met pas, il manque une lettre !
    Avec, c'est parfait (j'ai testé avec différentes longueurs de la chaîne) ...

    Un mystère de plus !

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Ok, merci.

    Toutefois ce que tu donnes ne marche que si la police du TEdit est exactement la même que celle de la Form dont on utilise le Canvas.

    Si tu mets le TEdit en gras, ou si tu augmentes la taille de la police de l'Edit, je pense que c'est mort.

    C'est pourquoi il faut, théoriquement, se référer au Canvas du TEdit et sa police, mais ça ne marche pas chez moi sous Lazarus.

    Pour le +10 est-ce que ce ne serait pas la différence entre Width et ClientWidth ?
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par tintinux Voir le message
    Pour le +10 est-ce que ce ne serait pas la différence entre Width et ClientWidth ?
    En fait, c'est la différence entre le rectangle défini pour l'ensemble du contrôle TEdit et le rectangle défini pour le tracé du texte.
    Après, il faut voir dans le code comment est défini ce rectangle utile... ou utiliser cette règle empirique.
    Philippe.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Yop !
    Citation Envoyé par tintinux Voir le message
    (...) Si tu mets le TEdit en gras, ou si tu augmentes la taille de la police de l'Edit, je pense que c'est mort.(...)
    Oui et non, , voir + bas
    Citation Envoyé par tintinux Voir le message
    (...) C'est pourquoi il faut, théoriquement, se référer au Canvas du TEdit et sa police, mais ça ne marche pas chez moi sous Lazarus. (...)
    Ni sous Delphi, le TEdit n'a pas de propriété Canvas...

    Cependant, en mixant ton code et celui de chris78320 comme ceci, je trouve que ça fonctionne pas mal :
    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
    C := TControlCanvas.Create;
    MonEdit := TEdit.Create(Self);
    C.control := MonEdit;
    with MonEdit do
    begin
      Parent := Form1;
      Left := 10;
      Top := 10;
      Height := 24;
      Width := 50;
      Font.Style := [fsBold]; // on commente cette ligne (ou pas), ça s'adapte !
      C.Font.Assign(MonEdit.Font); // peut-être pas utile ? --> NÉCESSAIRE !
      //W := C.TextWidth(StringOfChar('W', MonEdit.MaxLength) );
      W := C.TextWidth('Pascal Objet est le langage qu''il me faut');
      ClientWidth := W + 3; // ou 4, à voir
      Text := S;
    end;
    Mais je n'ai pas de Lazarus sous la main, juste un vieux D7
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Sous Lazarus, le code suivant fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.Button1Click(Sender: TObject);
    var C: TControlCanvas;
        W: Integer;
    begin
      C := TControlCanvas.Create;
      C.control := Edit1;
      C.Font.Assign(Edit1.Font);
      W := C.TextWidth(StringOfChar('W', Edit1.MaxLength));
      Edit1.ClientWidth := Round(W*1.14);
      C.Free;
    end;
    Par rapport à ce que renvoie TextWidth, il semble nécessaire d'augmenter la taille (ClientWidth) non pas d'une quantité fixe mais d'une quantité proportionnelle !
    Testé avec différents styles (aucun, gras, gras + italique) et un grand nombre de tailles ... le coeff 1.14 est purement empirique et peut visiblement être légèrement diminué (1.13 ne suffit pas si on met de l'italique, avec 1.15 le contrôle est un peu trop large pour les grandes tailles de texte)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,

    Ah, dans ma réponse d'hier j'avais un peu zappé la demande initiale
    Citation Envoyé par tintinux Voir le message
    Je voudrais définir la largeur d'un TEdit pour qu'elle ne dépasse pas la largeur maximum utile, c'est à dire celle du nombre de "W" qui est la lettre la plus large.

    Il faut que cela dépende automatiquement de la police du TEdit et du MaxLength (>0 ici).
    Mais il y a un truc que je ne pige pas car c'est un peu incompatible, quelque part :
    si tu définis la largeur du TEdit en fonction de la lettre "W" tu vas avoir une grande zone, et si ton texte est plein de "i" et de "l", avec une police proportionnelle ça va être plein de "blanc" au bout (j'ai testé)...

    Ou alors j'ai mal compris ?
    Ou tu ne nous as pas tout dit (utilisation finale) ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,

    ce que j'ai compris, c'est que la taille du texte à saisir est limitée (maxlength>0) et on désire fixer la taille du contrôle au maximum nécessaire, sachant que W est le caractère demandant le plus d'espace ... puisque l'utilisateur est libre de saisir ce qu'il veut.
    Alors effectivement, si on ne saisit que des caractères "étroits", il restera de la place inutilisée !

  9. #9
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Si ça peut aider voici un sujet similaire qui a déja été traité dans le forum Delphi :

    http://www.developpez.net/forums/d89...t/#post5059397

    Penser qu'il faut ajouter, à la taille du texte, la largeur du curseur de saisie qui lui aussi doit trouver sa place dans la zone client.

Discussions similaires

  1. calculer la largeur d'un objet
    Par claude nguingui dans le forum Images
    Réponses: 19
    Dernier message: 25/08/2011, 15h19
  2. [Toutes versions] calculer la largeur d'une page
    Par soubichat dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/04/2011, 23h55
  3. calcul longueur, largeur et orientation
    Par ale2000 dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 17/02/2010, 14h06
  4. jtable: calcul perso largeur de colonne
    Par r2d2abc dans le forum Composants
    Réponses: 2
    Dernier message: 26/08/2009, 14h40
  5. Calculer la largeur d'un ascenseur vertical
    Par PetitPapaNoël dans le forum MFC
    Réponses: 5
    Dernier message: 24/07/2007, 17h23

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