OVH Cloud OVH Cloud

Largeur d'1 caractère

15 réponses
Avatar
Stéphane Lavergne
Bonjour,

Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm) de
la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?

Je m'explique sur le pourquoi de cette question, qui est 1 peu tordue :)
(l'explication est, elle aussi tordue :p) :

Je rentre du texte dans 1 champs de type Mémo.
Ce texte peut faire plus de 255 caractères (d'ou le type mémo) ou moins
aussi.

Par contre, j'ai 1 état statique qui ne doit pas dépasser 1 page, et où il y
a de grandes zones pour imprimer ces mémos.
Il ne faut pas que le controle contenant le mémo dans l'état ne s'agrandisse
si la place réservée est insuffisante. En effet, la page de l'état est
pleine et il ne faut pas 2 pages.
Dans ces grandes zones, je peux imprimer plus que 255 caractères.

En faisant quelques tests, j'ai pu en déduire que par exemple, sur 1 zone,
je pouvais imprimer 308 m ou 488 e.
Partant de ces chiffres, j'avais pensé faire 1 procédure sur BeforeUpdate du
contrôle d'entrée dans le formulaire.
L'inconvénient, c'est que si je fixe la limite de 308 caractères maximum, je
perds de l'espace imprimable étant donné que le texte ne sera jamais
entièrement composé que de m.

Bien sûr, je pourrais réduire l'espace non imprimable, non pas en laissant
la limite des 308, mais en utilisant 1 formule empirique où j'admettrais par
exemple 308+(488-308)*2/3=428.
2 inconvénients : le 1er est du même ordre : je peux toujours avoir de
l'espace imprimable, même s'il est réduit.
Le 2e est le risque de se voir également le texte imprimé tronqué à la fin,
comme si je n'avais géré aucune limite dans le formulaire.

Donc, plutôt que de fixer 1 limite, que ce soit par l'1 ou l'autre méthode
citée ci-dessus, je me suis dis :
si je pouvais connaître la largeur d'1 caractère quel qu'il soit, sachant
que la police utilisé à l'impression est Arial taille 8, alors je pourrais
savoir si le texte entré est imprimable en entier sans qu'il puisse être
tronqué.

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane Lavergne

10 réponses

1 2
Avatar
hm15
Bonsoir Stéphane,

la police Arial est une police *proportionnelle*. Cela signifie que les
caractères n'ont justement pas la même largeur.
Un "i" ou un "l" par exemple sont plus étroits qu'un "m" ou un "w".
La taille (corps) des caractères est en fait leur hauteur. La taille 10 est
la hauteur d'un caractère qui aurait à la fois un jambage supérieur et
inférieur (comme la lettre "f" écrite à l'ancienne).
1 point typographique vaut environ 0,352 mm. Les caractères de taille 10 ont
donc une hauteur d'environ 3,5 mm.

Si tu veux réellement te baser sur la largeur, il faut que tu choisisses une
police *fixe* comme la police "Courier New". Alors tes simulations sur la
longueur des lignes auront un sens.
Mais, je suppose qu'en programmant, on doit pouvoir dire que si la hauteur
du contrôle mémo est supérieure à X, alors ne pas l'étendre ET diminuer la
taille des caractères de 2 points.

Aux programmeurs maintenant...
Bonne soirée,

Annette
---------------------------------------------------------------------------
www.horizon-micro.com


"Stéphane Lavergne" a écrit dans le message de news:
epWHc$
Bonjour,

Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm)
de

la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?

Je m'explique sur le pourquoi de cette question, qui est 1 peu tordue :)
(l'explication est, elle aussi tordue :p) :

Je rentre du texte dans 1 champs de type Mémo.
Ce texte peut faire plus de 255 caractères (d'ou le type mémo) ou moins
aussi.

Par contre, j'ai 1 état statique qui ne doit pas dépasser 1 page, et où il
y

a de grandes zones pour imprimer ces mémos.
Il ne faut pas que le controle contenant le mémo dans l'état ne
s'agrandisse

si la place réservée est insuffisante. En effet, la page de l'état est
pleine et il ne faut pas 2 pages.
Dans ces grandes zones, je peux imprimer plus que 255 caractères.

En faisant quelques tests, j'ai pu en déduire que par exemple, sur 1 zone,
je pouvais imprimer 308 m ou 488 e.
Partant de ces chiffres, j'avais pensé faire 1 procédure sur BeforeUpdate
du

contrôle d'entrée dans le formulaire.
L'inconvénient, c'est que si je fixe la limite de 308 caractères maximum,
je

perds de l'espace imprimable étant donné que le texte ne sera jamais
entièrement composé que de m.

Bien sûr, je pourrais réduire l'espace non imprimable, non pas en laissant
la limite des 308, mais en utilisant 1 formule empirique où j'admettrais
par

exemple 308+(488-308)*2/3B8.
2 inconvénients : le 1er est du même ordre : je peux toujours avoir de
l'espace imprimable, même s'il est réduit.
Le 2e est le risque de se voir également le texte imprimé tronqué à la
fin,

comme si je n'avais géré aucune limite dans le formulaire.

Donc, plutôt que de fixer 1 limite, que ce soit par l'1 ou l'autre méthode
citée ci-dessus, je me suis dis :
si je pouvais connaître la largeur d'1 caractère quel qu'il soit, sachant
que la police utilisé à l'impression est Arial taille 8, alors je pourrais
savoir si le texte entré est imprimable en entier sans qu'il puisse être
tronqué.

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane Lavergne




Avatar
Raymond [mvp]
Bonsoir Annette.

Tu as tout à fait raison, il faut passer par une police courrier mais faut
pas croire que c'est facile. La police courrier taille 12 est sensiblement
la police de référence pouvant servir aux calculs, car elle peut s'inscrire
en 1/10 de pouce en largeur et en 1/6 de pouce en hauteur. Selon la taille
de la police il va falloir faire la proportion des hauteurs et largeurs de
caractères par rapport à la taille 12 (facile ça). Il va falloir aussi tenir
compte des fins de ligne et se garder une marge d'erreur.
conclusion, chaque fois, il faut convertir la largeur du cadre en 1/10 de
pouce,la hauteur en 1/6 de pouce, multipler pour avoir le nombre maximum de
caractères imprimables à comparer avec le Len du mémo et agrandir ou
diminuer la taille jusqu'à ce que tout le texte entre dans le cadre. on peut
choisir de ne traiter que les textes qui dépassent et ignorer les textes
courts.
tout est possible mais tout a un coût.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"hm15" a écrit dans le message de
news:ex%
Bonsoir Stéphane,

la police Arial est une police *proportionnelle*. Cela signifie que les
caractères n'ont justement pas la même largeur.
Un "i" ou un "l" par exemple sont plus étroits qu'un "m" ou un "w".
La taille (corps) des caractères est en fait leur hauteur. La taille 10
est

la hauteur d'un caractère qui aurait à la fois un jambage supérieur et
inférieur (comme la lettre "f" écrite à l'ancienne).
1 point typographique vaut environ 0,352 mm. Les caractères de taille 10
ont

donc une hauteur d'environ 3,5 mm.

Si tu veux réellement te baser sur la largeur, il faut que tu choisisses
une

police *fixe* comme la police "Courier New". Alors tes simulations sur la
longueur des lignes auront un sens.
Mais, je suppose qu'en programmant, on doit pouvoir dire que si la hauteur
du contrôle mémo est supérieure à X, alors ne pas l'étendre ET diminuer la
taille des caractères de 2 points.

Aux programmeurs maintenant...
Bonne soirée,

Annette


Avatar
3stone
Salut,

"Stéphane Lavergne"
Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm) de
la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?



En pixel, si tu veux bien ;-))


Debug.Print LargeurTexte ("Débrouille toi avec ca...","Arial",10)
Debug.Print LargeurTexte ("Cela convient-il ?","Arial",8)

;-)


Option Compare Database
Option Explicit

Type Size
cx As Long
cy As Long
End Type

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal I As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Private Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As Boolean)

Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
' If hFont = 0 Then LgTexte = CVErr(xlErrValue): Exit Function
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function



