PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Etat Windev avec police dynamique ?
Etat Windev avec police dynamique ?
Débuté par mlion, 23 jan. 2017 12:40 - 2 réponses
Membre enregistré
326 messages
Popularité : +15 (19 votes)
Posté le 23 janvier 2017 - 12:40
Bonjour,
J'ai cherché dans la documentation et dans les forums comment adapter dynamiquement la taille d'une police en fonction du contenu du champ à imprimer et de la largeur de la Zone Je n'ai pas trouvé. J'ai donc fait rapidement ce bout de code qui permet de modifier la taille (ici un titre d'état mais le code est adaptable à d'autres champs) en fonction de la longueur de celui-ci.
Je n'ai fait la modification de police qu'en tenant compte de la largeur sans me soucier de la hauteur (là aussi il faudrait tester la hauteur). Je passe d'une police de 48 à 8 via des pas + ou - grands.
J'utilise la fonction ilargeurtexte avec ipolice mais non utilisables dans un état Windev donc je suis aussi obligé d'utiliser PoliceCrée utilisable dans un état ! (pas simple).
Voilà le code mis dans mon état :

TITREDOC = gMon_titre // passer en paramètre à l'état

iCréePolice(1,48,iGras,"Trebuchet MS")
iCréePolice(2,45,iGras,"Trebuchet MS")
iCréePolice(3,40,iGras,"Trebuchet MS")
iCréePolice(4,35,iGras,"Trebuchet MS")
iCréePolice(5,30,iGras,"Trebuchet MS")
iCréePolice(6,25,iGras,"Trebuchet MS")
iCréePolice(7,20,iGras,"Trebuchet MS")
iCréePolice(8,15,iGras,"Trebuchet MS")
iCréePolice(9,12,iGras,"Trebuchet MS")
iCréePolice(10,10,iGras,"Trebuchet MS")
iCréePolice(11,8,iGras,"Trebuchet MS")

Mapolice_1 est une Police = PoliceCrée("Trebuchet MS",48,iGras)
Mapolice_2 est une Police = PoliceCrée("Trebuchet MS",45,iGras)
Mapolice_3 est une Police = PoliceCrée("Trebuchet MS",40,iGras)
Mapolice_4 est une Police = PoliceCrée("Trebuchet MS",35,iGras)
Mapolice_5 est une Police = PoliceCrée("Trebuchet MS",30,iGras)
Mapolice_6 est une Police = PoliceCrée("Trebuchet MS",25,iGras)
Mapolice_7 est une Police = PoliceCrée("Trebuchet MS",20,iGras)
Mapolice_8 est une Police = PoliceCrée("Trebuchet MS",15,iGras)
Mapolice_9 est une Police = PoliceCrée("Trebuchet MS",12,iGras)
Mapolice_10 est une Police = PoliceCrée("Trebuchet MS",10,iGras)
Mapolice_11 est une Police = PoliceCrée("Trebuchet MS",8,iGras)

Malargeur est un entier
Trace("largeur boite = " + TITREDOC..Largeur)
POUR i = 1 A 11
Malargeur = iLargeurTexte(iPolice(i) + gMon_titre)
SI Malargeur < TITREDOC..Largeur - 2 ALORS // on retire 2 ce qui évite que le titre soit tronqué ?!
Trace("i = " + i + " " + Malargeur)
TITREDOC..Police = {"Mapolice_"+i,indVariable}
SORTIR
FIN
FIN


Question : Je trouve cela un peu lourd -> y a t-il plus simple que mon code ou pas ?
N'est-ce pas étonnant que PCSoft n'ait pas une fonction déjà existante ?

Merci de vos lumières.

Michel.
Posté le 23 janvier 2017 - 15:04
Bonjour

non, il n'y a pas de fonction existante.

Mets simplement ton code dans une procédure globale avec le nom du champ
et la chaine en paramètre, et tu as créé la fonction en question.

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com

Le 1/23/2017 à 6:40 AM, mlion a écrit :
Bonjour,
J'ai cherché dans la documentation et dans les forums comment adapter
dynamiquement la taille d'une police en fonction du contenu du champ à
imprimer et de la largeur de la Zone Je n'ai pas trouvé. J'ai donc fait
rapidement ce bout de code qui permet de modifier la taille (ici un
titre d'état mais le code est adaptable à d'autres champs) en fonction
de la longueur de celui-ci. Je n'ai fait la modification de police qu'en
tenant compte de la largeur sans me soucier de la hauteur (là aussi il
faudrait tester la hauteur). Je passe d'une police de 48 à 8 via des pas
+ ou - grands. J'utilise la fonction ilargeurtexte avec ipolice mais
non utilisables dans un état Windev donc je suis aussi obligé d'utiliser
PoliceCrée utilisable dans un état ! (pas simple).
Voilà le code mis dans mon état :

TITREDOC = gMon_titre // passer en paramètre à l'état

iCréePolice(1,48,iGras,"Trebuchet MS")
iCréePolice(2,45,iGras,"Trebuchet MS")
iCréePolice(3,40,iGras,"Trebuchet MS")
iCréePolice(4,35,iGras,"Trebuchet MS")
iCréePolice(5,30,iGras,"Trebuchet MS")
iCréePolice(6,25,iGras,"Trebuchet MS")
iCréePolice(7,20,iGras,"Trebuchet MS")
iCréePolice(8,15,iGras,"Trebuchet MS")
iCréePolice(9,12,iGras,"Trebuchet MS")
iCréePolice(10,10,iGras,"Trebuchet MS")
iCréePolice(11,8,iGras,"Trebuchet MS")

