Venster met invoer (vraag en antwoord)

Situatie: je hebt een form FMain, en je wil een vraag stellen waarbij je een antwoord verwacht van de gebruiker, dat je nodig hebt voor het verdere verloop van het programma.

Als dat een eenvoudig Ja/Neen of iets dergelijks is, kan je gewoon Message.Question(...) gebruiken; daarbij kan je detecteren welke knop gedrukt is (de waarde komt uit de Message return waarde);

If Message.Question("Really delete from database?", "Yes", "No-Cancel") = 1

– er wordt geteld vanaf 1 (bv 1=”ok” 2=”ok+save”, 3=”cancel”)
– laatste keuze is altijd de “cancel” keuze, is ook default
Antwoord dus bv 1, en daarop reageren via bv SELECT.
Maar als je echt invoer van een woord of tekst hebt, hoe dan?

Ik weet niet of het “de” juiste manier is in Gambas, maar ik loste het zo op:

Ik maak een Form FGetText met enkel
– een tekst voor de vraag (TextLabel)
– een tekstveld voor de invoer (TextBox)
– een sluiten-knop (Button)
En een procedure die public is om de vraag op te geven: setQuestion(s as string) en die in de form die vraag in een TextLabel steekt.

Deze form wordt aangeroepen

Dim sNewFile As String
'
MMain.sGetText = ""
FGetText.setQuestion("New text title or enter for default.txt ")
FGetText.Show
Wait 0.1
While Not FGetText.Closed
' this is where the form works...
Wait 0.1 ' until it is closed
Wend
If (MMain.sGetText) ' this is where the answer is found
' etc.

Als de Form gesloten wordt, geeft die eerst de waarde die ingevuld is door aan een public variabele in MMain. Deze procedure wordt aangeroepen na een “enter of return”, of de textbox nu leeg of gevuld is.

Het programmaverloop kan daar dan de waarde ophalen nadat het venster gesloten is; indien leeg kan een voorgedefinieerde standaardwaarde gebruikt worden.

Ik heb lang gewacht om dit uit te zoeken omdat ik dacht dat er toch een Gambas manier moest zijn om dat anders te doen, en misschien vind ik die ooit nog… maar toch..

Veel plezier..

Gambas en git

Gambas maakt in de laatste versies gebruik van git, en toont dat ook in zijn IDE.
Ook bij de ontwikkeling van Gambas3 wordt git gebruikt. Een overzicht op:
https://gambaswiki.org/wiki/howto/git

Maar Gambas bestaat van voor git, en als je git gebruikt met een Gambas project rijst de vraag:
Welke bestanden moet je opnemen in git?

Bij het werken met git kies je welke bestande je onder git toezicht zet, en lokale bestanden die niet nodig zijn voor de ontwikkeling bij een andere programmeur, hoeven niet/mogen niet mee opgenomen worden in git. Sommige daarvan zijn ook onzichtbare bestanden/directories.