--
A+
Pierre (3stone) Access MVP
--------------------------------------
Une pour tous, tous pour une ;-)
http://users.skynet.be/mpfa/charte.htm
--------------------------------------

Avatar
Stéphane Lavergne
En effet, je parlais bien de la largeur et non de la hauteur.

Je préfère pourtant imprimer en Arial plutôt qu'en Courrier, car sinon, je
perdrais de l'espace imprimable.
En effet, à lisiblité égale, on peut imprimer bien plus de caractère d'1
police truetype que d'1 police fixe.

Ce qu'il me manque donc, c'est de connaître la largeur de l'espace, du 'a'
jusqu'au 'z' etc...

Pour l'instant, la seule solution que j'ai trouvée... c'est d'imprimer
chaque caractère et de le mesurer à la règle, afin de rentrer ces mesures
dans mon code VBA Access pour calculer la longueur exacte d'un texte
quelconque.

Si il existe 1 fonction qui arrive à ressortir du fichier
c:windowsfontsarial.ttf cette largeur, je suis preneur.

Stéphane


"hm15" a écrit dans le message de
news:ex%
Bonsoir Stéphane,

la police Arial est une police *proportionnelle*. Cela signifie que les
caractères n'ont justement pas la même largeur.
Un "i" ou un "l" par exemple sont plus étroits qu'un "m" ou un "w".
La taille (corps) des caractères est en fait leur hauteur. La taille 10
est

