Printen uit Gambas: tekst, html of echt.

Eenvoudige tekst, html, of ingebouwd printen?

  1. Voor uitvoer kan je gemakkelijk een txt bestand maken vanuit gambas, dat je dan in eender welk programma kan openen en printen (bv Kate, …).
  2. Een andere mogelijkheid, waarmee je veel kanten uit kan is .html files maken vanuit gambas: die kunnen zowel bekeken worden met de browser, als van daaruit geprint. Als ze op een bereikbare plaats (gedeelde map of webserver) staan, zijn ze gemakkelijk te delen. (zie ook “html rapport weergeven of printen“)
  3. Je kan ook printen vanuit Gambas, dan moet je echt alles doen wat erbij komt; pagina beschrijven enz.

De online documentatie vermeldt onder Gambas versie 2.0 de uitleg van 3.0.

Gambas 2.21 bevat in ieder geval een “voorbeeld” toepassing: “Printing”, dat al bestaat sinds 2006.
Die bevat de componenten:

  • gb
  • gb.qt (bevat Draw, gebruikt voor sturen van grafische informatie naar het Printer object)
  • gb.qt.ext (bevat Printer)

Nota:
Deze componenten gaan niet samen met de algemene gb.gui component.
Wel kan je voor de gb.gtk en gb.gtk.ext kiezen, vermoedelijk verschaffen ze ongeveer dezelfde functionaliteit met licht anders uitzicht (KDE = Qt, Gnome = GTK).

In Gambas3 bestaat een Printer (gb.qt4) object.

Voor Gambas2: gebruik het “Printer” object, dat ondermeer volgende eigenschappen heeft:

  • Orientation (Portrait, Landscape)
  • Size “A4”
  • Copies (getal)
  • ColorMode (Black, Color)
  • Resolution (bv 600)

bv: Printer.Orientation=Printer.Landscape

Opbouwen van print in 4 stappen:

  1. Printer.Setup()
    Oproepen van print setup : geeft een standaard venster “Setup Printer” met de printerkeuze (als er meer printers zijn), en andere instellingen als “Printer Settings”, “opties”, papierformaatkeuze en aantal prints.
    Printer.Setup() geeft een waarde terug naargelang knop “OK” (FALSE) of “Cancel” (TRUE) gedrukt wordt.
    Aangezien “Cancel” TRUE geeft kan je een test doen met:

    IF NOT Printer.Setup()
    '  print commands
    ELSE
    '  Message.Error("print setup canceled")
    ENDIF
    

    Het aanroepen van Printer.Setup() is niet verplicht, maar wel nuttig voor de gebruiker.

  2. *1)
    Draw.Begin(Printer)

    vanaf hier begint het printen
     
  3. Draw.Text((“Voorbeeldtekst”), iStartX, iStartY)
    Draw.Rect(iStartX, iStartY, iBreedte, iHoogte)

    Zet tekst of teken vormen, bv: Teken een rechthoek op locatie … met afmetingen …

    Draw.Rect(800, 800, 80, 40) ‘ zet bovenaan links een klein rechthoekje op papier.
    Hoewel 800, 800 doet vermoeden dat het evenver van de boven als van de zijkant staat is dat niet het geval!

  4. Draw.End
    *2)

    Tot hier loopt het printen;

* Opmerking: “Application.Busy”

  1. INC Application.Busy
    wordt door de voorbeeldprogramma’s verhoogd net voor Draw.Begin
  2. DEC Application.Busy
    Application.Busy wordt door de voorbeeldprogramma’s verlaagd net na Draw.End
  3. Tekst wordt geprint op plaats x, y met:
    Draw.Text(“Deze tekst wordt afgedrukt”, x, y)

    Een paar andere eigenschappen kunnen ingesteld worden met/als:

          Printer.Orientation = Printer.Landscape
          Printer.Size = "A4"
          Draw.Font.Size = 18
          Draw.Font.Name = "Arial"
          Draw.Font.Underline = TRUE
          Draw.Font.Bold = TRUE
    

    en dat kan voor het aanroepen van Printer.Setup() gebeuren; je zal de instelling daar weergegeven zien, bv als je Printer.Landscape hebt ingesteld en nadien Printer.Setup() aanroept, staat “Paper Format” op “Landscape” in de drop-down box in het “Setup Printer” venster.

    Waarschijnlijk wil je een aantal (public of private) variabelen declareren, als:

    ' Gambas module file
    PUBLIC iFirstColStart AS Integer = 120
    PUBLIC iSecondColStart AS Integer = 2000
    PUBLIC iThirdColStart AS Integer = 5500
    PUBLIC iCurRow AS Integer = 800
    '
    PUBLIC iRepeatColStart AS Integer = iSecondColStart
    PUBLIC iDimensionColStart AS Integer = 3000
    PUBLIC iColorColStart AS Integer = 3500
    PUBLIC iNumberColStart AS Integer = 4000
    PUBLIC iDeliveredColStart AS Integer = 4500
    '
    PUBLIC iFontSizeMainData AS Integer = 28
    PUBLIC iFontSizeMidData AS Integer = 24
    PUBLIC iFontSizeDataTitle AS Integer = 14
    PUBLIC iFontSizeSmallData AS Integer = 10
    PUBLIC iFontTinyData AS Integer = 7
    PUBLIC sFontMainData AS String = "Arial"
    '
    PUBLIC fborder AS Float
    PUBLIC fTextHeight AS Float
    PUBLIC fTop AS Float
    

    Om te vermijden dat teksten door elkaar lopen in de print kan je de data wat inkorten, eventueel proefondervindelijk, bv:

    PUBLIC iMaxCusLen AS Integer = 12
    PUBLIC iMaxOrdNameLen AS Integer = 20
    

    Hier een stukje code waarin dat gebruikt wordt:

      IF NOT Printer.Setup()
      
          ' some printer settings
          Printer.Size = "A4"
          Printer.Orientation = Printer.Landscape
          ' why this?
          INC Application.Busy
           ' Draw printer page
          Draw.Begin(Printer)
          
          border = Printer.Resolution
    
          Draw.Rect(100, 100, 10, 10) ' just to fix the corner
          
          ' Draw.Ellipse(3000, 3000, 1200, 190)
          
          iCurRow = 300
          
          Draw.Text("Klant", iFirstColStart, iCurRow)
          Draw.Text("Ordernaam", iSecondColStart, iCurRow)
          Draw.Text("Ordernr", iThirdColStart, iCurRow)
          
          iCurRow = 500
    
    '      Draw.Rect(iFirstColStart, iCurRow, 2200, 300)
          
          Draw.Font.Size = iFontSizeMainData
          Draw.Font.Name = sFontMainData
          Draw.Font.Bold = TRUE
                
          
          Draw.Text(thisOrder.ShortCusName(iMaxCusLen), iFirstColStart, iCurRow, 1200)
          
          Draw.Text(thisOrder.ShortOrdName(iMaxOrdNameLen), iSecondColStart, iCurRow)
          
          Draw.Rect(iThirdColStart - 100, iCurRow, 1200 - 100, 280)
          Draw.Text(thisOrder.sOrdCode, iThirdColStart, iCurRow)
    
    ' ... enz.
    
          Draw.End
          
          DEC Application.Busy
      ELSE 
        Message.Error("Printing was canceled")
      ENDIF 
    

    Meer pagina’s printen?

    PUBLIC SUB GoNextPage()
      Printer.NewPage()
      INC iPageNumber
      iCurRow = iRowStart
    END