Log en error lijstje (in listbox)

Experiment met listboxen voor log en foutberichten op scherm en Ik kan de logberichten daarin zetten met lsbx.Add(s, 0) .

Maar ik wil het op een minder storende manier:

  • Ik heb op mijn Form een aparte listbox voor fouten lsbxErr en één voor gewone logberichten lsbxLog
  • Die zitten samen in een dichtklapbaar parent (Expander), zodat ze niet in de weg staan als ze niet relevant zijn.
  • Als het maximaal aantal lijnen in de listbox (iSize) is overschreden, wordt de oudste lijn verwijderd (onderste)
Form content here..
….
….
Expander with lsbx’s starts under here :


Note: expanded = lsbx’s visible
lsbxLog:
– log line 0
– log line 1
..
lsbxEr:
– err line 0
– err line 1

Zet de instellingen van de form objecten:

  • Form Arrangement: vertical
  • Form content Expand: True
  • Expander.Arrangement: Horizontal
  • Expander Expand: True
  • Iedere listbox Expand: True

We willen het verloop van de berichten zo:

  • Een logbericht komt bovenaan bij in lsbxLog, en verandert niets aan de zichtbaarheid (als Expander open of gesloten stond blijft dat zo)
  • Een errormessage komt bovenaan in de lsbxError, en opent de parent Expander.
  • Het laatste bericht komt als Tooltip te staan van de eigen Listbox én als text van de parent expander; bij gesloten expander is zo het laatste bericht leesbaar.

Om hetzelfde te kunnen doen op al onze forms zetten we de code in MMain:

Public Const csHide As String = "h"
Public Const csShow As String = "s"
Public Const csUnchanged As String = "u"
Public iMaxLsbxLen As Integer = 100

Public Sub addToListbox(lsbx As ListBox, s As String, iSize As Integer, sHideShowUnchanged As String, bCompress As Boolean)
  
  Dim myExpanderParent As Expander

  lsbx.Tooltip = s
  If lsbx.Tag = "" Then
    lsbx.Tag = 0
  Endif
  ' add to list if needed
  If bCompress And lsbx.Count > 0 Then
    ' show repeated item with added string and keep in mind when comparing again..
    If (lsbx[0].Text = s) Or (lsbx[0].Text = s & " (++)") Then
      If lsbx[0].Text = s
        lsbx[0].Text &= " (++)" ' show it is repeated several times
      Endif 
      lsbx.Tag = lsbx.Tag + 1 ' last consecutive count
    Else 
      lsbx.Add(s, 0)
      lsbx.Tag = 1
    Endif
    lsbx.Tooltip &= " (R:" & lsbx.Tag & ")" 
  Else 
    lsbx.Add(s, 0)
  Endif
  ' add size
  lsbx.Tooltip &= "; Size:" & lsbx.Count
  ' adjust parent to make message visible even with closed expander
  myExpanderParent = lsbx.Parent
  Try myExpanderParent.Text = s
  Try myExpanderParent.Tooltip = lsbx.Name
  If Error Then
    Message.Error(Error.Text)
  Endif 
  ' keep within limits
  If lsbx.Count > IIf(isize, iSize, iMaxLsbxLen) Then
    Try lsbx.Remove(IIf(isize, iSize, iMaxLsbxLen))
    If Error Then
      Print "Could not trim " & lsbx.Name & ": " & Error.Text
    Endif
  Endif
  ' does this trigger the parent to expand to make change visible?
  Select sHideShowUnchanged
    Case "h"
      Try myExpanderParent.Hidden = True ' assume parent is Expander 
    Case "s"
      Try myExpanderParent.Hidden = False ' assume parent is Expander 
    Case Else '  incl empty
      ' leave unchanged
  End Select
  If Error Then
    Message.Error(Error.Text)
  Endif
End

Uitbreidingen of aanpassen bv:

  • bewaar log/err in bestand.

Gambas3 start

Algemene uitleg over gambas, momenteel in versie 3.x:

Gambas3 IDE

Dat is de programmeeromgeving om Gambas programma’s te maken. Als je zelf programma’s wil maken moet je opletten dat je de gambas “IDE” mee installeert!

Project

Een nieuw project maakt een directory aan met daarin alles wat met het project te maken heeft:

  • instellingen
  • code
  • scherm-ontwerpen (indien desktop-project)
  • teksten als README, help, licentie..
  • icoon voor project (voor eventuele link desktop)
  • beeldmateriaal voor iconen op knoppen of start/about scherm

Er zijn veel voorbeeldprogramma’s beschikbaar die je kan openen in de IDE om te kijken hoe Gambas werkt, als broncode-archief of via git.

Broncode-archief