la hauteur d'un caractère qui aurait à la fois un jambage supérieur et
inférieur (comme la lettre "f" écrite à l'ancienne).
1 point typographique vaut environ 0,352 mm. Les caractères de taille 10
ont

donc une hauteur d'environ 3,5 mm.

Si tu veux réellement te baser sur la largeur, il faut que tu choisisses
une

police *fixe* comme la police "Courier New". Alors tes simulations sur la
longueur des lignes auront un sens.
Mais, je suppose qu'en programmant, on doit pouvoir dire que si la hauteur
du contrôle mémo est supérieure à X, alors ne pas l'étendre ET diminuer la
taille des caractères de 2 points.

Aux programmeurs maintenant...
Bonne soirée,

Annette
--------------------------------------------------------------------------
-

www.horizon-micro.com


"Stéphane Lavergne" a écrit dans le message de news:
epWHc$
Bonjour,

Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm)
de

la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?

Je m'explique sur le pourquoi de cette question, qui est 1 peu tordue :)
(l'explication est, elle aussi tordue :p) :

Je rentre du texte dans 1 champs de type Mémo.
Ce texte peut faire plus de 255 caractères (d'ou le type mémo) ou moins
aussi.

Par contre, j'ai 1 état statique qui ne doit pas dépasser 1 page, et où
il


y
a de grandes zones pour imprimer ces mémos.
Il ne faut pas que le controle contenant le mémo dans l'état ne
s'agrandisse

si la place réservée est insuffisante. En effet, la page de l'état est
pleine et il ne faut pas 2 pages.
Dans ces grandes zones, je peux imprimer plus que 255 caractères.

En faisant quelques tests, j'ai pu en déduire que par exemple, sur 1
zone,


je pouvais imprimer 308 m ou 488 e.
Partant de ces chiffres, j'avais pensé faire 1 procédure sur
BeforeUpdate


du
contrôle d'entrée dans le formulaire.
L'inconvénient, c'est que si je fixe la limite de 308 caractères
maximum,


je
perds de l'espace imprimable étant donné que le texte ne sera jamais
entièrement composé que de m.

Bien sûr, je pourrais réduire l'espace non imprimable, non pas en
laissant


la limite des 308, mais en utilisant 1 formule empirique où j'admettrais
par

exemple 308+(488-308)*2/3B8.
2 inconvénients : le 1er est du même ordre : je peux toujours avoir de
l'espace imprimable, même s'il est réduit.
Le 2e est le risque de se voir également le texte imprimé tronqué à la
fin,

comme si je n'avais géré aucune limite dans le formulaire.

Donc, plutôt que de fixer 1 limite, que ce soit par l'1 ou l'autre
méthode


citée ci-dessus, je me suis dis :
si je pouvais connaître la largeur d'1 caractère quel qu'il soit,
sachant


que la police utilisé à l'impression est Arial taille 8, alors je
pourrais


savoir si le texte entré est imprimable en entier sans qu'il puisse être
tronqué.

Merci d'avance pour votre aide.

--
Cordialement,

Stéphane Lavergne








Avatar
hm15
Bonsoir Raymond,

je me doute que cela ne peut être qu'approximatif.
Toutefois, ne peut-on pas imaginer, avec une police fixe, compter le nombre
de caractères maximum que peut contenir le contrôle pour ne pas dépasser la
page, puis, au formatage, compter le nombre de caractères que contient le
champ mémo et lorsque la limite est atteinte, soit tronquer le texte en
trop, soit réduire la taille de la police (mais dans ce dernier cas, cela
oblige à faire d'autres calculs...).
C'est d'ailleurs peut-être ce que tu proposes mais tes calculs
m'impressionnent ;-)

J'ai une autre idée : dire aux utilisateurs qu'Access n'est pas un
traitement de texte et les empêcher de saisir plus de caractères qu'il ne
doit en rentrer dans la page.
Qu'en dis-tu Stéphane ???

Bonne nuit,

Annette
---------------------------------------------------------------------------
www.horizon-micro.com


"Raymond [mvp]" a écrit dans le message de
news:
Bonsoir Annette.

Tu as tout à fait raison, il faut passer par une police courrier mais faut
pas croire que c'est facile. La police courrier taille 12 est sensiblement
la police de référence pouvant servir aux calculs, car elle peut
s'inscrire

en 1/10 de pouce en largeur et en 1/6 de pouce en hauteur. Selon la taille
de la police il va falloir faire la proportion des hauteurs et largeurs de
caractères par rapport à la taille 12 (facile ça). Il va falloir aussi
tenir

compte des fins de ligne et se garder une marge d'erreur.
conclusion, chaque fois, il faut convertir la largeur du cadre en 1/10 de
pouce,la hauteur en 1/6 de pouce, multipler pour avoir le nombre maximum
de

caractères imprimables à comparer avec le Len du mémo et agrandir ou
diminuer la taille jusqu'à ce que tout le texte entre dans le cadre. on
peut

choisir de ne traiter que les textes qui dépassent et ignorer les textes
courts.
tout est possible mais tout a un coût.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA

[...]


Avatar
Stéphane Lavergne
hmhmhmmhhm

Cà m'a l'air tout bon ça !!!

<lache sa règle et son crayon>

Merci à tous les 3.

Stéphane

"3stone" a écrit dans le message de
news:3fc50a43$0$3247$
Salut,

"Stéphane Lavergne"
Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm)
de


la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?



En pixel, si tu veux bien ;-))