Gambas zelf (sinds 3.6) maakt een .gitignore bestand aan, dat git vertelt wat moet genegeerd worden. Daarin bv .gambas, wat de gecompileerde versie is van je project (die zet je altijd beter buiten je projectdirectory want anders wordt die ook mee ingepakt als je een export .tar.gz maakt vanuit de IDE.

Ook andere dingen moeten niet meegaan: de .directory bv, die KDE gegevens bevat.

Voorbeeld van een .gitignore: versie5 , oudere versie1 en .gitignore van Gambas3 zelf …

Huidige (upd 09/2021):

#---- Gambas files to ignore (v5)
*.gambas
.lock
*~
core
core.*
vgcore
vgcore.*
.kdbg*
.*.prof
.lang/*.pot
.gambas/*
.settings
.startup
.list
.info
#----
.directory
.icon.png

Waarbij

  • .directory en .icon te maken heeft met kde, niet met Gambas
  • ~ zijn meestal tijdelijke hulp of backup bestanden, bv van de editor
  • .lang/*.pot heeft te maken met de vertaling van je project
  • .settings: heb ik al ondervonden als vervelend als die in de git repo terechtkomt omdat er ook “eigen” instellingen in staan als de vensters die je open had, plaats waar jij de executable zet (met de naam van je /home/user/..) enz.
    .project komt niet voor in de .gitignore, maar die bevat ook zo’n lokale instelling: SourcePath=/home/username/…

De .gitignore van het Gambas project zelf:

Makefile
Makefile.in
libtool
ltmain.sh
stamp-h1
warnings.log
.deps/
aclocal.m4
config.guess
config.log
config.sub
configure
install-sh
autom4te.cache
config.h
config.h.in
config.status
config.cache
compile
depcomp
missing
/m4/libtool.m4
/m4/ltoptions.m4
/m4/ltsugar.m4
/m4/ltversion.m4
/m4/lt~obsolete.m4
.libs/
*.la
*.lo
*.o
*.a
.dirstamp
*_moc.cpp
*.pot
*.mo
*.gambas
main/gb*/gb*3
DISABLED*
.startup
.settings
.info
.list
.action/
.jit/
**/.gitignore
app/other/MakeWebSite/gambas.sourceforge.net/*/
*~

Grafiekenmodule in Gambas

Hoe grafieken tekenen?

Er bestaat, naast SimpleCharts, al redelijk lang een nooit-afgewerkte eigen gambas-module om grafieken te tekenen, “gb.chart”. (nb: niet in OpenSUSE 15.1 default repo (gambas 3.10.0), wel in alternatieve repo community: home:munix9 (bv Gamabas 3.15.1) en ook in 15.2.
Maar daar is weinig documentatie of voorbeeldmateriaal over te vinden. Ik heb nu een (in een oude discussie op forum.gambas.one) een voorbeelprogramma gevonden dat wel inzicht geeft:

ChartTest

  • componenten: gb, gb.chart, gb.form, gb.gui, gb.image
  • Projecttype: normaal
  • 0 modulen, 1 klasse, 1 form, 65 regels code
  • een “data” bestand met 7 lijnen van telkens twee cijfers, met komma gescheiden;

Op de Form is een DrawingArea geplaatst.

Het databestand wordt onmiddellijk in een array van strings geladen.

Chart wordt onmiddellijk aangesproken (dus geen hChart=New Chart of zo..)

De module heeft wel wat mogelijkheden:

  • type grafieken: Area (perc, stacked, symbols), Bars (perc, stacked), Columns (linecombination, stacked, percent), Lines (symbols, percent, stacked), Pie (Offset1, Offset2, Rings), Plots.
  • de titel kan opgegeven worden Chart.Title.Text = , maar geen subtitel (iets kleiner onder de titel)
  • de grafiek schaalt mooi mee in de hoogte en de breedte bij het wijzigen van het venster
  • de achtergrondkleur kan opgegeven worden
  • de horizontale lijnen kunnen aan/af gezet worden Chart.YAxe.ShowIntervalLines=True
  • de grafiekkleuren voor de dataranges kunnen opgegeven worden
  • je kan een legende zetten, met legende titel, en de kleurtjes van de grafiek, met label
  • Als er te veel waarden zijn op X en Y as (bv meer dan 200) worden de waarden van de as over elkaar heen gedrukt en zijn ze niet meer leesbaar. Je kan daarom een soort schaal zetten, bv Chart.YAxe.Step = 10, of je kan de waarden onderdrukken mbv Chart.XAxe.Visible = False (dus niet de X-as wordt onderdrukt maar enkel de weergave van de waarde op die as)

Opmerkingen:

  • het is niet altijd duidelijk waarom iets niet werkt zoals je verwacht: begrijp je iets niet of is dat onderdeel niet klaar? De documentatie en/of de help is niet altijd volledig.
  • Legende: Legend.Position, blijkt standaard 2 maar het is niet duidelijk wat je ermee kan doen; andere (+/- integer) waarden tonen de legende niet, ik dacht bv om ze in het vlak van de grafiek te zetten om plaats te winnen.
  • Geen subtitel
  • Als er veel waarden op een as van het type tekst (of datum) zijn, is het niet mogelijk om er af en toe een af te drukken, je kan ze enkel afzetten. En wat doet Autoscale T/F?
  • de DrawingArea in een Form laat niet toe andere elementen op die form te zetten; bv bovenaan een knop met kleurkeuze of zo, dan valt er onderaan een stuk van de grafiek weg. Misschien zal je dus in je FMain een apart venster moeten oproepen met de grafiek alleen.
  • het zou misschien handiger zijn een object te hebben ipv een module?

Voorbeeld van gebruik met iets meer data: https://sourceforge.net/projects/garlic3/files/Examples/Gambas3Charts/

Nieuw project in gambas, hulpmiddelen

(Zie ook de praktische nieuwe project checklist en bij het programmeren de domme fouten checklist)

Enkele hulpmiddelen bij het starten van een nieuw project:

Leeg project
– Gebruik een sjabloon of een modelproject om van te starten. Het standaard leeg project van Gambas zelf bevat niets meer dan een startprocedure (methode), maar zelf zal je merken dat je telkens hetzelfde soort dingen er standaard insteekt. Denk maar aan een menubalk met File, Edit, Help/About/Changes/Licentie.. enz. Je maakt je eigen standaard leeg project met die menu’s er allemaal in, en dan kan je iedere keer daarvan starten. Je zet dat best online zodat je er van overal aankan. Je past het ook aan met de kennis en ervaring die verder opdoet, zodat het leeg project je steeds meer werk bespaart. (Voorbeeld “Emptyproject”).

Instellingen
Vrij snel merk je dat je allerlei instellingen wil bijhouden, zoals adressen van servers waarmee je verbindt, instellingen op het scherm van de gebruiker enz. Daarvoor dient de “settings” module van Gambas. Maar zowel het uitlezen van de settings als het bewaren ervan moet je programmeren, en die kunnen niet beide tegelijk klaar zijn. Met een “Gambas settings tool” kan je een nieuw settings bestand maken voor je project, met een scherm om snel de sleutel/waarde combinaties in te geven, er waarden inzetten zodat je ze al kan uitlezen met code, controleren wat je programma er in geschreven heeft enz. (Voorbeeld “Gambas Settings Tool”)

Vormgeving
Om de vormgeving een beetje te stroomlijnen kan je een form “Layout.form” maken waarin alle kenmerken voorkomen, bv de voor- en achtergrondkleuren van je schermen, de eigenschappen van de tekst, enz. Er hoeft geen code in te zitten, maar je kan wel zien hoe het er uit ziet op het scherm. Je zet er van ieder object een voorbeeld van op een scherm, (wel public zetten) en je applicatie neemt telkens daar de kleur, font, enz. van bij het openen van een nieuw scherm. (Zoals in Main.form bv een tekst die je initialiseert in FMain met txbx.Foreground=FLayout.txbxInput.Foreground). Als je dan je Layout.form aanpast, is heel je applicatie aangepast!

Databank
Ook voor de databank-koppeling kan je je laten helpen.
– Instellingen: door een vaste manier van databankgegevens op te slaan in de settings, met de mogelijkheid om te schakelen tussen je ontwikkel-databank (op je laptop bv), een test-databank op een testserver, en je productie-databank voor het uiteindelijk gebruik.
– Ontwerp: bij het ontwerpen van de databank komen bepaalde velden in tabellen telkens voor, zoals de id, het bijhouden van de datum van wijziging van een record, en de gebruiker die het wijzigde, een opmerkingen veld, enz. Met een tool kan je snel een nieuwe tabel maken, waarbij de standaard velden al voorgesteld worden op het scherm en je maar moet aanvinken welke je wil, en er bovendien automatische een data-dictionary bijdrage wordt gemaakt met mogelijkheid tot voorbeeld data en uitleg over de velden. (Voorbeeld: “DbInfoCode”)
– Ontwikkeling: bij het omzetten van objecten naar de databank of omgekeerd (persistence), van record naar objecten heb je ook telkens wat standaard handelingen als bewaren en ophalen van de inhoud van het object, het omzetten van de velden naar de properties van het object. Een hulpprogramma kan de velden van de records lezen en er objecten met properties voor maken, met de bijhorende get/set procedures. (Voorbeeld: “DbInfoCode”)

Opkuis
Om af en toe je programma op te kuisen, bv allerlei variabelen die je ooit eens maakte maar nooit gebruikt, kan je ook een hulpprogramma gebruiken dat de code voor je leest en op zoek gaat naar wat weg mag enz. Voor Gambas2 gebruikte ik daarvoor “ProbableCause”, maar nu is veel daarvan al geïntegreerd in Gambas3.

Door deze hulpprogramma’s zelf te programmeren kan je ze steeds laten evolueren met je noden. Zet ze online en schrijf erover.

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.