Bonjour à tous,
je sollicite votre aide, car je suis bloqué sur la conception d'un logiciel professionnel.
Ce logiciel est une petite BDD sqlite autonome.
J'ai créé un module d'impression grâce à l'excellent UDB PrintMGv2.au3
Cependant cette librairie n'est pas complète. Elle permet de générer directement une impression selon des coordonnées. On peut donc facilement imprimer du texte au km, ou alors des images, lignes, rectangles...etc
Mais j'ai un problème, lorsque je souhaite imprimer du texte, je n'arrive pas délimiter cette zone de texte.
Clairement, je dois découper ma chaine en fonction de la largeur de la page.
J'ai donc besoin de votre aide pour écrire une fonction qui decoupe une chaine de caractère (issue d'un TextEdit) en fonction du nombre de caractères et des « retours chariots »(@CRLF) insérés.
J'arrive à obtenir :
le nombre de caractères → StringLen()
la largeur de mon texte (en mm) → _PrintGetTextWidth
splitter en fonction des « retours chariots » → StringSplit($arme_divers, @CRLF, 1)
modélisation du problème :
SI string > 100 caractères ALORS couper la chaine afin qu'elle ne dépasse pas 100 caractères
SI string contient @CRLF ALORS couper la chaine
(pour l'instant je me moque qu'un mot soit coupé en deux, car c'est déjà assez compliqué pour moi

)
mais j'ai beaucoup de mal à ordonner ces deux fonctions pour qu'elles fonctionnent ensemble
(arraydisplay)
Merci d'avance pour votre aide.
voilà ce que l'on a pondu avec un ami, mais ça fonctionne pas complètement:
installez une imprimante virtuelle comme DoPDF ou PDFCreator pour tester le rendu lors de l’exécution du script
► Afficher le texte
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <String.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <array.au3>
#include <printMGv2.au3>
Global $hp ; dll UDF PrintMgv2
Local $mmssgg
$gui = GUICreate("formulaire", 300, 100)
$text = GUICtrlCreateEdit("", 10, 10, 280, 50, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetData(-1, "")
$Button_imprimer = GUICtrlCreateButton("Imprimer", 100, 60, 100, 30)
GUISetState()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
Case $msg = $Button_imprimer
impression()
EndSelect
Sleep(10)
WEnd
Func impression()
; chargement de la dll et definition des principaux paramètres
$hp = _PrintDllStart($mmssgg);this must always be called first
If $hp = 0 Then
MsgBox(48, "Erreur", "fichier 'PrintMG.dll' manquant ! ->" & $mmssgg & @CRLF)
EndIf
$newselect = _PrintSetPrinter($hp)
_PrintPageOrientation($hp, 1);portrait 0 = landscape
_PrintSetDocTitle($hp, "exemple")
_PrintStartPrint($hp)
_PrintSetFont($hp, 'Arial', 10, 0, '')
;------------------------------------------------------------------------------------
$text_edit = GUICtrlRead($text)
$posX_text_edit = 100 ; marge de 100 10ème de mm (voir fonction _PrintText dans PrintMgV2)
$text_edit_split = StringSplit($text_edit, @CRLF, 1) ; on splite dès qu'on detecte un retour chariot dans le "Edit"
For $i = 1 To $text_edit_split[0] Step +1
$tw_text_edit = _PrintGetTextWidth($hp, $text_edit_split[$i])
$posY_text_edit = 100
$nb_car_text = StringLen($text_edit_split[$i])
$nb_cell_text = int($nb_car_text / 65) ; la largeur dispo sur la page (zone d'impression) est egale à 65 caractères.
Local $tab[$nb_cell_text + 1]
Local $start = 0
if $tw_text_edit > 1025 Then ; si largeur du texte > 1025 10e de mm
$tab[0] = StringMid($text_edit_split[$i],1,65)
_PrintText($hp, $tab[0], $posX_text_edit, $posY_text_edit) ;
$start = $start + 66
$posY_text_edit = 140
For $j = 1 to $nb_cell_text step +1
$tab[$j] = StringMid($text_edit_split[$i], $start ,65 )
$start = $start + 65
_PrintText($hp, $tab[$j],$posX_text_edit, $posY_text_edit) ;
$posY_text_edit = $posY_text_edit + 40 ;on incremente pour passer à la ligne
Next
Else
$tab[$i-1] = StringMid($text_edit_split[$i],1,65)
EndIf
Next
_ArrayDisplay($text_edit_split)
_ArrayDisplay($tab)
_PrintEndPrint($hp)
_PrintNewPage($hp)
_printDllClose($hp)
EndFunc