J'ai cherché sur code archive si je trouvais quelque chose pour afficher correctement des nombres avec PureBasic et comme je n'ai rien trouvé à ce sujet je me suis concocté une fonction Print Using en m'inspirant de celle du GFA basic.
Bien sur elle est plus basique, mais je pense qu'on peux sûrement l'améliorer. Pour l'instant elle semble correspondre à ce que je veux en faire.
J'ai pas tester tous les cas de figures.

Mais je vous fait confiance pour ça. En fait le problème d'affichage n'est pas simple à résoudre à cause des polices qui sont proportionnelles et de la façon dont Pure traite les nombres converti en chaine de caractères.
Bon je pense que cela va intéresser quelqu'un. Je n'ai pas trouvé d'autre façon que de convertir les nombres en chaine et de toute manière DrawText n'accepte que les chaines alors...
J'ai commenté au maximum la procédure et si vous pensez que l'on peux faire plus simple et mieux, n'hésitez pas à modifier le code, il est là pour ça. Il faudrait rajouter le format d'affichage en notation scientifique.
par exemple(1.27E+03).
Je suis en train de chercher une solution, mais si vous avez une idée...
voici le listing:
Code : Tout sélectionner
;Simulation de Print Using
;Auteur Good07
;Pure Basic version 3.94
;Octobre 2005
Global posx
Procedure.s Using(masque.s,nombre.s)
posx=TextLength(masque); On récupère la longueur du masque en pixels
PosDeciMasque=FindString(masque,".",1); position du point décimal du masque
PosDeciNombre=FindString(nombre,".",1); position du point décimal du nombre (si pas de décimale renvoi zéro)
MasqueDroite=Len(masque)-PosDeciMasque ; récupère le nombre de chiffre à droite du point décimal du masque
MasqueGauche=Len(masque)-(MasqueDroite+1); idem à gauche
PartieEntiere.s=Mid(nombre,1,PosDeciNombre-1); récupère la partie entière du nombre
PartieDecimale.s=Right(nombre,Len(nombre)-PosDeciNombre); idem pour la partie décimale
If PosDeciNombre=0
drnombre.s=LSet(".",MasqueDroite+1,"0"); si le nombre n'est pas décimal, rajoute un point + le nombre de zéro correspondants au masque
Else
drnombre.s="."+Left(PartieDecimale,MasqueDroite); si décimal coupe la partie décimale à afficher en fonction du masque
EndIf
Format$=RSet(Right(PartieEntiere,MasqueGauche),MasqueGauche," ")+drnombre; met le nombre au format
posx=posx-TextLength(Format$); modifie la position d'affichage qui est différente suivant la police utilisée.
ProcedureReturn Format$
EndProcedure
If OpenWindow(0, 0, 0, 600, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test Print Using") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
;-------------------------------------Exemple d'affichage
StartDrawing(WindowOutput())
DrawingMode(1)
Restore nombre
Locate(10,10)
DrawText("Affichage sans Print Using")
For i=1 To 10
Read n.f
res.s=StrF(n)
Locate(10+posx,40+pasy)
DrawText(res)
pasy+20
Next i
Locate(300,10)
DrawText("Affichage avec Print Using")
Restore nombre
pasy=0
For i=1 To 10
Read n.f
res.s=StrF(n)
Format$=Using("######.##",res); appel de la procedure: on donne le masque de formatage et le nombre à formater.
Locate (300+posx,40+pasy)
DrawText(Format$)
pasy+20
Next i
StopDrawing()
Repeat
Event = WaitWindowEvent()
Until Event = #PB_EventCloseWindow
End
DataSection
nombre:
Data.f 12.56364,1456.23,243676.12,789,18.475,145.89,3.14159265,45,4561,478
; IDE Options = PureBasic v3.94 (Windows - x86)
