Tijd vergelijken, berekening met tijd

Als je een berekening moet doen met tijden, gebruik je best de ingebouwde DateDiff.

Bv. :

DateDiff(Settings["SomeTime/Start"], Time(Now()), gb.Minute) / 60

Dit geeft een negatieve waarde als tweede parameter kleiner is.

Fout is de tijd op zich proberen te vergelijken:

IF (Settings[“SomeTime/Start”] > Time(Now()))
IF (Settings[“SomeTime/Start”] > Format(Time(Now()), “hh:mm”))

Deze laatste is dubbel fout want minuten worden niet voorgesteld door mm maar door nn.

Zie ook Rekenen met tijd (dagen).

Driver name missing

Een foutmelding in een programma bij het maken van een databankverbinding:

Driver name missing

Er kan wel manueel ingelogd worden vanop de commandolijn met de gegevens zelf (host, gebruiker, ww).

De foutmelding “Driver name missing” betekent normaal dat één van de eigenschappen in het connection object niet gegeven is, nl

connection.name = "mydatabasename" (zie “login” voor user-name). Of wijst “driver” eigenlijk op type: connection.type = "mysql"?)

(ik herinner me vroeger al eens naar een gelijkaardig probleem gezocht te hebben, dat uiteindelijk niets met de driver name, hier “mysql” te maken had – de fout zat elders maar had deze melding tot gevolg.)

Soms heeft het te maken met een verkeerd interpreteren van de al dan niet geïnitialiseerde of open verbinding.

Maar er zijn ook andere omstandigheden waarin deze foutmelding voorkomt, bv:
– je gebruikt een verkeerd connection object, bv lokaal ipv ModuleData (localhost/remote) …
– connection object is niet geïnitialiseerd of gecreëerd: hConnection .login, .password, .host, .name.; als ze uit een config bestand komen, check die inhoud.
– er worden lege parameters gestuurd in het commando dat de database aanspreekt (door missende initialisatie van strings, settings, …)

Andere dingen om te proberen?
– de gegevens van de gebruiker op de server zijn wel aangemaakt maar er zijn geen rechten toegekend op de database. Ook vervelend is als de rechten specifiek op tabellen en zels velden zijn gegeven (of vergeten – of er is een veld bijgekomen enz..).
– de gegevens van de gebruiker op de server zijn wel aangemaakt maar niet geladen (refresh)?
– draait de database server?

compile gambas app van de commandolijn

Compileren: gbc3
Ga in de projectdirectory staan. Tik daar:
gbc3 -a

upd: moet blijkbaar kleine a zijn gbc3 -A

Uitvoerbaar programma:
Het uitvoerbare programma maak je door de bestemming/naam op te geven bij gba3:
gba3 -o ~/mygambasprog.gambas

Link op de desktop etc
zie vorige posts …
Icoon: http://gambas.copyleft.be/blog/archives/112
Werking gambas: http://gambas.copyleft.be/blog/uitvoeren
Source archive uitpakken, compileren en draaien: http://gambas.copyleft.be/blog/archives/148

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/*/
*~

Ongewenst sluiten tegenhouden

Een gebruiker kan per vergissing op het x teken duwen boven in de balk van het venster, als hij bv het venster wil verkleinen of vergroten. Dan sluit de applicatie onherroepelijk af.
Je kan in het Close event wel eindprocedures opnemen die data bewaren en verbindingen sluiten en zo, maar kan je ook de “Close” tegenhouden?

Ja dat kan
Maak ergens een boolean die bepaalt of het venster gesloten (m.a.w. het programma gestopt) mag worden of niet. Je kan die bv zetten als je bepaalde verbindingen of bestanden geopend hebt, processen gestart hebt enz.).
ps: Zorg dat je ook ergens een situatie voorziet dat die teruggezet wordt. Normaal zal dat zijn na het sluiten van die dingen door een normaal eind-bevel, met quit-knop of menu.

Stop Event

MMain
Public bShowHasStarted as Boolean = FALSE ' indicates active use
Public Sub Form_Close()
  If MMain.bShowHasStarted 
    Message.Info("Please stop all processes first (close files, connections etc) ")
    Stop Event
  Else
    doClose()
  Endif
End

Settings[“sSlot/sKey”]=”value”

Terminologie
Een mooi voorbeeld van benoemen van de rubriektitels in het Settings bestand is “slot” en “key”. Slot is de titel, key is de variabele naam. Beiden zijn nodig om de waarde (value) op te vragen.
Ik probeer het bewaren van instellingen door middel van de module “Settings” een beetje te stroomlijnen, vooral in het kader van het bewaren van verschillende databank-toegang omgevingen waarin een gambas3 programma gedraaid wordt: ontwikkeling, test, ingebruik (development, testing, in production).

Veel van het gebruik van “Settings” zit vervat in deze code:

Dim sSlot, sKey as String
'
For Each sSlot In Settings.Keys
  Print sSlot
  For Each sKey In Settings.Keys[sSlot]
    Print sKey & ": " & Settings[sSlot &/ sKey]
  Next
Next

Een klasse kan helpen bij het beheren; bv CDataContext.

(wordt aan gewerkt)

In memorial: Domotiga

Spijtig genoeg voor iedereen die met Gambas3 en Raspberry Pi werkt, is Domotiga al een tijdje verdwenen, ik schat van ongeveer 2015. De website www.domotiga.nl ging ergens in de zomer van 2015 (mei?) over in de site van CyberJunky’s Blog, alter ego van een zekere Ron “RDNZL”, de auteur van Domotiga. Die naam herken je zeker als je op de Gambas mailinglist ingeschreven was, daar was hij erg aktief meen ik mij te herinneren, en daarmee ook een aanwinst voor Gambas gebruikers in het algemeen.
Op CyberJunky vond je nog links naar Domotiga en DomotiYii, maar ondertussen lijkt er enkel een wordpress reklamesite van één of ander netwerk op de domeinnaam domotiga.nl te staan.

Ergens las ik dat de maker van Domotiga zelf overstapte op een ander systeem voor zijn domotica toepassingen (ok, dat klinkt erg onwetenschappelijk) – ik zie op de cyberjunky github pagina allerlei “Home-assistant” werk.. dat terug te volgen is tot december 2016. Home Assistant draait op Python.

Je vindt nog wel resten van Domotiga terug, bv in web.archive.org, waar je op de about pagina kan terugvinden dat Domotiga startte als een eigen versie van ‘Misterhouse”.

De laatste updates aan de Domotiga github repository vermelden (op dit moment) “May 16, 2019”, dus mogelijk draait het hier en daar nog wel…

Object-eigenschappen aanspreken

Ik ontdekte een niet backward-compatible verschil tussen Gambas3 versies:

In Gambas 3.14:

With Chart
  .BackGround = Color.Yellow  
  .Title.Text="Titel"
  With .XAxe
    .MinValue = 300
    .MaxValue = 900
  End With
End With

In Gambas 3.9:

Voorgaande code geeft een fout in Gambas 3.9: “Geen object in FMain:29”
Regel 29 bevat de geneste aanspreking van objecteigenschappen: With .XAxe
Die moet vervangen worden door With Chart.XAxe

With Chart
  .BackGround = Color.Yellow  
  .Title.Text="Titel"
  With Chart.XAxe
    .MinValue = 300
    .MaxValue = 900
  End With
End With

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/