Debug.Print LargeurTexte ("Débrouille toi avec ca...","Arial",10)
Debug.Print LargeurTexte ("Cela convient-il ?","Arial",8)

;-)


Option Compare Database
Option Explicit

Type Size
cx As Long
cy As Long
End Type

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal I As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Private Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As
Boolean)


Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
' If hFont = 0 Then LgTexte = CVErr(xlErrValue): Exit Function
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function



--
A+
Pierre (3stone) Access MVP
--------------------------------------
Une pour tous, tous pour une ;-)
http://users.skynet.be/mpfa/charte.htm
--------------------------------------








Avatar
Stéphane Lavergne
J'ai une autre idée : dire aux utilisateurs qu'Access n'est pas un
traitement de texte et les empêcher de saisir plus de caractères qu'il ne
doit en rentrer dans la page.
Qu'en dis-tu Stéphane ???


Ca aurait été 1 très bonne idée !!
Mais c'est po moi le boss :/

:D

Bah je sens bien que le calcul va être compliqué... mais je tente :)

Stéphane

"hm15" a écrit dans le message de
news:
Bonsoir Raymond,

je me doute que cela ne peut être qu'approximatif.
Toutefois, ne peut-on pas imaginer, avec une police fixe, compter le
nombre

de caractères maximum que peut contenir le contrôle pour ne pas dépasser
la