De Gambas IDE maakt het gemakkelijk om de broncode van je project klaar te zetten voor transport: met een export functie maak je een standaard Linux .tag.gz bestand.

Als je zo’n .tar.gz bestand krijgt of download, kan je het uitpakken met tar -xzvf naam.tar.gz, en dan maakt dat de projectdirectory, zodat je het project kan openen in de IDE.

CLI

Je kan niet alleen een desktop programma maken, maar ook CLI-programma, zonder een desktop scherm. CLI-programma’s zijn zoals (shell-) scripts, je start ze op de commandolijn, of je kan ze laten lopen uit een timer (cronjobs, ..).

Programma draaien (“run”)

Als je het programma draait vanuit de programmeeromgeving kan je het stap voor stap laten lopen tot gemarkeerde punten in je code, om te onderzoeken wat er juist gebeurt met variabelen enz.

Executable

Als je het programma uitvoerbaar wil maken, als afgewerkt programma dat zelfstandig(*) kan draaien, als “executable”, dan compileer je het tot een .gambas, en je kan automatisch een link (met icoon) laten maken op je desktop als je die optie aanvinkt. Daarop klikken start dan het programma, zonder de programmeeromgeving mee te starten. Dat is dus de versie die de “gebruikers” zullen krijgen. Ze hoeven niet het hele project met de broncode en de hele programmeeromgeving te hebben.

Runtime

  • Het minimum wat nodig is op een computer om de .gambas programma’s uit te voeren is de gambas “runtime”. Die moet je op de doelcomputer dus wel installeren: sudo apt install gambas3-runtime.

sudo apt install gambas3-runtime

Gambas3 gestart, en daarin een project open en laten lopen;
In Taakbeheer zie je:


gbx3

gbr3

Een project gecompileerd en gestart bv met link op de desktop;
In Taakbeheer zie je:


gbr3

Schema

Dit overzicht/schema (over gambas2) is nog grotendeels geldig:

compile
interpreter
Archiver

Links

Terugblik naar Gambas3 in 2019
http://gambas.copyleft.be/blog/archives/2144

Library of Component in Gambas3
http://gambas.copyleft.be/blog/archives/1861

Gambas3 app uitpakken en compileren
http://gambas.copyleft.be/blog/archives/1842

Gambas en Lazarus

Vergelijking tussen de progammeertaal en IDE gambas / freepascal-lazarus

IDEGambas Lazarus
programmeertaalGambasFree Pascal (FPC)
HuidigVersie: 3.2Versies 4.6 + FPC 3.2.
Operating
system
Linux (div. distr.)div platformen
Programmeren
voor
– commandline (CLI)
– Desktop (div. desktops)
– CLI
– Desktop
Syntaxbasic-achtig + OOpascal + OO
Ontstaan

en

evolutie



in 1995,
eerste versie uit in 1999
Versie 1.0 uit in 2005
Versie 2.0 uit in 2008
Versie 3.0 uit in 2011
veel 3.x versies, bv:
Versie 3.20.0 uit in 2025
1999 uit Megido (1998),
componenten 2001
eerste versie uit 2003
Versie 1.0 uit in 2012
Versie 2.0 uit in 2019
Versie 3.0 uit in 2023
Versie 4.0 uit in 2025

Driver name missing

Deze foutmelding bij een databaseverbinding komt veel voor en betekent weinig.

  • driver name: op het eerste zicht zou de optie van het type ontbreken hConnection.Type=”mysql” bv. Maar dat is het niet altijd.
  • dikwijls is het wel één van de andere gegevens van de connectie die niet kloppen (user, password, name =database name, niet user, ..) dus je kan die tonen om te debuggen
  • bron van de parameters: soms is er iets mis met waar die parameters vandaan komen, bv uit een config file: keyname/parameter juist, kleinen/hoofdletters, wachtwoord (dikwijls moeilijk leesbaar) …,
  • via een schakelmechanisme als DataContext; ook daar: naam van de context, dataset, klein/hoofdletters…

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 (te verifiëren, niet altijd blijkbaar).

Upd: zie http://gambas.copyleft.be/blog/archives/3726

Een half als string is dubbel zo lang (“½”)

Kan het symbool “½” gebruikt worden in code, en in de database?

– in code: ja, maar
– database: te checken (op mijn mysql/mariadb: ja)

Lengte van een half
Maak een string met het half symbool er in, bv sExample = “½ eenheid”.
Doe string bewerkingen op die string, zoals de eerste letter van..

Print Left(sExample, 1)

Geeft niet het gewenste “½”

Print Left(sExample, 2)

Geeft wel het gewenste “½”

Datums, databanken en Gambas

Ik heb een paar keer problemen gehad met datum/tijd in Gambas, meestal gecombineerd met het opslaan in een databank, of er terug uit ophalen (*).

Bug
Op een bepaald moment werd er een bug gemeld op de mailinglist:

[Gambas Bug Tracker] Bug #1321: Converting date to string behavior change between 3.10 and 3.11

Gebruikers hadden ontdekt dat bepaalde programma’s, bepaalde broncode, niet meer werkte na een update van Gambas3 (overgang 3.10 naar 3.11 of hoger).

De bug-melding werd verworpen.

Correctie
Maar die verandering werd bevestigd; het was echter geen bug; ze was het gevolg van het verbeteren van een bug; er zat een fout in vroeger Gambas-code, en die was met deze versie-wissel gecorrigeerd, waardoor Gambas inderdaad anders reageert in sommige situaties.

Str() Val() Format() en Date() maken gebruik van de “locale”, de instellingen van de “desktop” (taal/land/tijd/etc).

CStr() gebruikt de UTC tijd.

Dus je moet kijken naar de instelling van de database en die van je desktop, bv GMT+0200.

In één programma CDate() en Date() mengen zal waarschijnlijk problemen geven.

De interne manier om een datum of tijd bij te houden is een getal, relatief tov een denkbeeldig nulpunt.

Met Format(), Date() maak je een interpretatie waarin je tijdzone meegenomen wordt om het voor jou “aanschouwelijk juist” te maken.

Bv in Groot-Brittanië is een datum/tijd opgeslagen in een record.
Als jij die opvraagt en toont met Format() dan krijg je de tijd die het in jouw tijdszone was, niet wat letterlijk opgeslagen is in de database.

Je moet dus ook opletten (voor het verschil)
– of je de database een datum laat opslaan, bv automatisch (instelling db server) met de instelling timestamp.
– of je zelf een datum naar de database stuurt als tekst: .. values('2024-01-01 01:14:18')
– of je kan in je SQL statement de opdracht voor een datum geven

Database
De database (mysql/mariadb) heeft 5 tijdsgebonden opslagvormen (kolom):

  • DATE = aleen de datum (1000-01-01-9999-12-31)
  • DATETIME = datum + tijd (1000..:..- 9999...:..)
  • TIMESTAMP datum + tijd (1970-20238!!!!)
  • YEAR : alleen een jaartal (1901-2155)
  • TIME : alleen een tijd (getal -838.. tot + 838.. ong 35 dagen)

Het 2038 probleem

Het hangt er natuurlijk een beetje vanaf wat je met die datums wil doen, en daarom moet je rekening houden met hun bereik, meestal vooral met hun hoogst mogelijke waarde, die voor sommige formaten gevaarlijk dichtbij komt.

Als je de datum enkel opslaat als leesbare informatie voor de programmeur, is 2038 van timestamp geen probleem, maar als het een veld is waar je verder conclusies uit gaat trekken gebaseerd op vergelijkingen met andere datum/tijd, berekeningen maken, sorteren enz, dan zie je de problemen al opduiken nog voor je op pensioen* bent. En timestamp is ook zuiniger met opslagruimte.
(* bv als je geboren bent na de default pc BIOS datum van 04-01-1980)

DATETIME is dus het veiligere alternatief, maar let op met de tijdszone.
Timestamp probeert de “huidige” tijdszone om te zetten naar UTC om de waarde op te slaan in de database, en terug te zetten naar de tijdszone (van de server**) bij het opvragen.
** dus niet de zone van de client als je bv vanop afstand gegevens opvraagt

Tijdzone
Vanaf Gambas 3.18 kan de tijdzone meegegeven worden:
(Old date string representation) space [ UTC | GMT ] [ + | - ] HH [ :MM ]

Om de algehele verwarring rond datums, (interne) opslag en weergave, tijdzone en formaten aan te pakken werd deze wiki pagina gemaakt, met oa:

Datums zijn geen strings
– Interne voorstelling
– Functies die werken met U.T.C. en American date format
– Functies die werken met local time
– Impliciete omvorming
– Datums zijn getallen
Null datums en datums met alleen een tijdsdeel
– Datums bewaren
– Datums bewaren in een binair bestand
– Datums bewaren in een tekstbestand
– Datums en kalenders

Voor selectie van een datum, zie ook de wiki pagina over kalenders.

Bronnen
– mailinglist en bugtracker
https://lists.gambas-basic.org/pipermail/user/2018-May/064153.html
Datetimes versus timestamps in MySQL
https://gambaswiki.org/ wiki/doc/date, wiki/doc/calendar

Gambas compatibiliteit (backward compatibility): soms niet