Mapolice_1 est une Police = PoliceCrée("Trebuchet MS",48,iGras)
Mapolice_2 est une Police = PoliceCrée("Trebuchet MS",45,iGras)
Mapolice_3 est une Police = PoliceCrée("Trebuchet MS",40,iGras)
Mapolice_4 est une Police = PoliceCrée("Trebuchet MS",35,iGras)
Mapolice_5 est une Police = PoliceCrée("Trebuchet MS",30,iGras)
Mapolice_6 est une Police = PoliceCrée("Trebuchet MS",25,iGras)
Mapolice_7 est une Police = PoliceCrée("Trebuchet MS",20,iGras)
Mapolice_8 est une Police = PoliceCrée("Trebuchet MS",15,iGras)
Mapolice_9 est une Police = PoliceCrée("Trebuchet MS",12,iGras)
Mapolice_10 est une Police = PoliceCrée("Trebuchet MS",10,iGras)
Mapolice_11 est une Police = PoliceCrée("Trebuchet MS",8,iGras)

Malargeur est un entier Trace("largeur boite = " + TITREDOC..Largeur)
POUR i = 1 A 11 Malargeur = iLargeurTexte(iPolice(i) + gMon_titre)
SI Malargeur < TITREDOC..Largeur - 2 ALORS // on retire 2 ce qui
évite que le titre soit tronqué ?!
Trace("i = " + i + " " + Malargeur)
TITREDOC..Police = {"Mapolice_"+i,indVariable}
SORTIR
FIN
FIN


Question : Je trouve cela un peu lourd -> y a t-il plus simple que mon
code ou pas ?
N'est-ce pas étonnant que PCSoft n'ait pas une fonction déjà existante ?

Merci de vos lumières.

Michel.
Posté le 19 octobre 2020 - 14:35
La fonction ci-dessous renvoie faux tant que la police est trop grande pour que le texte rentre dans la zone
Elle fonctionne dans tous les cas.

Le call se fait comme cela

TANTQUE PAS cPrint.Check_TaillePolice("LIBELLE_ETAT", LIBELLE_ETAT)
LIBELLE_ETAT..PoliceTaille--
FIN




PROCÉDURE PUBLIQUE GLOBALE Check_TaillePolice(pe_NomChamp est une chaîne, pe_Texte est une chaîne)

ol_txt est un string
ol_txt = pe_Texte

ol_strSize est un SizeF dynamique

//Regular 0 Texte Normal.
//Bold 1 Texte gras.
//Italic 2 Texte italique.
//Underline 4 Texte souligné.
//Strikeout 8 Texte barré d'une ligne à mi-hauteur.

// Reste à gérer le style (italique gras ...)
vl_val est un entier
SI {pe_NomChamp, indChamp}..PoliceGras ALORS
vl_val += 1
FIN
SI {pe_NomChamp, indChamp}..PoliceItalique ALORS
vl_val += 2
FIN
SI {pe_NomChamp, indChamp}..PoliceSoulignée ALORS
vl_val += 4
FIN
SI {pe_NomChamp, indChamp}..PoliceBarrée ALORS
vl_val += 8
FIN

ol_font est un System.Drawing.Font dynamique

SELON vl_val
CAS 0
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille)
ol_font <- ol_fnt
CAS 1
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Bold)
ol_font <- ol_fnt
CAS 2
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Italic)
ol_font <- ol_fnt
CAS 3
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Bold | FontStyle.Italic)
ol_font <- ol_fnt
CAS 4
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Underline)
ol_font <- ol_fnt
CAS 5
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Underline | FontStyle.Bold)
ol_font <- ol_fnt
CAS 6
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Underline | FontStyle.Italic)
ol_font <- ol_fnt
CAS 7
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Bold | FontStyle.Italic | FontStyle.Underline)
ol_font <- ol_fnt
CAS 8
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout)
ol_font <- ol_fnt
CAS 9
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Bold)
ol_font <- ol_fnt
CAS 10
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Italic)
ol_font <- ol_fnt
CAS 11
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Bold | FontStyle.Italic)
ol_font <- ol_fnt
CAS 12
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Underline)
ol_font <- ol_fnt
CAS 13
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Underline | FontStyle.Bold)
ol_font <- ol_fnt
CAS 14
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Underline | FontStyle.Italic)
ol_font <- ol_fnt
CAS 15
ol_fnt est un System.Drawing.Font({pe_NomChamp, indChamp}..PoliceNom, {pe_NomChamp, indChamp}..PoliceTaille, FontStyle.Strikeout | FontStyle.Underline | FontStyle.Italic | FontStyle.Bold)
ol_font <- ol_fnt
FIN



ol_Format est un StringFormat()
ol_Format.Trimming = StringTrimming.Word

ol_pd est un PrintDocument dynamique = allouer un PrintDocument();
ol_g est un Graphics <- ol_pd.PrinterSettings.CreateMeasurementGraphics();
ol_g.PageUnit = GraphicsUnit.Millimeter


ol_strSize <- ol_g.MeasureString(ol_txt, ol_font, {pe_NomChamp, indChamp}..Largeur, ol_Format)

RENVOYER ol_strSize.Height <= {pe_NomChamp, indChamp}..Hauteur