Gambas verstaat Note en Todo

Ik heb een beetje toevallig ontdekt dat Gambas een mooi overzichtje geeft van bepaalde opmerkingen die ik in de broncode heb gemaakt. Ini het deel van het venster onderaan waar de foutmeldingen van het compileren komen, kan je ook kiezen om de “Notes” te zien. Selecteer het Notes icoon in het rijtje “Konsole”, “Waarschuwingen”, “Notes”, “Versiecontrole (Git)”.

In vier kolommen krijg je een ovezicht van opmerkingen (commentaren) die je in je broncode gemaakt hebt met een bepaald voorvoegsel, bv “Todo” of “Note”. NOTE’s worden in het zwart getoond, TODO’s in het groen.

Type | Klasse | Lijn | Tekst

NOTE | Klassenaam1 | Lijnnummer | Tekst van de commentaar

TODO | Klassenaam2 | Lijnnummer | Tekst van de commentaar

Als je op een lijn klikt ga je onmiddellijk naar die code in de editor. Zeker handig als je een onafgewerkt stuk code aangeduid had met Todo, en het nadien vergeten was. Andere commentaren die in mijn code staan verschijnen niet, zoals “reload list”, “ok” enz.

Gambas3 op openSUSE 15.6?

(Kort: niet gelukt en ik ben overgestapt op Tumbleweed en Gambas 3.20.4)

In openSUSE 15.5 was Gambas3 niet aanwezig (op software.opensuse.org; wel ooit op een andere manier aan de praat gekregen). Maar na een update naar openSUSE 15.6 kunnen we daar weer wel op een “community” package 1-klikken om te installeren of om te bewaren als een installatiebestand: gambas3.ymp

home:munix9 Community 3.20.4

home:munix9:unstable Community 3.20.99+git.20250606….

Na aanvankelijke installatie daarvan is gambas er nog niet (misschien wel de runtime), en kan je verder gambas installeren uit het package management van gambas3. Die is daarna te vinden in het (klassiek) menu onder developement.

Helaas start Gambas3 met een fout:

 
This application has raised an unexpected
error and must abort.

Unable to find method Application_Log in class Project. Symbol not found.

[gb.jit].CCompilation.Wait.247

Even checken vanop de commandline:

**  
** OOPS! INTERNAL ERROR. Program aborting, sorry! 🙁
** Unable to compile JIT source file
**  
** [gb.jit].CCompilation.Wait.247: Unable to find method Application_Log in class Project. Symbol not found
**  
** Please send a bug report to the gambas bugtracker [1] or to the gambas mailing-list [2].
** [1] https://gambaswiki.org/bugtracker
** [2] https://lists.gambas-basic.org/#user
**

gb.jit: error: unable to compile JIT pointers of 'gb.form.terminal': 
| gcc: error: unrecognized command line option ‘-std=gnu17’; did you mean ‘-std=gnu11’?
|  

**  
** OOPS! INTERNAL ERROR. Program aborting, sorry! 🙁
** Unable to compile JIT source file
**  
** [gb.jit].CCompilation.Wait.247: Unable to find method Application_Log in class Project. Symbol not found
**  
** Please send a bug report to the gambas bugtracker [1] or to the gambas mailing-list [2].
** [1] https://gambaswiki.org/bugtracker
** [2] https://lists.gambas-basic.org/#user
**

Dit was dus geen succes, en ik probeer met Tumbleweed.. 14/6/2025

Distributions

openSUSE Tumbleweed

Education Experimental 3.14.3

home:gambas:stable Community 3.20.4+20250520+1

Gambas3 start alvast, ik check verder of bestaande programma’s werken…

Scripting

In forum.gambas.one vind je een voorbeeld om snel te starten:

#!/usr/bin/env gbs3
 Public Sub Main()
    Dim strFiles as String

    Exec ["ls", "-l"] To strFiles
    Print strFiles
 End

Bewaar het als script, met een naam bv Gb3TestScript1.gbs en maak het uitvoerbaar (chmod +x of in je bestandsbeheerder).

Om het te starten ga je in die directorie staan en doet

./Gb3TestScript1.gbs

Dit scipt doet niet veel bijzonders, maar het is een aanknopingspunt; zo kan je de uitvoer bv

  • op een gedeelde locatie zetten (bv nextcloud) om beschikbaar te maken voor collega’s
  • in html opmaken en in een directory van de webserver bewaren om zichtbaar te maken enz.

Programmanaam en datum

Gegevens over het gambas programma zelf krijg je vanuit code met Application

Print Application.Name
Print Application.Version

* Name is niet noodzakelijk hetzelfde als Application.Title (die kan anders gekozen zijn – zie Project Eigenschappen, Titel; het is een vrije tekst. Dit in tegenstelling tot de naam die overeenkomt met de projectmap-naam).

Moeilijker is de datum van het programma zelf, want terwijl je werkt in de IDE is dat eigenlijk niet gedefinieerd. Pas als je een executable hebt gemaakt (Project, Maak uitvoeringsbestand) kan je weten wat de datum van het uitvoerbare programma is.

