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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

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

Message 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 !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre