Modèle de procédure d'impression...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Modèle de procédure d'impression...

Message par omega »

Bonsoir tout le monde

Il ne s'agit pas d'un problème au sens propre du terme, mais juste une proposition de solution plus professionnelle. Je m'explique:
J'ai l'habitude, dans mes programmes de gestion, d'utiliser une même méthode pour imprimer mes états. En général, ce sont des listIconGadget qui contiennent les données à imprimer, avec un titre de l'état à imprimer et parfois une date ou une période en haut de la page. Pour définir le nombre et les dimensions de mes colonnes, j'utilise C1, C2, C3 etc... C(x) représente la ligne verticale du début de la colonne (x), la largeur de la 1ère colonne est égale à c2-c1, celle de la 2ème colonne est égale à c3-c2 et ainsi de suite. Pour des raisons évidentes, l'unité de mesure utilisée est le cm et le format des pages est A4. Dans chaque procédure d'édition, je dois donc fournir:
Le titre de la page, le sous-titre (éventuellement), la date ou la période (du.... au...), le nombre de colonnes (nombre de lignes verticales), la taille de chaque colonne (largeur en cm), le titre de chaque colonne.

Je récupère alors les données de ma ListIconGadget (ligne par ligne), puis je commence à imprimer (de gauche à droite, de c1 à cn)
Dès que je termine l'impression, je ferme le cadre global du tableau (lignes horizontales du haut et du bas)

Parfois, j'ajoute : DATE ET SIGNATURE (en bas de page)

Il y a un point important à souligner: Tous les champs numériques sont alignés à droite.

Voilà. Je fais ça pour chaque Etat différent à imprimer. Ce que je souhaite: Créer UNE SEULE PROCEDURE D'IMPRESSION en passant des paramètres (au lieu de copier-coller la procédure en changeant ce qu'il y a lieu de changer).

Dans ce cas, les paramètres à passer sont :
. Le nombre de colonnes
. La taille de chaque colonne
. Le titre de chaque colonne
. Le titre de la page et sous titre
. La date ou période
. Le type du champs (numérique ou pas)

Qu'en pensez-vous? Avez-vous une proposition à me faire?

Merci d'avance

Exemple de procédure d'impression:

Code : Tout sélectionner

;-------------------------------------------------------------------------------------------------------
;------------ x,y sur imprimante --------------------------------------------------------
Procedure xcm(x.f)
result = x * (PrinterPageWidth()/21) ; 21cm A4
ProcedureReturn result
EndProcedure