Als je broncode schrijft in Gambas versie 3.(x) dan kan het zijn dat die niet werkt in versie 3.(x-1) https://gambaswiki.org/wiki/doc/compat
Als het een voorwaarde is dat die code daar wel werkt moet je weten wat niet gebruikt mag worden uit de mogelijkheden van je nieuwere Gambas versie.
Hieronder begin ik een lijstje met zelf ondervonden incompatibiliteit, als ik een officiële Gambas pagina vindt daarover komt die hier in de plaats…

Als je weet waar in je code het probleem ontstaat op de oude versie, kan je daar “TRY” gebruiken:
Use TRY and check for an ERROR to see if newer code will work on the current version of gambas or not.

Settings.Exist : code gemaakt in 3.18.4 – code werkt niet in: 3.9.1

with / end with : nesten van twee strukturen in elkaar werkt niet in oude Gambas versies.

with myClass
  with myObject
    ' code code..
  end with
end with

Form elementen : bepaalde eigenschap bestaat niet in oude versie/andere desktop (Gnome):
ScrollView.Autoresize

Speak met Gambas3

Als uitbreiding op Spreken met Linux kan je er ook nog Gambas tussensteken. M.a.w. espeak aanroepen vanuit je eigen Gambas3 programma. Een testprogramma bijeenharken is niet nodig, dat deed Charlie Ogier al voor ons: eSpeakGUI

Simple text to speech GUI for ‘eSpeak’
Updated for QT5 22/03/2021

Naast in te stellen opties voor toonhoogte, woordafstand enz, is het belangrijkste commando doorgegeven via shell:

Shell "espeak -v " & sList[ComboBoxAccent.Index] &
" -a " & SpinBoxAmplitude.Value & " -g " &
SpinBoxWordGap.Value & " -p " & SpinBoxPitch.Value &
" -s " & SpinBoxSpeed.Value & " " & Chr(34) &
TextEditor1.Text & Chr(34)

Charlie Ogier (C) 2016 – Licenced under GPL 3.0

chr(34) is blijkbaar een ” teken.
sList is een array van strings die staan voor de talen* (ikzelf zou het arrsAccents noemen)
(* die in een combobox worden geladen om te laten kiezen)

Public sList As String[] = ["en", "en-gb", "en-uk-north", "en-sc", "en-wmids", "en-us", "en-wi"] 'String for Accent type"

" -a " & SpinBoxAmplitude.Value ‘ de amplitude: luider/zachter
" -g " & SpinBoxWordGap.Value lengte van de rust tussen de woorden
" -p " & SpinBoxPitch.Value toonhoogte
" -s " & SpinBoxSpeed.Value snelheid

Ik ben wel vergeten waar ik het vandaan heb.
Ik heb hem teruggvonden op github : https://github.com/charlie-ogier/eSpeakGUI

Gambas2 in 2023?

Gambas2 draait nog steeds op een computer(*) met OpenSUSE (mogelijk geïnstalleerd in 2015), altijd ge-update werd en die ondertussen natuurlijk ook gambas3 heeft.

(*) Ondertussen aan:

Waarschijnlijk oorspronkelijk openSUSE 15.0 of Leap 42.3/42.1/13.2/13.1/23.3… maar misschien wel eens een nieuwe installatie gedaan over de oude ipv een update..

Hoe oud/wanneer oorspronkelijk geïnstalleerd?
In ieder geval Yast log files van 2021, 2020, 2019, 2017 (13/11/2017)

head zypp/history
2017-11-13 11:08:48|command|root@mybox|'/usr/bin/ruby' '/usr/lib/YaST2/bin/y2start' 'installation' '--arg' 'initial' 'qt' '--noborder' '--auto-fonts' '--fullscreen'|

rpm -qa --last | tail -1
gpg-pubkey-307e3d54-4be01a65 ma 13 nov 2017 11:08:47

stat /
Bestand: /
Grootte: 156 Blokken: 0 IO-blok: 4096 map
Apparaat: 2fh/47d Inode: 256 Koppelingen: 1
Toegang: (0755/drwxr-xr-x) UID: ( 0/ root) GID: ( 0/ root)
Toegang: 2023-03-22 09:14:57.697958271 +0100
Gewijzigd: 2018-11-26 08:18:02.931829791 +0100
Veranderd: 2018-11-26 08:18:02.931829791 +0100
Ontstaan: 2017-11-13 11:08:43.728015653 +0100

(dan zou het normaal een Leap 42.1 moeten geweest zijn).

Zeker:
OpenSUSE 15.4 (2023-02-22) : gambas2 : ok
OpenSUSE 15.3 (2022-?-? ) : gambas2 : ok
OpenSUSE 15.2 2021-06-23 : gambas2 : ok
(..?..)