page, puis, au formatage, compter le nombre de caractères que contient le
champ mémo et lorsque la limite est atteinte, soit tronquer le texte en
trop, soit réduire la taille de la police (mais dans ce dernier cas, cela
oblige à faire d'autres calculs...).
C'est d'ailleurs peut-être ce que tu proposes mais tes calculs
m'impressionnent ;-)

J'ai une autre idée : dire aux utilisateurs qu'Access n'est pas un
traitement de texte et les empêcher de saisir plus de caractères qu'il ne
doit en rentrer dans la page.
Qu'en dis-tu Stéphane ???

Bonne nuit,

Annette
--------------------------------------------------------------------------
-

www.horizon-micro.com


"Raymond [mvp]" a écrit dans le message de
news:
Bonsoir Annette.

Tu as tout à fait raison, il faut passer par une police courrier mais
faut


pas croire que c'est facile. La police courrier taille 12 est
sensiblement


la police de référence pouvant servir aux calculs, car elle peut
s'inscrire

en 1/10 de pouce en largeur et en 1/6 de pouce en hauteur. Selon la
taille


de la police il va falloir faire la proportion des hauteurs et largeurs
de


caractères par rapport à la taille 12 (facile ça). Il va falloir aussi
tenir

compte des fins de ligne et se garder une marge d'erreur.
conclusion, chaque fois, il faut convertir la largeur du cadre en 1/10
de


pouce,la hauteur en 1/6 de pouce, multipler pour avoir le nombre maximum
de

caractères imprimables à comparer avec le Len du mémo et agrandir ou
diminuer la taille jusqu'à ce que tout le texte entre dans le cadre. on
peut

choisir de ne traiter que les textes qui dépassent et ignorer les textes
courts.
tout est possible mais tout a un coût.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA

[...]






Avatar
Raymond [mvp]
C'est exactement ce que je propose avec la marge d'erreur de fin de ligne ,
mais stéphane n'en veut pas. il lui reste la fonction de Pierre, à lui de
voir.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour une meilleure
efficacité de tes interventions sur MPFA


"hm15" a écrit dans le message de
news:
Bonsoir Raymond,


Avatar
Stéphane Lavergne
Bonjour,

J'utilise la fonction de Pierre qui me retourne la taille en pixel d'1 texte
en arial taille 8.

Je n'ai plus qu'à convertir les pixels en centimères afin de les comparer à
la largeur d'1 zone imprimable.

Mais je dois avoir 1 erreur dans ma formule de conversion pixel => cm
J'utilise 1 pixel = 1/72 pouce et 1 pouce = 2.54 cm.

Je prends 1 exemple :
Texte exemple :
Si vous avez entré l'adresse de cette page dans la barre d'adresses,
vérifiez qu'elle est correcte. Pour vérifier vos paramètres de connexion,
cliquez sur le menu Outils, puis sur Options Internet. Dans l'onglet
Connexions, cliquez sur Paramètres réseau. Les paramètres doivent
correspondre à ceux fournis par votre administrateur réseau ou par votre
fournisseur de services Internet. Cliquez sur le bouton Précédente pour
essayer un autre lien.

J'imprime ce texte en Arial 8 sans gras ni italique dans Word.
En mesurant ce texte à la règle, j'obtient 1 longueur de 55.3 cm.
La limite de ma zone imprimable est fixée à 71.2 cm
Donc, ce texte devrait être imprimable dans ma zone en entier.
J'utilise la fonction de Pierre,
largeur_pixel_form = LargeurTexte(Me.Texte1, "Arial", 8, False, False)
et j'obtiens que ce texte fait 2 152 pixels.
En utilisant la formule que je pensais juste, mais qui est très certaiement
la source de mon erreur, j'obtiens :
(2152/72)*2.54 = 75.9 cm
L'erreur de ce calcul fait 1 différence de 75.9 - 71.2 = 4.7 cm (en trop) au
lieu de 55.3-71.2 = - 15.9 cm (longueur imprimable restante)

Savez-vous où se trouve mon erreur ? Je pense que c'est la conversion pixel
=> cm.

Merci d'avance

Stéphane

"3stone" a écrit dans le message de
news:3fc50a43$0$3247$
Salut,

"Stéphane Lavergne"
Est-il possible de connaître la longueur (en pixel ou en pouce ou en cm)
de


la taille de chaque caractère d'1 police truetype, Arial taille 8 en
l'occurence ?



En pixel, si tu veux bien ;-))