;--------------------------------------------------------------------------------------------------
Procedure ycm(x.f)
result = x * (PrinterPageHeight()/29.7) ; 29,7cm A4
ProcedureReturn result
EndProcedure
;
Procedure Entete_blF()
;Afficher_entete() 
wrow=ycm(4)
c1=xcm(1.2): c2=xcm(4.5) : c3=xcm(13.5): c4=xcm(15): c5=xcm(17.5) : c6=xcm(20) : c7=xcm(20)
DrawingFont(FontID(80))
DrawText(c1, wrow, "BON DE LIVRAISON N° " + numdoc$,printcol1,printcol2) 
DrawingFont(FontID(74))
DrawText(c1, wrow+ycm(1), "(VENTE PAR FACILITE)",printcol1,printcol2) 
DrawingFont(FontID(81))
DrawText(c4, wrow, "DATE : ",printcol1,printcol2)
DrawText(c4-xcm(1), wrow+ycm(0.5), "Code Client:",printcol1,printcol2)
DrawingFont(FontID(56))
DrawText(c4+xcm(1.5), wrow,date$,printcol1,printcol2)
DrawText(c4+xcm(1.5), wrow+ycm(0.5),codeclient$,printcol1,printcol2)
wrow=wrow+ycm(2)
Box(c1, wrow, c6-c1,ycm(0.2),RGB(211, 211, 211))
wrow=wrow+ycm(0.5)
DrawText(c1, wrow, "CLIENT:",printcol1,printcol2)
DrawText(c3-xcm(4), wrow, "ADR.:",printcol1,printcol2)
DrawText(c5-xcm(2), wrow, "N° TEL.:",printcol1,printcol2)
DrawingFont(FontID(56))
DrawText(c2-xcm(1.5), wrow,client$,printcol1,printcol2)
DrawText(c4-xcm(4), wrow,ad$,printcol1,printcol2)
DrawText(c6-xcm(3), wrow,tel$,printcol1,printcol2)
wrow=wrow+ycm(0.6)
DrawingFont(FontID(81))
DrawText(c1, wrow, "TYPE DE VERS.:",printcol1,printcol2)
DrawText(c3-xcm(4), wrow, "FONC.:",printcol1,printcol2)
DrawText(c5-xcm(2), wrow, "N° CCP :",printcol1,printcol2)
DrawingFont(FontID(56))
DrawText(c2, wrow,Typever$,printcol1,printcol2)
DrawText(c4-xcm(4), wrow,fonc$,printcol1,printcol2)
DrawText(c6-xcm(3), wrow,ccp$,printcol1,printcol2)
wrow=wrow+ycm(1)
L1=wrow : L2=l1+ycm(0.8)
Box(c1, l1, c6-c1, l2-l1,RGB(211, 211, 211))     
wrow=l1+ycm(0.3)
DrawingFont(FontID(81))
DrawText(c1+xcm(1.2), wrow, "REF.",RGB(69, 69, 69),RGB(211, 211, 211)) 
DrawText(c2+xcm(2.7), wrow, "DESIGNATION",RGB(69, 69, 69),RGB(211, 211, 211))
DrawText(c3+xcm(0.4), wrow, "QTE",RGB(69, 69, 69),RGB(211, 211, 211))
DrawText(c4+xcm(0.8), wrow, "P. U",RGB(69, 69, 69),RGB(211, 211, 211))
DrawText(c5+xcm(0.5), wrow, "MONTANT",RGB(69, 69, 69),RGB(211, 211, 211))
Wrow=L2+ycm(0.4)
EndProcedure

