Eenvoudige tekst, html, of ingebouwd printen?
- Voor uitvoer kan je gemakkelijk een txt bestand maken vanuit gambas, dat je dan in eender welk programma kan openen en printen (bv Kate, …).
- 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“)
- 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:
- 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.
-
*1)
Draw.Begin(Printer)
vanaf hier begint het printen
-
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!
-
Draw.End
*2)
Tot hier loopt het printen;
* Opmerking: “Application.Busy”
INC Application.Busy
wordt door de voorbeeldprogramma’s verhoogd net voor Draw.Begin
-
DEC Application.Busy
Application.Busy wordt door de voorbeeldprogramma’s verlaagd net na Draw.End
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