(update van Printen in Gambas 3 wegens wijziging vanaf 3.4)
Algemeen
Ik ken drie manieren om te kunnen afdrukken:
– html bestand maken en printen vanuit browser (soms gemakkelijk als je voor web toepassing werkt web=print)
– printen vanuit gambas (zie hieronder – is wat zoeken naar layout-kenmerken voor print)
ps: hier kan je bij het printvenster nog altijd ipv een printer te kiezen, print naar pdf selecteren.
– pdf maken? De pdf component dient blijkbaar enkel om pdf bestanden te lezen en weer te geven, niet om ze te maken. Elders wordt gesproken over printen naar pdf (ipv naar printer; zie boven).
Ideaal zou zijn dat je eenvoudig pdf bestanden kan maken vanuit gambas, en print vanuit de pdf-viewer; handig als je universeel bestand wil hebben dat je ook kan attachen aan mail, bewaren als archief enz.
Gambas3 printvoorbeeld
Bij deze Gambas 3.9 zit een printvoorbeeld, dat werkt met een Printer object dat op de Form geplaatst is
(Ik ga die in code te definiëren omdat ik een module gebruik en geen form)
In het printvoorbeeld is er één voor tekst: “prtText”, en één voor beeld “prtImage”.
Op de form geselecteerd zie je de eigenschappen:
Class: Printer
Name: prtText
Group :
CollateCopies: False
Duplex: Simplex
FullPage : False
GrayScale: False
Orientation: Portrait
Paper: A4
Public: False
ReverseOrder: False
X: 434
Y: 217
Op de FMain form zien we:
- TextAerea “txtText” (deze bevat de opgemaakte text met html codes zichtbaar)
- ScrollArea “scrText” (deze bevat de opgemaakte tekst met de opmaak in werking)
Net daarboven een ButtonBox “txtFontText” die de naam van de font bevat. Die wordt bij openen gevuld met een font “17”, en heeft een knop om een andere font te kiezen.
De tekst wordt klaargezet in op de form (eventueel geladen uit een bestand) in txtText en scrText.
Er zijn vier methoden voor print:
- Begin()
- Paginate()
- Draw()
- End()
Er zijn twee verplichte methoden voor prtText:
prtText_Begin()
en
prtText_Draw()
Het printen wordt gestart vanuit een button en dat aktiveert:
If prtText.Configure() Then Return
Inc Application.Busy
prtText.Print
Dec Application.Busy
De methodes Begin en Draw worden door het .Print commando automatisch aan geroepen, maar je moet ze dus wel zelf voorzien.
In de Draw methode geef je de tekst die geprint moet worden als één van de parameters.
—
Geprobeerd om de essentie even uit het printvoorbeeld van Gambas zelf te halen, met eigen variabele namen:
Form
FMain:
– bovenaan een listbox lsbxLog, een knop btPrint, en een printer object, dat ik “Printer1” noem.
– eronder een tabPanel1 met 4 tabs: Text from file, -from screen, image, drawing
– de TAB’s:
— from file: FileChooser1 en TextArea1
— from screen: FontChooser1 (en nog niet gebruikte ScrollAreaText)
Code
' Gambas class file
Public $fLeftMargin As Float = 10
Public $fStartLine As Float = 15
'
'
Public Sub Form_Open()
'
End
'
'
Public Sub FileChooser1_Change()
'
Try TextArea1.Text = File.Load(FileChooser1.Value)
'
End
'
'
Public Sub btPrint_Click()
'
Dim bDone As Boolean
'
If Printer1.Configure() Then Return
btPrint.Enabled = False
Inc Application.Busy
'
bDone = Printer1.Print()
'
Dec Application.Busy
btPrint.Enabled = True
'
End
'
'
Public Sub Printer1_Begin()
'
End
'
'
Public Sub Printer1_Draw()
'
Select TabPanel1.Index
Case 0
lsbxLog.Add("from file", 0)
printFromFile(FileChooser1.Value)
Case 1
lsbxLog.Add("from text", 0)
printRichText(FileChooser1.Value)
Case 2
lsbxLog.Add("from image", 0)
Case 3
lsbxLog.Add("from drawing", 0)
End Select
'
End
'
'
Public Sub Printer1_End()
'
End
'
'
Public Sub printFromFile(sFileName As String)
' title = filename
Paint.Font.Bold = True
Paint.DrawText(sFileName, $fLeftMargin, $fStartLine, 700, 1400, Align.TopNormal)
' text
Paint.Font.bold = False
Paint.DrawText(File.Load(sFileName), $fLeftMargin, $fStartLine + 100, 700, 1400, Align.TopNormal) ' this works but without further adjustments, the text in the lines runs from the page and is lost
'
End
'
'
Public Sub printRichText(sFileName As String)
'
Dim myText As String
'
myText = "< H 3 >" & sFileName & "< / H 3 > " & gb.NewLine
myText &= File.Load(sFileName)
'
Try Paint.Font = FontChooser1.Value
'
Paint.DrawRichText(myText, $fLeftMargin, $fStartLine, 9500, 1400, Align.TopNormal)
'
End
nb:
De html codes een beetje uitgerokken om ze te kunnen zetten.
De juiste impact van de “width” bv 700 in eerste; geen?
In printRichText geeft 700 een smalle kolom, en 9500 een hele bladbreedte, maar dat hangt natuurlijk af van allerlei.
als ik tijd heb vul ik aan met de images/drawings