;-------------------------------------------------------------------,
Procedure Print_blF()
numdoc$=GetGadgetText(#blf_numdoc)
If numdoc$=""
   MessageRequester("Erreur","N° de BL incorrect !")
   Goto fin_Printblf
EndIf
If CountGadgetItems(#Blf_GridProd)<=0 And CountGadgetItems(#Blf_GridVer)<=0
   MessageRequester("Erreur","Il n'y a rien à imprimer ! ")
   Goto fin_Printblf
EndIf

date$=GetGadgetText(#blf_date)
client$=GetGadgetText(#blf_client)
ad$=GetGadgetText(#blf_ad)
tel$=GetGadgetText(#blf_tel)
ccp$=GetGadgetText(#blf_ccp)
totblf$=GetGadgetText(#Blf_TotBlf)
firstver$=GetGadgetText(#Blf_FirstVer)
nbremois$=GetGadgetText(#blf_nbremois)
firstdateR$=GetGadgetText(#Blf_FirstdateR)
reste$=GetGadgetText(#blf_reste)

If PrintRequester()
   If StartPrinting("Print-Doc")
      load_printfonts()
      If StartDrawing(PrinterOutput())
         Wlig=0 
         Entete_blf ()
         DrawingFont(FontID(54))
      For wlig=0 To CountGadgetItems(#Blf_GridProd)-1
        code$=GetGadgetItemText(#Blf_GridProd,wlig,0)
        prod$=GetGadgetItemText(#Blf_GridProd,wlig,1)
        qte$=GetGadgetItemText(#Blf_GridProd,wlig,2)
        pu$=GetGadgetItemText(#Blf_GridProd,wlig,3)
        mnt$=GetGadgetItemText(#Blf_GridProd,wlig,4)

       DrawText(c1+xcm(0.2), wrow, code$,printcol1,printcol2)
       DrawText(c2+xcm(0.2), wrow, prod$,printcol1,printcol2)
       
       wpos=c4-xcm(0.4) 
       For wcar=Len (qte$) To 1 Step -1
            DrawText(wpos, wrow, Mid(qte$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
       Next wcar

       wpos=c5-xcm(0.4) 
       For wcar=Len (pu$) To 1 Step -1
            DrawText(wpos, wrow, Mid(pu$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
       Next wcar

       wpos=c6-xcm(0.4) 
       For wcar=Len (mnt$) To 1 Step -1
            DrawText(wpos, wrow, Mid(mnt$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
       Next wcar

       Wrow=Wrow+ycm(0.6)

       Next wlig
     
       lfin=wrow
      
      wcoul=RGB(0, 0, 0)
      ;1ère ligne horizontale
      LineXY(c1, l1, c6, l1,wcoul)
      ;2ème ligne horizontale
      LineXY(c1, l2, c6, l2,wcoul)
      ;dernière ligne horizontale
      LineXY(c1, lfin, c6, lfin,wcoul)
             
      ;Lignes verticales
      LineXY(c1, l1, c1, lfin,wcoul)
      LineXY(c2, l1, c2, lfin,wcoul)
      LineXY(c3, l1, c3, lfin,wcoul)
      LineXY(c4, l1, c4, lfin,wcoul)
      LineXY(c5, l1, c5, lfin,wcoul)
      LineXY(c6, l1, c6, lfin,wcoul)

      wrow=lfin+ycm(0.1)
      
      DrawingFont(FontID(82))
      DrawText(c4+xcm(0.4), wrow,"T O T A L",printcol1,printcol2)
            
       wpos=c6-xcm(0.4) 
       For wcar=Len (totblf$) To 1 Step -1
            DrawText(wpos, wrow, Mid(totblf$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
       Next wcar
      
       Wrow=Wrow+ycm(0.6)
       
       lfin=wrow

      ;dernière ligne horizontale
      LineXY(c4, lfin, c6, lfin,wcoul)
             
      ;Lignes verticales
      LineXY(c4, l1, c4, lfin,wcoul)
      LineXY(c5, l1, c5, lfin,wcoul)
      LineXY(c6, l1, c6, lfin,wcoul)
      
      l1=lfin+ycm(0.5)
      
      ;Affichage des échéances
      xcm(1.2): c2=xcm(3.5) : c3=xcm(6): c4=xcm(8.5): c5=xcm(11.5) : c6=xcm(14): c7=xcm(17): c8=xcm(20)
      L2=l1+ycm(0.8)
      Box(c1, l1, c8-c1, l2-l1,RGB(211, 211, 211))     
      wrow=l1+ycm(0.3)
      DrawingFont(FontID(84))
      DrawText(c1+xcm(0.4), wrow, "TRANCHE",RGB(69, 69, 69),RGB(211, 211, 211)) 
      DrawText(c2+xcm(0.2), wrow, "VERS. PREVU",RGB(69, 69, 69),RGB(211, 211, 211))
      DrawText(c3+xcm(0.2), wrow, "DATE PREVUE",RGB(69, 69, 69),RGB(211, 211, 211))
      DrawText(c4+xcm(0.2), wrow, "TYPE DE VERS.",RGB(69, 69, 69),RGB(211, 211, 211))
      DrawText(c5+xcm(0.2), wrow, "VERSEMENT",RGB(69, 69, 69),RGB(211, 211, 211)) 
      DrawText(c6+xcm(0.2), wrow, "DATE VERS.",RGB(69, 69, 69),RGB(211, 211, 211)) 
      DrawText(c7+xcm(0.2), wrow, "CAISSE/CPTE",RGB(69, 69, 69),RGB(211, 211, 211)) 
      Wrow=L2+ycm(0.4)
      DrawingFont(FontID(56))
      For wlig=0 To CountGadgetItems(#Blf_GridVer)-1
        tranche$=GetGadgetItemText(#Blf_GridVer,wlig,0)
        mens$=GetGadgetItemText(#Blf_GridVer,wlig,1)
        datePrev$=GetGadgetItemText(#Blf_GridVer,wlig,2)
        TypeV$=GetGadgetItemText(#Blf_GridVer,wlig,3)
        Ver$=GetGadgetItemText(#Blf_GridVer,wlig,4)
        DateVer$=GetGadgetItemText(#Blf_GridVer,wlig,5)
        cpte$=GetGadgetItemText(#Blf_GridVer,wlig,6)

        
        If Trim(tranche$)="TOTAUX"
          tranche$=Trim(tranche$)
          lfin=wrow
          ;1ère ligne horizontale
          LineXY(c1, l1, c8, l1,wcoul)
         ;2ème ligne horizontale
         LineXY(c1, l2, c8, l2,wcoul)
         ;dernière ligne horizontale
         LineXY(c1, lfin, c8, lfin,wcoul)
             
         ;Lignes verticales
         LineXY(c1, l1, c1, lfin,wcoul)
         LineXY(c2, l1, c2, lfin,wcoul)
         LineXY(c3, l1, c3, lfin,wcoul)
         LineXY(c4, l1, c4, lfin,wcoul)
         LineXY(c5, l1, c5, lfin,wcoul)
         LineXY(c6, l1, c6, lfin,wcoul)
         LineXY(c7, l1, c7, lfin,wcoul)
         LineXY(c8, l1, c8, lfin,wcoul)
         DrawingFont(FontID(82))
         l1=lfin
         Wrow=l1+ycm(0.4)
        EndIf
        
        If Trim(tranche$)="TOTAUX"
          DrawText(c1+xcm(0.4), wrow, tranche$,printcol1,printcol2)
        Else
          DrawText(c1+xcm(1.1), wrow, tranche$,printcol1,printcol2)
        EndIf  
        DrawText(c3+xcm(0.2), wrow, dateprev$,printcol1,printcol2)
        DrawText(c6+xcm(0.2), wrow, datever$,printcol1,printcol2)
        DrawText(c4+xcm(0.2), wrow, typeV$,printcol1,printcol2)
        DrawText(c7+xcm(0.2), wrow, cpte$,printcol1,printcol2)
      
        wpos=c3-xcm(0.4) 
        For wcar=Len (Mens$) To 1 Step -1
            DrawText(wpos, wrow, Mid(Mens$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
        Next wcar

       wpos=c6-xcm(0.4) 
       For wcar=Len (Ver$) To 1 Step -1
            DrawText(wpos, wrow, Mid(Ver$,wcar,1),printcol1,printcol2)
            wpos=wpos-xcm(0.18)
       Next wcar

       Wrow=Wrow+ycm(0.6)
       Next wlig
       
       DrawText(c6+xcm(0.5), wrow-ycm(0.6),"RESTE >>",printcol1,printcol2)
      
       wpos=c8-xcm(0.4) 
       For wcar=Len (Reste$) To 1 Step -1
           DrawText(wpos, wrow-ycm(0.6), Mid(reste$,wcar,1),printcol1,printcol2)
           wpos=wpos-xcm(0.18)
       Next wcar
       
      lfin=wrow
      
      wcoul=RGB(0, 0, 0)
      
      ;1ère ligne horizontale
      LineXY(c1, l1, c8, l1,wcoul)
      ;2ème ligne horizontale
      LineXY(c1, l2, c8, l2,wcoul)
      ;dernière ligne horizontale
      LineXY(c1, lfin, c8, lfin,wcoul)
             
      ;Lignes verticales
      LineXY(c1, l1, c1, lfin,wcoul)
      LineXY(c2, l1, c2, lfin,wcoul)
      LineXY(c3, l1, c3, lfin,wcoul)
      LineXY(c4, l1, c4, lfin,wcoul)
      LineXY(c5, l1, c5, lfin,wcoul)
      LineXY(c6, l1, c6, lfin,wcoul)
      LineXY(c7, l1, c7, lfin,wcoul)
      LineXY(c8, l1, c8, lfin,wcoul)
      
      
 StopDrawing()
EndIf
     
StopPrinting()
EndIf
EndIf

fin_Printblf:
load_winfonts()
EndProcedure
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Modèle de procédure d'impression...

Message par falsam »

J'ai déja codé quelque chose de similaire.

■ Le principe est de mettre dans une table de base de données en mémoire les données que tu vas transmettre à ton ListIconGadget. Cette technique est pratique parce qu'elle permet de manipuler les données trés facilement. Par exemple trier sur une colonne.

■ Le principe d'impression quand à lui est simple. On envoie la requête SQL le titre et le formatage de chacune des colonnes.

Nom de la colonne:Position X:Taille:Alignement | Nom de la colonne:Position X:Taille:Alignement

La taille n'a aucune importance si alignement à gauche.
Alignement 0 : Gauche, 2 : Droite

Lancer une impression se passe de cette manière.
Exemple : printPage(ReqSql, "Catalogue produits", "Code:50:0:0|Intitulé:150:0:0|Prix:450:100:2")

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration gadget
  #mfList
  #mfPrint 
EndEnumeration

Global Database, ReqSql.s

Declare start()

Declare startPrint()
Declare printPage(ReqSql.s, Title.s, Header.s)
Declare printHeader(Title.s, Header.s)
Declare printFooter()

Declare exit()

start()

Procedure start()
  Protected n
  ; Création de la base de données en mémoire 
  UseSQLiteDatabase()
  OpenDatabase(DataBase, ":memory:", "", "")
  
  ; Creation de la table contenant les colonnes de la table
  ReqSql = "CREATE TABLE listicon ("
  ReqSql + "col0 TEXTE,"                   ;col0
  ReqSql + "col1 TEXTE,"                   ;col1
  ReqSql + "col2 TEXTE"                    ;col2
  ReqSql + ");"
  DatabaseUpdate(DataBase, ReqSql)  
  
  ; Quelques données test
  For n = 0 To 60
    ReqSql = "insert into listicon (col0, col1, col2) values (?,?,?)"
    SetDatabaseString(Database, 0, Str(n))
    SetDatabaseString(Database, 1, "Item " + Str(n))
    SetDatabaseString(Database, 2, Str(Random(100)) + "," + LSet(Str(Random(99)), 2,"0"))
    DatabaseUpdate(DataBase, ReqSql)
  Next
  
  ; Fenetre
  OpenWindow(#mf, 0, 0, 1024, 768, "ListIcon to Printer", #PB_Window_SystemMenu| #PB_Window_ScreenCentered)
  ListIconGadget(#mfList, 10, 10, 1000, 700, "Col 0", 100) 
  AddGadgetColumn(#mfList, 1, "Col 1", 100)
  AddGadgetColumn(#mfList, 2, "Col 2", 100)
  
  ; Remplissage du tableau
  ReqSql = "Select * from listicon"
  DatabaseQuery(DataBase, ReqSql)
  While NextDatabaseRow(Database)
    AddGadgetItem(#mfList, -1, 
                  GetDatabaseString(Database, 0) + Chr(10) + 
                  GetDatabaseString(Database, 1) + Chr(10) + 
                  GetDatabaseString(Database, 2))  
  Wend
  
  ButtonGadget(#mfPrint, 10, 720, 100, 24, "Imprimer")
  
  ; Declencheur
  BindGadgetEvent(#mfPrint, @startPrint())
  BindEvent(#PB_Event_CloseWindow, @exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure startPrint()
  printPage(ReqSql, "Catalogue produits", "Code:50:0:0|Intitulé:150:0:0|Prix:450:100:2")  
EndProcedure

Procedure printPage(ReqSql.s, Title.s, Header.s)
  Protected CountLines, Top = 70, MaxLigne = 45
  Protected i, CountCol = CountString(Header, "|") + 1 
  Protected x, y, size, Align, Value.s
  
  LoadFont(0, "Courier New", 10)
  
  ;Choix de l'imprimante
  If PrintRequester()
    
    ; Préparation des données d'impression
    DatabaseQuery(DataBase, ReqSql)
    
    ; Initialise l'imprimante et démarre l'impression 
    ; On donne un nom qui apparaîtra dans la file d'attente d'impression
    If StartPrinting("PureBasic Test")
      
      ; Initialisation dessin vectoriel sur la sortie imprimante
      If StartVectorDrawing(PrinterVectorOutput())      
        ; Impression des lignes détails
        While NextDatabaseRow(Database)
          
          ; Faut il imprimer l'entete et l'enpied ?
          If CountLines = MaxLigne
            CountLines = 0
            PrintHeader(Title, Header)
            PrintFooter()
            NewVectorPage()
          EndIf
          
          VectorFont(FontID(0), 10)
          
          CountLines + 1
          y = Top + (CountLines * 15)
          
          For i = 1 To CountCol
            x = Val(StringField(StringField(Header, i, "|"), 2, ":"))
            Size = Val(StringField(StringField(Header, i, "|"), 3, ":"))
            Value = GetDatabaseString(Database, i-1)
            Align = Val(StringField(StringField(Header, i, "|"), 4, ":"))
              
            If Align = 2
              x + Size - VectorTextWidth(Value)              
            EndIf 
            
            MovePathCursor(x, y)
            DrawVectorText(GetDatabaseString(Database, i-1))              
          Next  
        Wend 
        
        ; Si derniere page, impression header et footer 
        If CountLines <> MaxLigne
          PrintHeader(Title, Header)
          PrintFooter()
        EndIf
        
        StopVectorDrawing()
      EndIf
      
      StopPrinting()
      
      MessageRequester("Information", "Impression terminée.")
    EndIf
  EndIf 
EndProcedure

Procedure printHeader(Title.s, Header.s)
  Protected i, CountCol = CountString(Header, "|") + 1
  Protected x, Size, Align, Value.s
  
  ; Impression titre
  VectorFont(FontID(0), 25)
  VectorSourceColor(RGBA(0, 0, 0, 200)) 

  MovePathCursor(50, 20)
  DrawVectorText(Title)

  ; Impression entete des colonnes
  VectorFont(FontID(0), 10)
  VectorSourceColor(RGBA(0, 0, 0, 200)) 
    
  ; Impression entete des colonnes 
  For i = 1 To CountCol
    x = Val(StringField(StringField(Header, i, "|"), 2, ":"))
    Size = Val(StringField(StringField(Header, i, "|"), 3, ":"))
    Align = Val(StringField(StringField(Header, i, "|"), 4, ":"))
    Value = StringField(StringField(Header, i, "|"), 1, ":")
    
    If Align = 2
      x + Size - VectorTextWidth(Value)              
    EndIf 
    
    MovePathCursor(x, 70)
    DrawVectorText(Value)
  Next  
  
  ; Affichage du slogan PureBasic (Pour le fun)
  VectorFont(FontID(0), 20)
  VectorSourceColor(RGBA(255, 0, 0, 128))
  RotateCoordinates(30, 50, 90) 
  MovePathCursor(30, 50)
  DrawVectorText("Make with Pure Basic : Simply is the best.")   
  
  ;Retour à la normal pour les ligne détails
  RotateCoordinates(30, 50, -90)   
  VectorFont(FontID(0), 10)
  VectorSourceColor(RGBA(0, 0, 0, 255))
EndProcedure

Procedure printFooter()
  Static CountPage
  
  VectorFont(FontID(0), 10)
  VectorSourceColor(RGBA(0, 0, 0, 255))
  MovePathCursor(10, VectorOutputHeight() - 50)
  DrawVectorText("Imprimé avec PureBasic 5.71 LTS (x64)")
  
  CountPage + 1 
  MovePathCursor(VectorOutputWidth() - 60, VectorOutputHeight() - 50)
  DrawVectorText("Page " + Str(CountPage)) 
EndProcedure

Procedure exit()
  CloseDatabase(Database)
  End  
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre