Gambas CLI

Veel te weinig aandacht voor de Command Line Interface!

Je kan Gambas ook gebruiken om een terminal/console/konsole/commandolijn programma te maken, dat je zonder grafische interface kan starten (bv op een server zonder X/KDE/Gnome). Je start het als een commando, eventueel over een ssh sessie.

Of je kan een programma maken dat je start vanuit de cron jobs, m.a.w. je stelt je computer in om dat op bepaalde momenten uit te voeren, bv dagelijks om 01:00 u.

Start nieuw project, kies CLI, “testCLI”.

In Main kan je iets zetten als:

' Gambas module file
'
Private bQuit As Boolean = False
'
Public Sub Main()
'
  Dim sCommand As String
  '
  While Not bQuit
    showShortMenu()
    Line Input sCommand
    Print " - - -"
    Debug "terminal got: " & sCommand
    If Len(Trim(sCommand)) = 1
    ' short commands
      Select sCommand
        Case "Q", "q"
          Print "Closing down " & Application.Name & " now"
          bQuit = True
        Case "H", "h"
          showHelp()
      End Select
    Else
      Print Len(Trim(sCommand))
    Endif
  Wend
  '
End
'
Public Sub showShortMenu()
  '
  Print "H = help, Q = quit"
  '  
End
'
Public Sub showHelp()
  '
  Print " HELP!"
  '
End

Je kan het effect uitproberen vanuit de Gambas programmeeromgeving; die heeft onderaan een commandolijn die bij “Run” het programma uitvoert.

Bewaar het project en maak een “uitvoerbaar bestand” (testCLI.gambas) om het te kunnen starten buiten gambas om.

~/Gambas3/Gb3Run> ./testCLI.gambas
H = help , Q = quit
h
- - -
Main.Main.13: terminal got: h
HELP!
H = help , Q = quit
q
- - -
Main.Main.13: terminal got: q
Closing down empttrack now

Een eigen Library (maken)

(zie ook Library of Component)

Het gebruiken, maar ook het maken van een eigen Library is voorzien in de Gambas IDE. En je kan ook manueel een gewoon project als Library gebruiken.

1. Library gebruiken

IDE
Kies in de IDE bij het maken van het project (of ga in een bestaand project naar) menu Project/Eigenschappen/Bibliotheken.
Onderaan dit venster (waar eventueel al gekozen Libraries staan) zie je een knop Toevoegen. Daarmee krijg je een venster met een lijst van beschikbare bibliotheken.

Vendor
Die zijn georganiseerd volgens Vendor/Library, m.a.w. de vendor staat voor wie de Libraries levert. Als je een bestaande Library gebruikt is dat bepaald door wie ze gemaakt heeft. Als je de Library zelf maakt, kan dat in jouw geval gewoon je eigen naam zijn, de naam van de organisatie (bedrijf) waarvoor je werkt, of de naam van een project waar de Library in thuishoort. De vendor naam groepeert de Library bestanden, en dat bestaat zo als directory struktuur op de plaats waar ze geïnstalleerd zijn.

Kiezen
Je kan hier dus de Libraries die je in je project wil gebruiken kiezen, verwijderen, wijzigen (bv andere versie beschikbaar).
Elke library vermeldt ook welke klasse of module ze ter beschikking stelt, niet de details van welke methodes of eigenschappen ze aanbiedt. In de huidige versie van Gambas 3.9.2 vermeldt het ook niet de extra gegevens over de Library (auteur, beschrijving).

2. Libary maken (IDE)

Start de Gambas IDE, menu Bestand, Nieuw project: “1 Project Type”: ….
Dit scherm helpt je niet in je keuze; het project type “library” wordt niet vermeld!
Neem bv het eerste, command line application, kies een directory en een naam (bv “DemoLibraryCLI”). Ok.
Je krijgt een project met alleen een MMain, die ook opstartklasse is (zwart pijtlje ervoor).

Ga naar Project, Eigenschappen, Algemeen; bij “Project Type” kies je Bibliotheek (ipv Normaal).

Vul de “verkoper” (vendor) in; bv TestVendor (je kan hier geen leestekens of spaties gebruiken; deze naam wordt gebruikt als directorynaam – zie boven). Beschrijving en Auteurs is niet verplicht. Ok.

Maak bij Bronnen een nieuwe module “MDate”. In het edit venster tik je onder ‘Gambas module file en de lege lijn:
Export
Bewaar.

' Gambas class file
'
' uitleg van wat de klasse doet

Export
' hieronder de code v/d klasse

