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

Git en Gambas

Zie ook linuxuser.copyleft.be (Reeks Githandboek (nl)commando’s vbbranch, mergeGitLab vbgit en gambas)

Hoe Git gebruiken met Gambas?

Een nieuw project “ProjectToTrack” is net aangemaakt. We weten dat de broncode in .src/ zit (source). Verder heeft het project een directory die er – verborgen bestanden inbegrepen- zo uitziet:

copyleft@linuxbox:~/Test/MyProjectToTrack/ProjectToTrack> ls -lFA

total 28
drwxr-xr-x 2 copyleft users 6 Jun 6 16:10 .action/
-rw-r--r-- 1 copyleft users 33 Jun 6 16:10 .directory
drwxr-xr-x 2 copyleft users 19 Jun 6 16:11 .gambas/
-rw-r--r-- 1 copyleft users 123 Jun 6 16:10 .gitignore
drwxr-xr-x 2 copyleft users 6 Jun 6 16:10 .hidden/
-rw-r--r-- 1 copyleft users 10680 Jun 6 16:10 .icon.png
drwxr-xr-x 2 copyleft users 6 Jun 6 16:11 .lang/
-rw-r--r-- 1 copyleft users 0 Jun 6 16:10 .lock
-rw-r--r-- 1 copyleft users 165 Jun 6 16:10 .project
drwxr-xr-x 2 copyleft users 63 Jun 6 16:11 .src/
-rw-r--r-- 1 copyleft users 57 Jun 6 16:11 .startup

Gambas maakt een (onzichtbaar) bestand aan “.gitignore”

Daarin staat:

#---- Gambas files to ignore (v1)
*.gambas
.lock
*~
core
core.*
vgcore
vgcore.*
.kdbg*
.*.prof
.lang/*.pot
.gambas/*
.settings
#----

Dat moet er voor zorgen dat bij gebruik van git deze bestanden niet meer opgenomen worden.

Update 30/10/2018: Settings
Ik merk dat één van de bestanden die mee wijzigt na het gebruiken van de Gambas IDE er eigenlijk ook uit mag:

.settings

Dat bevat lokale tellers, gegevens over de bestanden die open stonden, locatie van vensters en de plaats waar het uitvoerbare bestand naar toe moet (.gambas).

Update: Gambas en git

HSplit en VSplit containers

Ik heb me lang afgevraagd hoe ik een HSplit container juist moest gebruiken.
De eerste stap is eenvoudig: je tekent een rechthoek met de HSplit tool.
Daarin zet je bv twee TableViews. Je kan ze dan met een vertikale balk groter en kleiner maken, waarbij de andere omgekeerd de resterende ruimte vult.

Hier de hiërarchie van kadertjes:

FMain: Arrangement = vertical
– HBox1: Expand = true
– – HSplit2: Expand = true
– – – TableView1: Expand = true, Autoresize = true
– – – TableView2: Expand = true, Autoresize = false

Ik wil TableView2 kleiner hebben, smaller eigenlijk, dan TableView1.

Maar ik vind nergens in de eigenschappen van de HSplit hoe ik dat kan instellen, bv in %, of op een vaste beginlijn.

Bij het openen van het scherm is de HSplit mooi in het midden ingesteld, hoewel in het ontwerpscherm TableView1 veel groter is dan TableView2.

In een gambas mailinglist vond ik een verwijzing naar de “layout”, die geen zichtbare eigenschap is in de IDE.

Nu heb ik in Form_Open() de volgende lijn achteraan staan:

HSplit2.Layout = [3, 1]

Dit geeft het effect van 3/4 TableView1 en 1/4 TableView2.

De instelling van de HSplit wordt niet mee bewaard met Settings.Write(Me) van een Form.

Objecten die een array bevatten

Array in een Klasse

Een objectklasse kan gegevens en methoden bevatten, maar ook bv een array. Die array kan bestaan uit getallen of tekst, maar kan ook weer uit objecten bestaan.

Ik maak een object met twee arrays;

  • 1 met string elementen
  • 1 met ‘object2’ elementen.

Object2 bevat enkel twee eigenschappen ter demonstratie: een tekstveld en een getal.

Een testprogramma maakt eerst de objecten en vult de arrays.

Daarna kan elk van de arrays weergegeven worden in een tabel.

(upd) Code testprogramma zie verder, maar eerst een opmerkig:

embedded arrays
Er wordt op online Gambas documentatie gewezen op het probleem van “embedded arrays” (lees meer).

Het testprogramma ziet er zo uit; het aantal elementen wordt bepaald door het getal, de tekst die opgeslagen wordt door het tekst-invulveld:

ArraysInObjectsFMainEdit

Als het draait:

ArraysInObjectsFMainRun

Hieronder de broncode … Continue reading

Klik en sleep van TableView naar GridView

Klik en sleep
De eenvoudige voorbeelden van klik en sleep met de muis, zoals die waarbij een tekst van een TextBox naar een TextLabel worden gesleept, schieten te kort als je een TableView of een GridView gebruikt (beiden even roosters genoemd). Immers: je kan een heel rooster slepen naar een ander rooster en daar allerlei leuke dingen mee doen, maar meestal is dat niet de bedoeling.

Cel in plaats van rooster
Je wil een bepaald vakje, één cel, of eerder nog de inhoud daarvan, naar een andere plaats slepen. De bestemming is dan niet een element als TextBox of GridView, maar ook weer een bepaalde cel van een TableView of GridView rooster.

Drag..
De basis blijft hetzelfde:
Voor de vertrekplaats moet een _MouseDrag() gemaakt worden:

PUBLIC SUB TableView1_MouseDrag()
  IF Mouse.Left
    Drag.Icon = PictureBox1.Picture
    TableView1.Drag(TableView1[TableView1.Row, TableView1.Column].Text)
  ENDIF
END

Ik heb in de IDE op voorhand een PictureBox1 op FMain gezet, er in de IDE een beeldje voor gekozen uit de verzameling (stock), en die PictureBox1.Visible op FALSE gezet.

.. en Drop
De bestemming moet als eigenschap Drop = TRUE hebben:

GridView1.Drop = TRUE

en er moet drop code gemaakt worden:

PUBLIC SUB GridView1_Drop()
  GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data
END

Om de data in de Text te krijgen van de gewenste cel op rij, kolom

GridView1[row, column].Text = Drag.Data

moet je die coördinaten eerst detecteren:

GridView1.RowAt(Drag.y)
GridView1.ColumnAt(Drag.X)

Dit is de kleine “truuk” om het klikken en slepen tussen TableViews en GridViews mogelijk te maken.
Er zit nog wel een addertje onder het gras: als je een beetje buiten de bestaande cellen sleept en daar in het gridview gebied onder de laatste rij cellen bv loslaat, zijn de coördinaten niet gedefineerd. Crash!

Dus:
TRY GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data

Verder moet je de code aanvullen met alles wat moet gebeuren, zoals opslaan in een databank, berekeningen enz.

Gambas script als shell script

Ben je zodanig aan Gambas verslingerd dat je een shell script liefst in Gambas schrijft?

Eenvoudig script

Het eenvoudigste voorbeeld is altijd de “Hello World”; maak een tekstbestand helloGambas.sh in ~/bin met als inhoud:

#!/usr/bin/gbs2
Public Sub Main()
   Print "Hello Gambas World v. " & System.Version
End

De eerste lijn geeft aan waarmee dit script moet uitgevoerd worden. Daarvoor kijk je waar gambas staat, bv met “which gbs2”; het antwoord op OpenSuse: /usr/bin/gbs2, elders bv /usr/local/bin/gbs2, enz.

Als je met Gambas versie 3 werkt is het :

#!/usr/bin/gbs3
Public Sub Main()
   Print "Hello Gambas World v. " & System.Version
End

Pas ook hier de eerste lijn aan aan je eigen systeem.

Maak het script uitvoerbaar
chmod +x helloGambas.sh
En start het van de commandolijn met de naam: ./helloGambas.sh

De uitvoer moet natuurlijk

Hello Gambas World v. 2

of

Hello Gambas World v. 3

zijn.

Nu heb je een script dat je kan starten vanop de commandolijn, net zoals je andere shell scripts.

Programma in plaats van script

Als je een veel groter/uitgebreider programma wil laten draaien, kan dat door een nieuw project te openen, kies bij Project Type voor “Command Line Application”.

Dan krijg je geen FMain, dus geen venster dat geopend wordt bij het starten van het programma.
Je krijgt wel een MMain als startende module, en je kan klassen bijmaken enz.

Andere opties mag je wel aankruisen, zoals “settings file managament” en “database access”.

Het uiteindelijke programma compileer je tot mijnProgramma.gambas, en je maakt het uitvoerbaar als het dat nog niet zou zijn.

Je kan dat programma dan aanroepen vanin een shell script, bv:
/home/username/bin/runTest.sh
met als inhoud:
/home/username/uitvoerbaar/mijnProgramma.gambas

In het script kan je ervoor of erna een touch doen naar een bestand om te checken of het script gelopen heeft:


touch /home/username/startedScript.txt
/home/username/uitvoerbaar/mijnProgramma.gambas

Als je vanuit dit shell script je gambas programma kan starten, kan je runTest.sh opnemen in de cron jobs: uitvoeren vanuit de cron jobs,.

Verdere interessante mogelijkheden zijn: een script laten uitvoeren als CGI script in een webserver, …

Gambas2 Runtime op OpenSUSE 11.4

Upd dec. 2015: op dit moment krijg ik op een nieuwe installatie van opensuse 11.4 + evergreen geen gambas2 meer geinstalleerd. Misschien lukt het nog met bestanden kopieren van een ander werkende 11.4 systeem…

Appliance: enkel runtime
Situatie: Oude hardware (Aspire One ZG5) kan toegewezen worden aan één bepaalde toepassing (combinatie van toepassingen voor eenzelfde doel), en moet niet algemeen als desktop pc onderhouden worden (geen browser updates nodig enz).
Daarvoor doen we een “nieuwe” OpenSUSE 11.4 installatie met alleen de Gambas runtime, en dus niet de hele programmeeromgeving (IDE); zie voor installatie volledige Gambas2 IDE hier).

Softwarebron
http://software.opensuse.org/package/gambas2, dan onder “unsupported distributions” openen, en dan
KDE:KDE3 – 2.24.0 32 Bit
En bevestigen; er begint een download die redelijk wat extra paketten ook afhaalt.
Nadien is de gambas runtime geïnstalleerd:

gambas2 – Runtime Environment for Gambas

/usr/bin/gambas2
/usr/bin/gambas2-database-manager.gambas
/usr/bin/gambas2.gambas

3 files total

“gambas runtime”
Volgende vraag: hoe gebruiken? Ik heb de runtime geïnstalleerd en ik heb een programma dat in de gambas IDE (op een andere computer) gecompileerd werd tot een .gambas bestand.
Bij pogingen het programma te draaien krijg ik altijd foutmeldingen, bv

/usr/bin/env: gbr2: No such file or directory

In /usr/bin staan uitvoerbare programma’s; gbr en gbx bestaan niet hier. gbr is een link naar gbx (zag ik op een systeem met de hele Gambas2 IDE). Maar zelfs als ze even geleend worden van het andere systeem werkt het hier niet mee; er komen weer andere fouten als gb.gui not found, maar die vind ik op het andere systeem ook niet als file of in de repo.

Ik doe nog eens het ommetje langs de opensuse website en kies nog eens de install van de 32bit versie uit de KDE3 repository:
http://software.opensuse.org/package/gambas2
En na wachtwoord vraag begint packagekit weer iets te installeren. Een hele lijst zelfs, waarin ik zie voorbijkomen:
waarin ook gambas2, en verder: samba, gimp-help, libreoffice converter en extentions, enz… om te eindigen in “File was installed successfully”.
Maar ik zie verder niet veel verschil, behalve dat mijn harddisk nu voor 4.4 Gb vol is ipv 3.9.

KDE3 bron
Ik voeg nog de KDE3 repository toe, manueel als URL, want de community optie werkt niet in mijn huidige 11.4:
http://download.opensuse.org/repositories/KDE:/KDE3/openSUSE_11.4/

Daarna is er veel meer Gambas2 in de lijst van Yast/Software management (zoek: gambas).
Ik zie alle afzonderlijke componenten, en kies de gambas2-gb-gui alleen uit. Die vereist dan nog een paar extra componenten, zoals de “runtime”- die zal daarmee vervangen worden veronderstel ik.

Nadien: ruimtegebruik: 4.5 Gb

Ik mis nu gb.form, die er in het package management uitziet als:

gambas2-gb-form – The control component for both GTK+ and qt

(Naam moet je weten als je zypper wil gebruiken). Installeer.
zypper install gambas2-gb-form

Zelfde voor:
gb.db: zypper install gambas2-gb-db
gb.db.form: zypper install gambas2-gb-db-form
gb.settings: zypper install gambas2-gb-settings
gb.qt:zypper install gambas2-gb-qt

Dit zijn er een paar meer:

Loading repository data…
Warning: Repository ‘openSUSE-11.4-Update’ appears to outdated. Consider using a different mirror or server.
Reading installed packages…
Resolving package dependencies…

The following NEW packages are going to be installed:
gambas2-gb-qt kdelibs3-default-style qt3

The following recommended package was automatically selected:
kdelibs3-default-style

3 new packages to install.
Overall download size: 3.1 MiB. After the operation, additional 10.2 MiB will be used.
Continue? [y/n/?] (y):
Retrieving package qt3-3.3.8c-219.1.i586 (1/3), 2.8 MiB (9.1 MiB unpacked)
Retrieving: qt3-3.3.8c-219.1.i586.rpm [done (377.9 KiB/s)]
Retrieving package kdelibs3-default-style-3.5.10-232.1.i586 (2/3), 128.0 KiB (381.0 KiB unpacked)
Retrieving: kdelibs3-default-style-3.5.10-232.1.i586.rpm [done (0 B/s)]
Retrieving package gambas2-gb-qt-2.24.0-22.1.i586 (3/3), 190.0 KiB (696.0 KiB unpacked)
Retrieving: gambas2-gb-qt-2.24.0-22.1.i586.rpm [done]
Installing: qt3-3.3.8c-219.1 [done]
Installing: kdelibs3-default-style-3.5.10-232.1 [done]
Installing: gambas2-gb-qt-2.24.0-22.1 [done]

Run
Maar daarna draait de applicatie perfect! En zonder de Gambas2-IDE.
Het .gambas bestand is uitvoerbaar gemaakt (chmod +x).
Voor alle .gambas programma’s een Gb2Run directory gemaakt in mijn home map, en daar gestart:
~/Gb2Run> ./mijnprogramma.gambas
Eens de meestgebruikte componenten geïnstalleerd, zijn toekomstige programma’s minder omslachtig te installeren, tenzij ze weer een nieuwe component nodig hebben.
Dit soort afhankelijkheden wordt waarschijnlijk opgevangen als je vanuit Gambas installatie-packages maakt.

Een array vullen met bestandsnamen

Een array arrFileNames moet gevuld worden met de namen van de bestanden uit een directory sDirectory.

En hoewel je de directory kan gaan doorlopen en één voor één de namen uitlezen en in een array toevoegen met “insert’, bestaat er een snelle en handige manier in gambas met “Dir“, dat een array teruggeeft op een selectie van bestanden:

aFiles = Dir(sDirectory, "*.txt")

Voorbeeld van uitlezen van beelden en opeenvolgend tonen in bestaande Picturebox1 :

 DIM s AS String
...
 TRY aFiles = Dir(sDirectory, "*.png")
 IF ERROR 
    DEBUG Error.Text
  ELSE 
    FOR EACH s IN aFiles
      Picturebox1.Picture = Picture.Load(sDirectory &/ s)
      Message.Info(s) ' toon bestandsnaam en wacht
    NEXT 
  ENDIF