Debug.Print LargeurTexte ("Débrouille toi avec ca...","Arial",10)
Debug.Print LargeurTexte ("Cela convient-il ?","Arial",8)

;-)


Option Compare Database
Option Explicit

Type Size
cx As Long
cy As Long
End Type

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function CreateFontA Lib "gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal I As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Private Declare Function SelectObject Lib "gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function GetTextExtentPoint32A Lib "gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As Size) As Long

Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

Public Function LargeurTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, Optional Italique As
Boolean)


Dim hFont As Long
Dim hDC As Long
Dim TSize As Size
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 + 300 * Gras, Italique, 0, 0, 1, 0, 0, 0, 0, Police)
' If hFont = 0 Then LgTexte = CVErr(xlErrValue): Exit Function
If hFont = 0 Then LargeurTexte = 0: Exit Function
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), TSize
DeleteObject hFont
ReleaseDC 0, hDC
LargeurTexte = TSize.cx

End Function

--
A+
Pierre (3stone) Access MVP
--------------------------------------
Une pour tous, tous pour une ;-)
http://users.skynet.be/mpfa/charte.htm
--------------------------------------



Avatar
hm15
Bonjour Stéphane,

je fais une petite allergie aux chiffres donc je ne reprends pas tes
calculs, mais, sauf erreur, le pixel vaut 1/96 pouce sous Windows (1/72
pouce, c'est sur Mac).

Cordialement,

Annette
---------------------------------------------------------------------------
www.horizon-micro.com


"Stéphane Lavergne" a écrit dans le message de news:
#e7#
Bonjour,

J'utilise la fonction de Pierre qui me retourne la taille en pixel d'1
texte

en arial taille 8.

Je n'ai plus qu'à convertir les pixels en centimères afin de les comparer
à

la largeur d'1 zone imprimable.

Mais je dois avoir 1 erreur dans ma formule de conversion pixel => cm
J'utilise 1 pixel = 1/72 pouce et 1 pouce = 2.54 cm.

Je prends 1 exemple :
Texte exemple :
Si vous avez entré l'adresse de cette page dans la barre d'adresses,
vérifiez qu'elle est correcte. Pour vérifier vos paramètres de connexion,
cliquez sur le menu Outils, puis sur Options Internet. Dans l'onglet
Connexions, cliquez sur Paramètres réseau. Les paramètres doivent
correspondre à ceux fournis par votre administrateur réseau ou par votre
fournisseur de services Internet. Cliquez sur le bouton Précédente pour
essayer un autre lien.

J'imprime ce texte en Arial 8 sans gras ni italique dans Word.
En mesurant ce texte à la règle, j'obtient 1 longueur de 55.3 cm.
La limite de ma zone imprimable est fixée à 71.2 cm
Donc, ce texte devrait être imprimable dans ma zone en entier.
J'utilise la fonction de Pierre,
largeur_pixel_form = LargeurTexte(Me.Texte1, "Arial", 8, False, False)
et j'obtiens que ce texte fait 2 152 pixels.
En utilisant la formule que je pensais juste, mais qui est très
certaiement

la source de mon erreur, j'obtiens :
(2152/72)*2.54 = 75.9 cm
L'erreur de ce calcul fait 1 différence de 75.9 - 71.2 = 4.7 cm (en trop)
au

lieu de 55.3-71.2 = - 15.9 cm (longueur imprimable restante)

Savez-vous où se trouve mon erreur ? Je pense que c'est la conversion
pixel

=> cm.

Merci d'avance

Stéphane
[...]


1 2