Page 1 sur 1

Comment imprimer des textes nécessitant plus d'une page

Publié : mer. 02/janv./2019 16:44
par Micoute
Bonjour à tous,

j'aimerais imprimer des recettes de cuisines, mais ça peut aussi s'appliquer à d'autres textes nécessitant plus d'une page.

Le principe est de compter les lignes, et dès qu'on arrive au numéro de ligne maximum, on lance une invite à tourner la page pour imprimer la suite.

Le problème est que le requêteur de messages s'ouvre avant que l'imprimante imprime qui que ce soit, donc c'est pas le but recherché

Si quelqu'un a le savoir faire, je l'en remercierai beaucoup et je le remercie déjà par anticipation.

comme vous pouvez le voir, la procédure est scindée en deux parties : la première pour le recto et la seconde pour le verso, après retournement manuel de la page.

Voici la procédure pour imprimer

Code : Tout sélectionner

Procedure Imprimer()  
  Select EventType()
    Case #PB_EventType_LeftClick
      Protected Numero_de_ligne = 0, Lignes_par_page_maxi = 69, X = 10, Y = 0, Texte$
      Protected Resultat = 0
      
      Nbre_de_lignes_a_imprimer = CountGadgetItems(#Preparation)
      
      ;-première page
      If DefaultPrinter() <> 0
        If StartPrinting("Début")
          StartDrawing(PrinterOutput())
          ;Impression du titre
          PoliceImpression("Comic Sans MS", 20, #PB_Font_Bold, 0, 0, $F10612)
          ImpressionTexte(x, y, UCase(GetGadgetText(#Nom)))
          Debug "" + Numero_de_ligne + " " + UCase(GetGadgetText(#Nom))       
          Y + 20
          Numero_de_ligne + 2
          ;Impression du sous titre "Ingrédients"
          PoliceImpression("Comic Sans MS", 12, #PB_Font_Bold, #PB_Font_HighQuality, 0, $0)
          ImpressionTexte(x, y, "Ingrédients :")
          Numero_de_ligne  + 1 ;ligne vide
                               ;Impression des ingrédients
          PoliceImpression("Comic Sans MS", 12, #PB_Font_HighQuality, 0, 0, $0)
          Debug "" + Numero_de_ligne + " " + "Ingrédients :"
          Numero_de_ligne + 1 ;ligne vide
          
          ForEach Recettes()\Ingredients()
            With Recettes()\Ingredients()
              texte$ = \Quantite + " "
              If \Unite > 0
                texte$ +  GetGadgetItemText(ListeIngredients()\Ingredients(1), \Unite) + " "
              EndIf
              texte$ + \Ingredient
            EndWith
            If Numero_de_ligne < Lignes_par_page_maxi
              Y + 5
              Numero_de_ligne + 1
              ImpressionTexte(x, y, texte$)
              Debug "" + Numero_de_ligne + " " + texte$
            EndIf  
          Next 
          
          If Numero_de_ligne < Lignes_par_page_maxi 
            Y + 10
            Numero_de_ligne + 1
            ;Impression du sous titre "Préparation"
            PoliceImpression("Comic Sans MS", 12, #PB_Font_Bold, #PB_Font_HighQuality, 0, $0)
            ImpressionTexte(x, y, "Préparation :")
            PoliceImpression("Comic Sans MS", 12, #PB_Font_HighQuality, 0, 0, $0)
            Debug "" + Numero_de_ligne + " " + "Préparation :"
            Numero_de_ligne + 1 ;ligne vide
            y + 5
          EndIf
          
          ;Impression de la préparation
          i = 0
          While i <= Nbre_de_lignes_a_imprimer
            If Numero_de_ligne <= Lignes_par_page_maxi
              ImpressionTexte(X, Y, GetGadgetItemText(#Preparation, i))
              Y + 5
              Numero_de_ligne + 1
              
              Debug GetGadgetItemText(#Preparation, i)
              
              If Len(GetGadgetItemText(#Preparation, i)) > 80
                Numero_de_ligne + 1
              EndIf              
            Else
              Break   
            EndIf  
            i + 1
          Wend
          
          StopDrawing()
        EndIf ;StartPrinting
        
        ;-deuxième page, s'il y a lieu
        If i <= Nbre_de_lignes_a_imprimer
          Numero_de_ligne = -1
          Y = 10
          
          If StartPrinting("Suite")
            StartDrawing(PrinterOutput())
            If CountGadgetItems(#Preparation) - i
              Resultat = MessageRequester("Info", "Veuillez tourner la page pour poursuivre l'impression", #PB_MessageRequester_Ok)
              If Resultat = 1
                ;Impression de la suite de la préparation
                PoliceImpression("Comic Sans MS", 12, #PB_Font_HighQuality, 0, 0, $0)
                While i <= Nbre_de_lignes_a_imprimer
                  If Numero_de_ligne <= Lignes_par_page_maxi
                    ;Si la ligne fait plus de 80 caractères
                    If Len(GetGadgetItemText(#Preparation, i)) > 80
                      Numero_de_ligne + 1
                      y + 5
                    EndIf
                    ImpressionTexte(X, Y, GetGadgetItemText(#Preparation, i))
                    y + 5
                    Numero_de_ligne + 1
                    
                    Debug GetGadgetItemText(#Preparation, i)
                    
                    i + 1
                  EndIf  
                Wend
              EndIf ;Résultat
            EndIf ;Invite pour tourner la page
            StopPrinting()            
          EndIf ;fin de boucle StartPrinting
        EndIf ;fin de boucle S'il y a une deuxième page      
      EndIf ;fin de boucle DefaultPrinter
  EndSelect
EndProcedure

Re: Comment imprimer des textes nécessitant plus d'une page

Publié : mer. 02/janv./2019 18:04
par boby

Code : Tout sélectionner

;Remplissage d'une liste avec les phrases à imprimer
Global  NewList text.s()
For a = 0 To 500
  AddElement(text())
  text() = "Ligne à imprimer n° "+Str(a)
Next a

Procedure Imprimer()
  Protected PrinterW, PrinterH, PageH
  If PrintRequester()
    PrinterW = PrinterPageWidth() : PrinterH = PrinterPageHeight()
    LoadFont(0,"Arial",92)
    StartPrinting("Nom de ton sof")
    StartDrawing(PrinterOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(0))
    ForEach text()
      If TextHeight(text()) + PageH >= PrinterH
        NewPrinterPage() : PageH = 0
      EndIf
      DrawText(0,PageH,text(),$000000)
      PageH + TextHeight(text())
    Next
    StopDrawing()
    StopPrinting()
  EndIf
  ProcedureReturn #False
EndProcedure

Imprimer()
PS : Il est interdit par la police du bon gout d'utiliser ComicSansMS !

Re: Comment imprimer des textes nécessitant plus d'une page

Publié : jeu. 03/janv./2019 7:41
par Micoute
Bonjour à tous,

@boby, merci du fond du cœur, car tu as comblé tous mes désirs, pourtant au début j'avais du mal à y croire parce qu'à l'aperçu, toutes les pages étaient la recopie de la première et c'était pas engageant, donc pour en avoir le cœur net et comme le nombre de ligne par page était de 29, il me suffisait de régler la liste sur 58 et de faire un essai, et là quelle ne fut pas ma joie de constater que c'était vraiment une suite, merci encore.