In de linkse kolom krijgt de Modulenaam een gele stip; die geeft aan dat ze geëxporteerd wordt.

De andere, onzichtbare klassen kunnen dienen voor testcode enz.

Geef in het editorvenster wat code in; bv een publieke constante waarde waarin je favoriete formatteringscode voor de datum zit:

Public const sDateFormat As String = "dd-mm-yy"

en een procedure die die gebruikt:

Public Sub GetDateFormat(dDate As Date) As String
Return Format(dDate, sDateFormat)
End

Beiden zijn Public en kunnen dus extern gebruikt worden nadien.

Ps: Als je zelf iets moet benaderen in de directorystruktuur: ./ is waar de library zelf staat, ../ zou verwijzen naar het hoofdproject.

In MMain kan je code zetten om je module te testen; die MMain wordt toch niet geëxporteerd; bv:
(wordt ook zo aangegeven in de documentatie in “How to test a library”)
Print MDate.GetDateFormat(Now())

Als je dit project uitvoert, wordt de datum gedrukt als 20-10-18.

Als je een uitvoerbaar bestand maakt (plaats: bv je zelfgemaakt gambas project executables map “gb3Run”) met de naam DemoLibraryCLI.gambas, wordt ook een extra bestand gemaakt in een verborgen subdirectory je home directory.

/home/username/.local/share/gambas3/lib/TestVendor/DemoLibraryCLI:0.0.gambas

Het versienummer zit mee in de bestandsnaam (maar mist het laatste teken).

Ga naar je DemoLibaryApp (of maak die), en selecteer de library. (volg de instructies zoals hierboven).
De library is met Toevoegen zichtbaar onder TestVendor als DemoLibraryCLI met versie 0.0.
Met “ok” kan je ze kiezen, en je krijgt ze zichtbaar (met een versienummer 0.0.1) en “Voorziet in: MDate!”

3. Libary maken van bestaand project

  • Voeg “Export” regel toe bovenaan de nodige modules/classes.
  • Maak uitvoerbaar bestand in de voorheen vermelde library directory, in een “vendor” map; wijzig de naam door een versienummer toe te voegen in de naam.

upd 26022019

4. Library installeren

De meest luie manier om een eigen library te installeren op een andere machine, is een ssh verbinding te maken naar de pc waarop je het programma gemaakt hebt (en werkend hebt met de nodige libraries). Je kopieert de hele subdirectory van je vendor/lib01/ naar de bestemmingsmachine.

Een andere manier is het oorspronkelijke project van de library als tar.gz over te brengen naar de bestemming, en daar uit te pakken en “make executable”/”uitvoeringsbestand maken” (compileren alleen is niet genoeg), zie boven bij 1. Library gebruiken.

Binnen en buiten ASCII text (leestekens, extended)

Om bestandsnamen te maken, namen van mappen, e-mail adressen, tekst voor opslag in een database veld, html, enz is het soms nodig om enkel bepaalde tekens te gebruiken. Enkele “sub-sets”:

Letters en cijfers:

Chr(i) waarbij i is:

  • 48 tot 57 = 1 .. 9
  • 65 tot 90 = A .. Z
  • 97 tot 122 = a .. z

Normale standaard tekens:

Chr(i) waarbij i is:

  • 32 (spatie) tot 126 ~ (tilde)
  • met daartussen leestekens, haakjes, cijfers, letters enz

Extended:

Chr(i) waarbij i is:

  • 128 tot 255 (niet printbaar)

Weergeven:


Public Sub Main()
Dim sStandaard, sExtend, sPureText As String
Dim iCount As Short

For iCount = 48 To 57
sPureText &= Chr(iCount)
Next

For iCount = 65 To 90
sPureText &= Chr(iCount)
Next

For iCount = 97 To 122
sPureText &= Chr(iCount)
Next

For iCount = 32 To 126
sStandaard &= Chr(iCount)
Next

For iCount = 128 To 255
sExtend &= Chr(iCount)
Next

Print "sPureText = " & sPureText
Print "sStandaard = " & sStandaard
Print "sExtend = " & sExtend

Foto’s (of andere beelden) vergroten of verkleinen

Om later eens te gebruiken …

Ik vond in een voorbeeld app in Gambas volgend stukje code:

Public Sub Add(ImagePath As String)
Dim img As Image
Dim newPicture As Result
'Dim pictureData As String
Dim scale As Float
Dim eTime As Float
newPicture = databaseConnection.Create("pictures")
' Save temp image as png file
img = Image.Load(ImagePath)
img.Save(tempFile)
newPicture["image"] = File.Load(tempFile)
' Create image thumb
If img.Width > thumbSize Or img.Height > thumbSize Then
' Calc factor to scale isotropic
scale = Min(ThumbSize / img.Width, ThumbSize / img.Height)
img = img.Stretch(img.Width * scale, img.Height * scale)
img.Save(tempFile)
End If
newPicture["thumb"] = File.Load(tempFile)
' Add description and update
newPicture["description"] = "Image " & File.BaseName(ImagePath) & " added: " & Format(Now, "dddd, dd mmmm yyyy hh:nn:ss")
eTime = Timer
newPicture.Update()
Print "Done in "; Format(Timer - eTime, "#.###"); " s"
If Exist(tempFile) Then Kill tempFile
Catch
Error.Raise("Add database record error


Error:
" & DConv(Error.Text))
End

Gambas (3) op Raspberry Pi

Meldingen van Gambas op Raspberry Pi dateren al van Gambas2, maar de huidige combinatie van hardware en software noopt eerder tot Gambas3. Dat kan, zowel op de eigen Raspbian als op andere Linux besturingssystemen voor Pi…

Raspbian
Neem een terminal venster en doe:
sudo apt-get update
sudo apt-get install gambas3

Daarna zit Gambas3 in het menu onder programmeren!
(Menu/Programming/Gambas3)
Er zijn bovendien een aantal voorbeelden inbegrepen, terwijl in de huidige gambas3 versie eerder verwezen wordt naar een online repository van programma’s. Inderdaad, deze versie is “oud”:
About Gambas: 3.5.4
Terwijl bv op een huidige openSUSE 42.3 Gambas aan 3.9.2 is!

Update 06/2018

In de nieuwe Raspbian 9 is het ondertussen ook 3.9.1

OpenSUSE 42.3
Een ander voorbeeld, stel dat je opensuse 42.3 geïnstalleerd hebt op je raspberry pi; dan krijg je dus inderdaad Gambas 3.9.2!

RaspberryPi GPIO; Using Gambas

Raspberry Pi camera vanuit Gambas

PiCam Master

Hier zou wat code kunnen zitten, te checken:
https://github.com/charlie-ogier/PiCam.

Dit programma is bedoeld om op de Raspberry Pi te draaien (niet op je pc). Het maakt een ramdisk om de beelden op te slaan.
nb: De camera moet aktief zijn in de Raspberry Pi instellingen.

Het programma geeft een “live” preview van het camerabeeld.
De preview leeft een eigen leven, en staat niet mooi op de daarvoor schijnbaar bedoelde ruimte op het scherm. Er zit een tool bij om de Preview op zijn plaats te krijgen, is blijkbaar schermafhankelijk. De volgende keer staat het beeld wel op zijn plaats, de aanpassingen worden bewaard.

Foto
Je kan met een eenvoudige druk op de knop een foto maken, of opeenvolgende foto’s met een tijdsverschil.
De foto wordt bewaard in de map ~/Pictures/PiCam, de eerste foto heet 0000.jpg, en is bij 800×800 zon 360 Kb.

Er zijn instellingen voor resolutie, er is mogelijkheid het beeld te kantelen, te spiegelen, timer aanpassing, enz.
Er zijn een hele reeks “Effecten” en er is een “Exposure” keuzelijst.

Ik had hier versie 0.2.6 gemaakt op Gambas 3.8.4 in 2016 door Charlie Ogier.

Library of Component in Gambas3

1) Libraries

Bron: gambaswiki.org/wiki/doc/library

Library
Een library dient om gemeenschappelijk code tussen verschillende projecten te delen.

Een library is een Gambas programmma (executable), dat gebruikt kan worden in een ander project.

Voor eigen gebruik ga je dus steeds een library gebruiken, en geen component.

Locatie

Als een gambas project een library lib01 nodig heeft, wordt die gezocht op volgende plaatsen
(en ook in deze volgorde):

  • 1) uitvoerbare projectdirectory/lib01.gambas
  • 2) $XDG_DATA_HOME/gambas3/lib/vendorname/lib01:versie.gambas
  • 3) ~/.local/share/gambas3/lib/vendorname/lib01:version.gambas
  • 4) Project-Property_Tab_Library_directory-value/vendorname/lib01:versie.gambas
  • 5) /usr/lib[/multiarch]/gambas3/vendorname/lib01:versie.gambas
  • 6) /usr/bin/vendorname/lib01:versie.gambas

1. is de oudste manier
2./3. hangt af van het bestaan van $XDG_DATA_HOME, en gaat over installatie voor de user (single userwide copy; bv handig tijdens testen).
4. is een instelling in het gebruikend gambasproject (project eigenschappen)
5. is voor gebruik op een meergebruikerssysteem, waar je de library wil delen/gemeenschappelijk (dezelfde) gebruiken.
6. zoals 5., maar bij 6. gaat een gewoon gambas programma gebruikt worden als library (oudere manier).

$XDG_DATA_HOME hoort bij de specificaties van freedesktop.org en veronderstelt een basisdirectory waarin gebruikers-data wordt opgeslagen. Vgl $XDG_CONFIG_HOME voor gebruikers configuratie gegevens.

vendorname: zie Projecteigenschappen, veld “vendor” (of “verkoper” in de NL-talige versie).
Als deze leeg gebleven is bij creatie van de library, krijgt de locatie de mapnaam “(unknown)”:
.local/share/gambas3/lib/(unknown)/myownlib:0.0.1.gambas
Als je de vendorname alsnog invult, komt de lib in de nieuwe directory struktuur -inclusief die vendorname- terecht (en blijft de “unknown” versie bestaan).

Maken

Zie Een eigen Library (maken)

Je kan ze ook op niveau van het systeem installeren (zie boven “Locatie”)

Gebruiken

Het gebruikend project: open Project, Properties. Kies “Libaries” blad. Dan krijg je een venster met het “Runtime library search path”, en een lege lijn plus lege ruimte eronder.
Met “+ Add” knop voeg je er toe.

Je krijgt een venster “Select a Library”; ik zie in mijn geval een library staan – of niet (**)- in de directory waarin dit nieuwe project zit; selecteer, “ok”.

Zichtbaar in de lijst:

vendor > Lib01 0.0.1
Location: /home/naam/.local/share/gambas3/lib/vendor/Lib01:0.0.gambas
Provides: Class1, Class2

Je kan de library hier ook verwijderen, en van plaats veranderen in de lijst.

Nota/Problemen (*)(**)
Ik had nogal eens problemen waarbij ik nadien de library niet kon gebruiken; ik kon ze niet selecteren/vinden vanuit de IDE.
De library in ~/.local/share/gambas3/lib/myvendor bleek ook een gekke naam te hebben met een dubbel versienummer.

Ik heb gemerkt dat ik best:
– Project type : normaal (ipv library)
– Compileren naar .gambas programma ineens in de juiste directory in
~/.local/share/gambas3/lib/myvendor/libprj.gambas
(of de .gambas er naar kopieren).
Library compileren door uitvoeringsbestand te maken. Dat moet voldoende zijn. Maar..
– Als je de Library gebruikt in een project op dezelfde computer, moet je de IDE sluiten en terug starten om de libraries terug te lezen, anders ziet hij de nieuwe versie van de library niet, en kan je ze niet selecteren (momenteel in Gambas 3.14.3).
– opletten met versienummer; get from VERSION of de eigen project nummering kunnen dooreen/uiteenlopen…

Meer
Meer libraries: dan moet je letten op de volgorde in deze lijst; die moet juist zijn.
(volgens documentatie: van bovenaan/eerste tot onderaan/laatste).

Gevorderd?
De documentatie houdt daar zowat op; niets over:

  • Hierarchie van libaries (upd: beetje uitleg hier)
  • Initialiseren van een library: er wordt een aanzet gemaakt maar dat is nooit/nog niet aangevuld
  • Versie-nummering

Versienummer
Als je in de library code Application.Version gebruikt in een procedure, en je roept die op vanuit een gebruikend programma, dan wordt die zo letterlijk uitgevoerd dat je de versie van je uitvoerend programma te zien krijgt, en niet die van de library.
Je kan het versienummer in een Version.txt bestandje in de Data directory van je library zetten, en de inhoud van die file terugsturen in plaats van Application.Version.
Beter nog, als je het bestand “VERSION” noemt, en in het project het vakje “Get from VERSION file” aanklikt, wordt dat ook automatisch gebruikt binnen je library programma zelf.
Zie ook Versie van je bibliotheek (Library Version)

Update v.d. library
Hoe een library updaten?
TestLib is de library.
TestLib.gambas is de executable daarvan.

De file is ook terug te vinden als:
/home/username/.local/share/gambas3/lib/vendorname/TestLib:0.0.1.gambas

TestProgram op hetzelfde systeem is het programma dat deze lib gebruikt.

Wanneer krijgt TestProgram een “nieuwe versie” van TestLib in gebruik?

  • TestLib code gewijzigd. Run TestLib. – Run TestProgram vanuit IDE. –> Nee
  • TestLib code gewijzigd. Run TestLib. – Refresh TestProgram project vanuit IDE + Run –> Nee
  • TestLib code gewijzigd. Make Executable. – Run TestProgram vanuit IDE. Ja!
    Ook: TestLib:0.0.1.gambas datum/tijd wordt aangepast;
  • TestLib code gewijzigd. Make Executable. – Nog draaiend TestProgram vanuit IDE: –> Nee

De library wordt dus geladen bij het starten van het programma.

2) Componenten

Bron:
How To Program Components In Gambas (gambaswiki.org/wiki/dev/gambas)

Component
Gambas componenten zijn gedeelde bibliotheken die geschreven zijn in C, C++ of in Gambas zelf. Ze voegen nieuwe klassen toe aan de Gambas programmeeromgeving, en vormen een uitbreiding van de Gambas taal. Ze zijn voor algemeen gebruik bestemd, en worden dus verspreid met de gambas broncode.

Component maken

Project type: Component.

Je moet in de code EXPORTEER code gebruiken en de component voorzien van alles wat de IDE nodig heeft (eigenschappen met standaardwaarden, help enz).

Ook interessant: het object model van Gambas gambaswiki.org/wiki/doc/object-model

Gambas en Raspberry Pi GPIO pinnen

Zien
Deze lijkt interessant: (van 2016)
1. Gambas GPIO and android on raspberryPi3
https://www.youtube.com/watch?v=j1HoN-ySK7Q

Deze is nog ouder (03-2015) en niet NL-talig, en ondanks de titel ook niet Engelstalig:
2. Controlling Raspberry Pi 2 GPIO with Gambas (2015)
https://www.youtube.com/watch?v=VPj_Hjh7viQ

Library
Een van de basisbenodigdheden naast gambas en een pi is een library om de raspberry pi GPIO pinnen aan te spreken (met een soort seriële communicatie):

  • wiringPi
  • pigpio

Een code-voorbeeld van gebruik vind je hier op elinux.org

libwiringPi
(Zie ook deze topic 2013 op pi forum – en blijkbaar moet je Gambas programma draaien als root)

De library moet je aanroepen in de software, in het 1e voorbeeld:
Library "/usr/local/lib/libwiringPi"

Dan worden er een aantal dingen uitgehaald, bv

Public Extern wiringPiSetup() As Integer ' blabla
Public Extern pinMode(pin as Integer, ...

Dan doet hij een “setup”:


Public sub Form_Open()
wiringPiSetup()
pinMode(7, PIN_OUTPUT)
pinMode(0, PIN_OUTPUT)
pinMode(2, PIN_OUTPUT)
pinMode(4, PWM_MODE)
pwmSetMod(0)
pwmSetClock(400)
pwmSetRang(1024)
pwmWrite(1, Slider8.Value)
End

Ik begrijp de indentatie niet zo goed, maar ik heb gewoon de code overgenomen uit zijn videootje.

Dan heeft hij nog code om naar de Arduino te sturen via de serialport1:

PUBLIC SUB _new()
' ...
serialport1.PortName= "/dev/ttyUSB0"
serialport1.speed = 9600
serialport1.
serialport1.
' enz
TRY serialport.Open()
IF Erro Then
Message.Error("Connection error in port " & serialport1.Portname)
ELSE
Try Print #serialport1, "S"
IF Error Then
Messag.Error("Error sending data .." )
Print "Cannot connect"
ELSE
Print "ok .. Connected"
ENDIF
ENDIF
END

Ook dat zou ik anders doen, nl met


WITH serialport
.Portname= "/dev/ttyUSB0"
.speed = 9600
.Parity = .None
.DataBits = .Bits8
.StopBits = .Bits1
.FlowControl = .None
END WITH

En dan stuurt hij slider informatie door naar de arduino:

Public Sub Slider3_Chang()
Dim b as Byte[]
b = [99, Slider3.Value, 101]
Write #serialport1, b AS Byte[]
End

Volgens zijn uitleg is het allemaal erg eenvoudig vanuit Gambas!

pigpio
Volgens Captain Bodgit (http://captainbodgit.blogspot.be/2016/08/raspberry-pi-gpio-gambas-pigpio-library.html) kan je ook deze pigpio (als .zip van abyz.co.uk/rpi/pigpio/) gebruiken:

wget abyz.co.uk/rpi/pigpio/pigpio.zip
Daarna:
unzip pigpio.zip
wat een mapje PIGPIO geeft, met inhoud.
cd PIGPIO
make
sudo make install

(uitgevoerd op OpenSUSE 42.3)

Printen in Gambas 3.9

(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