Gegevens van een bestand vraag je op de commandolijn op met stat, en dat is overgenomen in Gambas in het commando Stat

De naam van de executable kan je niet direct opvragen, maar wel samenstellen uit pad, naam en de uitgang .gambas

De datum van een bestand: Stat(“naamvaneenbestand”) kan je zo invullen:

Stat(Application.Path &/ Application.Name & ".gambas").LastModified

Maar! als je deze code draait vanuit de IDE (F5 uitvoeren) krijg je een foutmelding: “File or directory does not exist”

Dat kan je opvangen door er Try voor te zetten, toon eventueel de foutmelding ergens:

' (er is een TextLabel voor de titel gemaakt) 
txlbTitle.Text = Application.Name & " (datum ...)"
Try txlbTitle.Tooltip = Stat(Application.Path &/ Application.Name & ".gambas").LastModified
If Error Then
txlbTitle.Tooltip &= " tried path/name: " & Application.Path &/ Application.Name & ".gambas" & " err: " & Error.Text
Endif

MySQL/mariadb zonder ssl?

In openSUSE Tumbleweed werkt de databaseverbinding naar een lokale server niet vanuit een Gambas programma.

Op de commandline met mysql client wordt duidelijk dat een veilige verbinding verondersteld wordt (ssl), maar mijn interne server heeft dat niet. Je kan met een parameter --skip_ssl afdwingen om dat niet te doen, maar hoe doe je dat vanuit je Gambas programma? Ik dacht het ooit al eens opgelost te hebben maar ik weet niet meer hoe…

De help van de client zegt: Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf

In een post las ik:

“If you don’t want to type --skip-ssl on the command line every time, you can instead add this to /etc/mysql/mariadb.conf.d/50-client.cnf or ${HOME}/.my.cnf
[client]
skip-ssl = true

Maar dat lijkt niet gebruikt of gelezen te worden door het gambas programma…

In openSUSE Leap 15.6 werkt het (nog) wel en is Gambas3 (ook/weer) installeerbaar.

Bladwijzer in de broncode (bookmark)

Als je een probleem in de broncode aan het oplossen bent, moet je kunnen heen en weer springen tussen verschillende stukken code. Daarvoor kan je een bladwijzer zetten om je vorige positie te onthouden: sta op een lijn en druk Ctrl-B. Er verschijnt een zacht (lichtblauw bij mij) pijltje voor de lijn.

Ga naar een willekeurige andere lijn in je text (als je weet dat je rond 500 bezig was, druk Ctrl-G 500.

Ga nu snel terug naar je bookmark met Alt-PageUp of Alt-PageDown.

Dat is handiger dan er breekpunten voor te gebruiken, die kunnen later hinderen.

Gambas en GPIO op Raspberry Pi

Een poging om commandline gpio te gebruiken vanuit/om te leiden naar een Gambas programma.

Library "/user/local/libpigpio"

Public Sub testGPIO()

Dim sAnswer As String
Dim sCommand As String

sCommand = "gpio -h"

TRY SHELL sCommand TO sAnswer

TextAreaOut.Text = sAnswer

End

Ik ga er van uit dat je een Form hebt, FMain, waar je deze code in plakt.

Op de Form heb je een TextAreaOut gemaakt.

Je kan op het scherm dan een button zetten, die deze code aanroept.

Public Sub Button1_Click()

testGPIO()

End

Hetzelfde kan je doen met gpio -g readall in sCommand; dat leest de pinnen uit naar een tabel met informatie en pin-nummers (incl BCM nummers). Enz…

Combobox titel

Ik heb een eigenaardigheid op een rapsberry pi met het gebruik van comboboxen: als je bv 3 elementen toevoegt, dan zal de combobox bij opstarten toch een lege text hebben (niet de waarde van bv eerste item). Maar je kan niet zelf iets zetten in die lege tekst (bv een titel zou handig zijn, die aangeeft wat de inhoud van de keuze is).

Dit in FMain:

Public Sub Form_Open()
'ComboBox1.Add("Choose here..")
ComboBox1.Text = "Choose here"
ComboBox1.Add("ABC")
ComboBox1.Add("Def")
ComboBox1.Add("Ghi")
'ComboBox1.Index = 0
ComboBox1.ReadOnly = True
'
ComboBox2.Add("Choose here")
ComboBox2.Add("ABC")
ComboBox2.Add("Def")
ComboBox2.Add("Ghi")
'ComboBox2.Index = 0
ComboBox2.ReadOnly = True
End
'
Public Sub ComboBox1_Click()
Message.Info(ComboBox1.Index)
End
'
Public Sub ComboBox2_Click()
Message.Info(ComboBox2.Index)
End

De ComboBox1.Text geeft geen foutmelding, maar is ook niet zichtbaar.

KDE: Vanaf je gekozen hebt in de combobox, verdwijnt de “lege lijn” bovenaan.

In tegenstelling to op de Pi: Je kan altijd terug naar de “lege” toestand.


Gambas3 op Raspberry Pi 500 (3)

In tegenstelling tot een voorgaande installatie op een Raspberry Pi 5, geraak ik hier toch verder op de 500:

Gambas3 uit de software installer van het Raspberry Pi menu gekozen (IDE en bijhorende automatisch geselecteerd). Gambas staat in het menu maar start niet – komt bekend voor (2). Foutmelding idd iets met Wayland.

Als je apart de Wayland module bij-selecteert, start Gambas3 daarna wel op maar toont van die rare horizontale lijnen als een defect televisietoestel.

Ik kan het menu “Project” niet oproepen in de IDE. Nee dat is de desktop, je moet eerst het vorige menu sluiten.

  • een CLI applicatie: “Hello World” werkt, compileren tot testCLI.gambas werkt, kan opgeroepen worden vanop de commandline, kan inhoud .txt bestand tonen.
  • een GUI applicatie: Knop en Message, werkt, kan ook .txt bestand openen en tonen.

Nog even afwachten en verder gebruiken, maar het lijkt dat de meeste problemen van (2) opgelost zijn.

Datacontext voor directories voorbeeld

Datacontext voor directories: een voorbeeld (met in groen hoe het er uit ziet in het configuratie/settings bestand)

De code

dim bOk as boolean

We leggen bv eerst vast hoe onze dirset gaat heten*:

bOk = newDirSet("Export")

[DirSet]
Export = ""

Best een beschrijving geven om uit te leggen wat hiermee moet gebeuren:

updDirSet(“Export”, “Dir for data export from this application”)

[DirSet]
Export = "Dir for data export from this application"

Kan ook in één keer:

bOk = newDirSet("Export", "Dir for data export from this application")

.. met hetzelfde resultaat als boven in het settings bestand; toon beschrijving van..

print getDirSetDescription("Export")

Dir for data export from this application

We kunnen alle (in configuratiebestand) bestaande dirsets opvragen:

arrString[] = getAllDirSetNames()

Directory path opslaan

En nu het belangrijkste: een directorypath bewaren voor een bepaalde dirset; hier context 0 **:

setDirValue(0, "Export", "path", "/home/copyleft/Data/Export")

[Datacontext0-Export]
path = "/home/copyleft/Data/Export"

(**) Als een datacontext in gebruik is kan je de huidige id opvragen:

print hDataContext.getCurrentContextId()

En dan écht het belangrijkste: getDirValue opvragen; hier tonen we hem enkel:

print "We export to: " & getDirValue(hDataContext.getCurrentContextId(), "Export", "path")

We export to: /home/copyleft/Data/Export

De directory opvragen gebeurt in je applicatie op het moment dat je daar iets mee wil doen; bv een tekst bewaren in een bestand:

File.Save(getDirValue(0, "Export", "path") &/ "ExportOfTheDay.txt", sText);

Intern gebruikt DataContext deze methode om de Settings te maken:

print getContextDirSet(0, "Export")

Datacontext0-Export

Wat er in het bestand zo uitziet (zie ook hierboven):
[Datacontext0-Export]
...

(*) De naam “Export” zal misschien vastliggen in je applicatie, of laat je daar kiezen.

Ook de sleutel “path” kan je in principe kiezen. De Datacontext bewaart er verder nog de datum van aanmaak en laatste wijziging bij, die kan je nazien in het configuratiebestand (momenteel nog niet vanuit een methode in de library, tenzij je in getDirValue de juiste sleutel meegeeft, zoals csKEYMODIFIED, zie definities in DataContext class).

Andere voorbeelden

  • Import : bv om txt bestanden in te lezen
  • Pictures: bv iconen of beeldmateriaal waarnaar gelinkt wordt / om ze te laden in de applicatie
  • Export : zoals hierboven, bv om vanuit een applicatie een CSV export bestand te maken en dat op een vaste plaats voor de gebruiker te bewaren.
  • Cam: opgenomen beeld met webcam

DataContext: het unieke van het gebruik met het datacontext concept is dat je voor iedere “DataContext” aangepaste directory locaties kan opslaan. Door de datacontext om te schakelen gebruik je andere databases en andere directories, bv:

  • Datacontext0 = “Dev”, locale map op mijn laptop waarop ik programmeer; en de databaseverbindingen gaan naar mijn “localhost” database met testgegevens.
  • Datacontext1 = “live”, een map op een server of nextcloud die gedeeld wordt met andere gebruikers, en de database instellingen spreken de echte servers met live aan.

Toegepast op ons voorbeeld zou ons instellingenbestand zoiets bevatten (de database gegevens even weggelaten):

[DataContext0]
Name = "Live"
Description = "Echte gegevens, in gebruik

[DataContext1]
Name = "Dev"
Description = "Ontwikkelomgeving local(host)"

[DirSet]
Name = "Export"
Description = "Export csv files here"

[DataContext0-Export]
path = "/nextcloud/shared/myappdata/out"
created = "01/01/2024"

[DataContext1-Export]
path = "/home/username/myappdata/out"
created = "03/01/2024"

...