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
(..?..)

Form leeg, schijnbaar; niets meer weergegeven, alle objecten verdwenen

FMain plots leeg
Ik weet niet exact wat er voordien gebeurd is, wel dat ik twee keer Gambas3 had openstaan naast elkaar (wat ik dikwijls doe) en dat ik objecten geknipt en geplakt had van de ene naar de andere (waarbij ctrl-v niet werkte en ik rechtsklik-plak heb gedaan. Misschien heb ik het programma laten draaien en liep het vast, of heb ik het onderbroken, geen idee.

Op een bepaald moment “run” ik het programma, en er komt niets op het scherm. Ik zie wel in de konsole (F11) dat het programma draait door de uitvoer van “print” en “debug” commando’s. Er staat een zeer klein venstertje op mijn scherm dat ik probeer groter te maken, maar dat lukt niet, het klapt terug klein, of verwijnt helemaal.

In de IDE is de Form FMain ook leeg. In de Hierarchy zie ik gelukkig de objecten nog wel allemaal staan. Als ik een (onzichtbaar) object selecteer, en naar de eigenschappen kijk, zie ik dat zowel de breedte, als de x-positie en de y-positie op 0 staan.

Deze eigenschappen terug invullen met een willekeurig getal, brengt het object terug in beeld (weliswaar met verkeerde afmetingen).

MoveScaled -2,-2 of onzichtbaar?
Ik kijk in de backup (van de ondertussen veranderde FMain.form: daar zie ik verschillende negatieve waarden in “MoveScaled”.

HBoxTrypoTables HBox
MoveScaled(-2, -2)

en andere die onzichtbaar staan:

HBoxCombi HBox
Visible = False

Ik denk dat vooral die negatieve waarden het probleem zijn…

Privé in de class: $

Wat prive gezegd wordt in de klasse, blijft in de klasse

Ik weet het al van lang geleden (zie naamgeving over gambas syntax), maar ik heb nu nog eens nagekeken of het in gambas3 ook nog zo gebruikt wordt, en ja.

Naming Conventions

The naming conventions are not required by the compiler. But programs which use the following naming conventions are easier to read by other programmers who want to understand the program.
Variable names

All private variable names of a class start with $

The first letter is lower case and should depend on the type of the variable

Voordeel van het markeren van de private variabelen in de klasse, is dat je gemakkelijk kan zien wat naar buiten gaat (nl alles waar geen $ voorstaat). Handig en belangrijk als je extern waarden toegespeeld krijgt en die moet verwerken in een private var in de klasse:

Private Sub checkGivenMonthYear(Optional iMonthIn As Integer, Optional iYearIn As Integer) As Boolean
'
If (iYearIn)
$iYear = iYearIn

Van buiten de klasse mag je dus geen $var tegenkomen, dan weet je dat er iets fout is. De publieke variabelen hebben dus een gewone naam, van buitenaf zichtbaar, en geen $ teken.

Voorbeeld uit de Gambas 3.18 bronccode, FMain.class:

' Gambas class file
'
Public NoMessage As Integer
'
Private $hProjectTree As CProjectTree
'
Private $sKey As String
Private $bCtrl As Boolean
Private $bInRename As Boolean
'
Private frmWelcome As FWelcome

(dus niet voor een Form)

HSplit werkt niet meer

Gordijn kapot
Bij de laatste upgrade van mijn Linux+KDE systeem en bijhorende Gambas (naar 3.18.0), werkte één van mijn programma’s niet meer naar behoren. De verdeling van de gebieden op het scherm die met een HSplit van elkaar gescheiden zijn, zijn getroffen door een “bug”. Die HSplit werkt als een soort gordijn, je kan die vertikale lijn tussen twee gebieden “in de HSplit” vastnemen en naar links of naar rechts trekken, zodat een bepaald gebied vergroot en het andere automatisch verkleint.

Ik heb een aantal gridviews in de HSplit, en tot nu toe werkte dat perfect. Maar na die update gebeuren er eigenaardige dingen; als ik een vertikale lijn wil opschuiven naar links bv, verandert de vertikale lijn van een andere gridview van plaats op het scherm. Het lijkt of je een andere lijn vasthebt bij het verschuiven, bv de volgende splitter lijn.

Buiten gebruik?
In het menu valt me ook op dat de “HSplit” niet meer voorkomt, wel een “Splitter”.
Als ik een bestaande HSplit selecteer zie ik er een symbool van doorstreepte cirkel op staan, en krijg ik geen eigenschappen rechts. Voelt erg “depricated”? Maar daar wordt niets van vermeld op http://gambaswiki.org/wiki/comp/gb.qt4/vsplit.

Ik vind wel een verwijzing in de mailinglist:

Re: [Gambas-user] Unnecessary duplication?
User namens
Bruce Steers 27-06-2022
Naar Gambas Mailing List


It’s rare to actually remove anything. many things are depreciated like for example HSplit and VSplit changed to one single Splitter container but VSplit and HSplit are not gone and still work for programs using it.

Daaruit leid ik af dat ik de HSplit en de VSplit moet vervangen door “Splitter“. Aangezien Splitter algemener is zal je moeten aangeven wat de richting is (H/V).

Backward (in)compatible
En ook omgekeerd ondervind je problemen: als je met 3.14 een project opent van 3.18 waarin de nieuwe Splitter gebruikt wordt, krijg je een foutmelding.

ProjectName > Sources > FormName
Cannot open file.
Unknown control: Splitter

Daar kan je verder dan niet veel aan doen op dit systeem…

HSplit Parameters
Verder lijkt er ook iets foutgegaan te zijn met de parameters van het bewaren van de HSplit instellingen:

Hoe moet het nu juist? Hoe kan ik “compatibele” code maken voor 3.14?
'Try HSplit1.Settings = ["150,120,600,300,160"]
Try HSplit1.Settings = [150, 120, 600, 300, 160]
'Splitter1.Settings = Settings["Screen/Splitter", "150,600,300,160"]

In het settings bestand vind ik verschillende sporen:
Splitter="0,188,977,131,276"
Splitter.Layout=[189,283,364,562,0]

(wordt vervolgd als ik daar problemen mee ondervind)

Gambas weg na update naar openSUSE 15.4

Gambas heeft in de main repositories van openSUSE gezeten, en kan daaruit geïnstalleerd geweest zijn in een oorspronkelijke installatie.

Maar in 15.4 zit Gambas NIET MEER in de standaar repositories. Bij de Distribution Update (zypper dup) wordt Gambas3 GEWIST.

Je moet dan Gambas3 opnieuw installeren, en dat kan gemakkelijk van de opensuse software site:
https://software.opensuse.org/package/gambas3-ide

Kies gambas3-ide, dan komt de rest automatisch mee.

Fouten op “../GA/pool/” repositories zouden dat nog kunnen tegenhouden, schakel die uit of sla die over, de Gambas repository zal wel toegevoegd worden maar door de foutmeldingen is de installatie niet uitgevoerd. Die moet je opnieuw starten (kan ook vanuit Yast2; gambas3-ide aanduiden, rest bevestigen)

Data naar Arduino sturen via USB kabel

De usb kabel die je gebruikt om het programma in de arduino te laden kan je ook gebruiken om data door te sturen, bv vanuit Gambas.

Je moet het seriële poort object gebruiken, waarvoor je de gb.net bibliotheek importeert (Project eigenschappen, libraries).

Variabele declareren:

Public hSerial As SerialPort

Initialiseren van het object:

hSerial = New SerialPort As "hSerial"

(ps: AS "hSerial" wordt later gebruikt om te lezen van de poort)

Eigenschappen instellen:

  With hSerial
    .Clear
    .PortName = "/dev/ttyUSB0"
    .Speed = 9600 ' 4800
    .DataBits = SerialPort.Bits8
    .StopBits = SerialPort.Bits1
    .Parity = SerialPort.None
    .FlowControl = SerialPort.None
    .Clear
  End With

Poort openen:

Try hSerial.Open(3)
  If Error Then
    Print Error.Text
  Else 
    TSendTimer.Start()
  Endif 

Ik heb een timer gemaakt om gemakkelijk automatisch een aktie als een waarde uitsturen te laten uitvoeren:

Public TSendTimer As Timer
  '
  Try iNumber = getSomeValueFromDb()
  If Error Then
    Print Error.Text
  Else 
    If iNumber <> iPrevious
      doSend(iNumber)
      iPrevious = iNumber
    Else 
      ' 
    Endif 
  Endif

(in hetzelfde programma heb ik een andere timer voor het lezen van de seriële poort)

De timer aktiveert het ophalen van de gegevens van elders, bv uit een database:

getSomeValueFromDb() kan je vervanen door eender welke bewerking voor het ophalen van een waarde uit een databank, een bewerking, uitlezen van menselijke invoer, enz..

En het uisturen van de klaarstaande gegevens:


Public Sub doSend(iNumber As Integer)
'  
  Debug Now() & " Gb3 doSend > " & iNumber
  Try Write #hSerial, Str(iNumber) & gb.NewLine
  If Error Then
    Print "Gb3 Err: " & Error.Text
  Else 
    hSerial.Send()
    Inc iCounter
  Endif 

Ik hou wat tellers bij en toon in het konsole scherm de waarden die heen en weer gaan tussen de arduino en de Raspberry Pi/pc, daarom dat ik ze laat voorafgaan door “Gb3” om aan te geven wat de bron is. De inkomende data van de arduino toon ik daar immers ook.

Ontvangen via dezelfde weg

Instellen:

Public Sub setReceive()
'  
  Debug "Gb3: setReceive"
  With hSerial
    If .Status = Net.Active Then
      TTimer.Start()
      Print .DTR
      Print .DSR
      Print .Blocking
      Print .CTS
      Print .RTS
    Endif
  End With
  '
End

Lezen van seriële poort:

Public Sub hSerial_Read()
  '
  Try Read #hSerial, sIn, Lof(hSerial)
  '
End

De timer voor ontvangen van data:

Public Sub TTimer_Timer()
'
  If hSerial.Status <> Net.Active Or If sIn = "" Then 
    ' Print "Gb3: No data, or empty string.."
  Else 
    If sIn <> sPrevious
      Print "Gb3: Data received: " & sIn
      sPrevious = sIn
    Endif 
  Endif
  '
End

Organisatie mappen gebruiker en programmeur

Twee voorbeelden voor het organiseren van de directories: één voor de “user” (gebruiker), die de software afhaalt, en één voor de “developer” (programmeur):

Gebruiker
Gebruiker van de software;
– Heeft icoon op desktop om programma te starten
– Heeft lokaal een script (dat door support wordt gebruikt):
– haalt de broncode ergens af.
– pakt die uit (indien nodig)
– compileert en maakt uitvoerbaar programma met icoon+link desktop
– zet afgehaalde versie in archief

Daarvoor is een vaste directory structuur nodig, gemaakt met een script, bv makeGbUserDirs.sh
(bv geïnstalleerd en uitgevoerd door de admin, programmeur, ..)

#/bin/bash
echo "prepare local software directories"
mkdir ~/.systemPrograms
mkdir ~/.systemPrograms/log
mkdir ~/.systemPrograms/gb3src
mkdir ~/.systemPrograms/gb3src/old
mkdir ~/.systemPrograms/gb3prj
mkdir ~/.systemPrograms/gb3lib
mkdir ~/.systemPrograms/gb3run
mkdir ~/.systemPrograms/gb3run/previous
ls ~/.systemPrograms > ~/.systemPrograms/directoryCreated.txt

Nb: De programmeur kan op zijn eigen computer dezelfde struktuur gebruiken* om te testen, eventueel voor het gemak niet onzichtbaar gezet.
Dus ~/systemPrograms ipv ~/.systemPrograms), met punt kan hij dezelfde scripts als user gebruiken en vermijdt verwarring waar kans het grootst is.
* hoewel er gevaar is voor conflicten met instellingen (Settings) en libraries.

Vorige versie (met git directories etc):

#/bin/bash
echo "prepare local software directories"
mkdir ~/.systemPrograms
touch ~/.systemPrograms/directoryCreated.txt
#mkdir ~/.systemPrograms/gb3Git
#touch ~/.systemPrograms/gb3Git/Applications.txt
mkdir ~/.systemPrograms/gb3src
mkdir ~/.systemPrograms/gb3prj
mkdir ~/.systemPrograms/gb3run
#mkdir ~/.systemPrograms/gb3testrun
ls ~/.systemPrograms > ~/.systemPrograms/directoryCreated.txt

In Applications.txt houdt de admin bij over welke apps het gaat

In de bin directory van de gebruiker wordt het script gezet om een nieuwe software/versie te downloaden en te installeren voor gebruik.

Gebruiken van de software

  • afhalen
  • installeren/compileren
  • log installatie/versies

Afhalen
Eerste stap: afhalen van een server of in dit geval een NextCloud share:

bv: GetFromNextcloud.sh

#!/bin/bash
releasedir = ~/NextCloud/Shared/ShareKantoor/SwUpdates/release
myapp = $1-$2.tar.gz
echo "Get from nextcloud: " 
if [ $# -eq 0 ]; then
  echo "- No arguments provided; choose from: "
  ls -lFAh $releasedir/*.tar.gz
  echo "or download (manually if no fixed link) from shared nextcloud folder sharekantoor/swupdates/release or other source"
  exit 1
fi
# check right download dir name:
cp $releasedir/$myapp ~/Downloads/
ls ~/Downloads/$1*
echo "when all went well, ready to use install script instfromdownload.sh"

Gebruik: parameters voor naam programma en versie:

GetFromNextcloud mijnProgramma 0.3.12

Installeren
Tweede stap: installeren voor gebruik:

bv: InstallFromDownload.sh

#!/bin/bash
# install gambasapp.tar.gz from downloads directory
# upd 25/10/2022: define softsource as download dir
softsource="~/Downloads/Software"
echo "Use: $0 [myGb3App] (name, no extention) to install myGb3App.tar.gz from $softsource"
if [ $# -eq 0 ]; then
  echo "- No arguments provided; choose from: "
  ls -lFAh $softsource/*.tar.gz
  echo "or download (manually if no fixed link) from shared nextcloud folder sharekantoor/swupdates/release or other source"
  exit 1
fi
cd $softsource
ls -lFAh $1*
myapp = $1.tar.gz
echo "move and unpack $myapp"
cp myapp ~/.systemPrograms/gb3prj/
cd ~/.systemPrograms/gb3prj
tar -xzvf myapp
echo "compile install $myapp"
cd myapp
gb3c -a
gba3 -o ./../gb3run/$myapp.gambas
echo "cleanup .. "
mv ~/.systemPrograms/gb3src/$myapp /.systemPrograms/gb3src/previous/
mv /.systemPrograms/gb3prj/$myapp /.systemPrograms/gb3src/
ls -lFAh /.systemPrograms/gb3src/$myapp
ls -lFAh /.systemPrograms/gb3src/$myapp
rm ~/Downloads/Software/$myapp
ls ~/Downloads/Software/$myapp
echo "End install, ready to run $myapp"

Log
Derde stap (optioneel): laat ergens log achter
– minstens bv een touch log/myapp-date.txt

Andere versie, 22/11/2022:

#/bin/bash
sleeptime=5
releasedir=~/Nextcloud/Shared/ShareKantoor/SwUpdates/release
targetdir=~/.systemPrograms
echo "Script to install gambas3 app ($1) with version ($2) in $targetdir .." 
cd $targetdir/gb3prj
if [ -z "$1" ]
then
  echo "No application name to install"
  ls -lF $releasedir
  echo "Gambas3 app name? (basename eg: myLog) - exists in remote?"
  read targetbase
  if [ -z "$targetbase" ];
  then
    echo "no app name given - exit"
    exit 0
  fi
else
  targetbase=$1
fi
echo "target base is $targetbase"
if [ -z "$2" ]
then
  echo "Check previous $targetbase versions: "
  ls -lFAh $targetdir/gb3src/$targetbase*
  echo "Version? (eg 0.0.4) version no of $targetbase to download;"
  read targetversion
  if [ -z "$targetversion" ]
  then
    echo "no $targetbase version given - exit"
    exit 0
  fi 
else
  targetversion=$2
fi
echo "try to move older versions to old/ " 
mv $targetdir/gb3src/$targetbase* $targetdir/gb3src/old/
ls $targetdir/gb3src/old/
echo "target version is $targetversion"
targetsoft="$targetbase-$targetversion"
targetsource="$targetsoft.tar.gz"
echo "Get $targetsource to unpack, compile/install $targetsoft in ~$targetdir (or ctrl-c)....." 
#exit1
sleep 1
echo "copy .. "
cp $releasedir/$targetsource $targetdir/gb3prj
cd $targetdir/gb3prj
ls -lFAh $targetbase*
sleep $sleeptime
if [ ! -f $targetdir/gb3prj/$targetsource ]
then
    echo "Download not succeeded - exit"
    exit 0
fi
echo "unpacking.."
#exit 1
sleep $sleeptime
tar -xzvf $targetsource
cd $targetbase
ls -lFAh
sleep $sleeptime
echo "cleanup to source dir $targetdir/gb3src"
mv $targetdir/gb3prj/$targetsource $targetdir/gb3src
rm $targetdir/gb3run/$targetbase.log
echo "compile $targetsoft.. "
#sleep $sleeptime
gbc3 -a 2> $targetdir/gb3run/$targetbase.log
gba3 -o $targetdir/gb3run/$targetbase.gambas
cd ..
echo "done $targetbase"
ls -lFAh $targetdir/gb3run/$targetbase*
echo "Changes: (top) "
head -5 $targetdir/gb3prj/$targetbase/Changes.txt
echo "Errors: " 
cat $targetdir/gb3run/$targetbase.log

Programmeur

We gaan er van uit dat gewerkt wordt met git. Ook de programmeur heeft vaste directories, misschien op verschillende locaties (werk/huis/..)
Als hij vanop verschillende locaties werkt is ook hier een script handig, bv makeGbDevDirs.sh

mkdir ~/dev
mkdir ~/dev/gb3prj
mkdir ~/dev/gb3run
mkdir ~/dev/gb3src

cd ~
ls dev/

ps: In omgeving (op pc) waar ook development gebeurt in andere context kan een extra laagje nodig zijn:
mkdir /home/user/dev/context/gb3prj
(context, groupname voor projectgroep zoals in gitlab, bedrijfsnaam/organisatie/klant, of..)

src
Als voor de start van een git project vertrokken wordt van een source pakket (.tar.gz), kan dat in gb3src gezet worden.
Bij het afhalen van een nieuwe src shuift de vorige op naar src/previous, en die src/previous kan af en toe leeggemaakt worden.

prj
hieronder zitten alle projectdirectories, met daarin de git repository van het project; eigenlijk dus de Gambas projecten waaraan vanuit de IDE gewerkt wordt.
De stappen van de ontwikkeling vinden binnen git plaats; bv een “dev” tak, een “test” tak, en eens goedgekeurd, een “main” tak met de release versie.
De broncode wordt bijgehouden op de git server en op alle ontwikkelstations.

run
Bij compileren wordt het uitvoerbaar bestand hier gezet.
Bij het omschakelen tussen verschillende ontwikkeltakken (branches) kan het nodig zijn een extra run directory te hebben, bv run/dev en run/test en/of run/main.

Software publiceren
De programmeur kan een script hebben om een “release” te doen; een afgewerkte versie van zijn applicatie in de Nextcloud directory klaarzetten voor de gebruikers. Of nog eenvoudiger: hij kan van in de Gambas3 IDE (programmeeromgeving) een “make source file” maken met als bestemming de gemeenschappelijke Nextcloud map.

Settings probleem crasht programma

Mijn FMain crasht op het ophalen van settings (Projecteigenschappen component Settings: gb.settings).

Gambas 3.14.3 en Gambas 1.17.3.

Eigenaardig genoeg werken de settings wel in MMain en FAbout, enkel niet in FMain.

Foutmelding:

“Geen reeks in FMain:2288”

Vervelend dat de foutmeldingen vertaald zijn als je daarop wil zoeken op het web.

Ik veronderstel dat de Engelstalige iet zou zijn als “Not an array (23) “?

Wat verklaard wordt als:

You try to use the array operator [] on something that does not accept it.

Ik heb de schrijfwijze van de code gecheckt, die is ok en werkt elders wel.

Settings["Report/TitlesOn"] = mniReportTitles.Checked

Ik zoek nog uit wanneer het juist begonnen is, want vorige versies van het programma werkten wel en gebruikten ook de settings.
Ik heb ondertussen een nieuwe versie van een library gebruikt, en menu’s bijgemaakt waarvan ik de checked toestand in settings bewaar/eruit ophaal, en settings code gegenereerd met een ander programma, allemaal dingen om te checken dus.

Oplossing
Kies in plaats van “Run” (F5) voor “Compile” (F7), dan zie je de waarschuwingen (warnings).

Daar zie je:

Klasse FMain, Lijn 9, Klassenaam verborgen door globale declaratie: Settings

Dat is niet erg behulpzaam, maar in FMain.Form op lijn 22 gebeurt het:
{ Settings Menu
}

Er is dus in een menu iets dat de naam “Settings” heeft… en dat geeft een conflict met de Settings component.

In de IDE terug te vinden met de menu editor (form, rechtsklik, menu-editor) of CTRL-e
Daar blijkt het een spacer te zijn, een leeg menu item dat enkel dient om een onderverdeling te maken. Waarschijnlijk heeft die per vergissing de naam Settings gekregen, bv door per vergissing op een toetsencombinatie voor plakken te drukken als er nog “Settings” in de buffer zat.

Verander “Settings” in een meer menu-geralateerde naam, bv mniSpacer.

Hieraan zie je weer het belang van de naamgeving. Ik gebruik voor menu’s een verschillende naam voor de hoofd en de sublijnen:
mnuFile : voor het hoofdmenu, zichtbaar in de menubalk.
mniFileOpen : voor het submenu, onder File.

Raadsel opgelost, klaar.

Sommige project broncode bestanden zijn in conflict (door git)

Probleem

Na een problematische git merge krijg ik deze melding als ik het project wil uitvoeren (run):

Sommige project broncode bestanden zijn in conflict.
Los deze eerst op indien je het project wil compileren.

Bij een aantal bestanden staat een rood uitroepteken; die bekijk ik.
In de editor krijg je de mogelijkheid naar het volgende/vorige conflict te gaan, en je oplossing te bewaren.

Ik heb al heel wat Forms en Modules aangepast, en lijk klaar te zijn.
Toch blijft de melding komen, zonder aan te geven over welke het specifiek gaat.

Ook een “zoek” in de IDE op “Broncode bestanden” en “Alle bestanden” naar de typische* codes van een merge conflict, levert geen gevonden bestanden meer op.
(* In het “probleembestand” vind je dan bv: <<< HEAD , ==== , >>> master)

Opgelost
Ik heb de merge conflict reaktie niet meer bij de hand om op te zoeken in welke bestanden er een conflict was.
Ik doe via de commandolijn een zoek in de bestanden in de directory, en daarbij kom ik uit op de verborgen project file:
.project
Die begint met :
# Gambas Project File 3.0

Daarin waren nog merge conflicten aanwezig.

Eens die opgelost zijn, eerst in git terug: git commit -am "fix merge conflicts", en het project terug openen in Gambas3.
Nu gaat de IDE weer normaal reageren, bv met overblijvende problemen als dubbele declaraties, incorrect overschreven functie in class, enz.

Testen van database verbinding

Foutmelding als “System error 110” vanuit sql zijn soms veroorzaakt door een slechte/trage verbinding.
Best maak je een standaard db-test project dat niets doet behalve de verbinding testen, en dan kan je dat steeds weer gebruiken.

Is de database verbinding nog ok?

  • Database gegevens initialiseren.
  • Database verbinding openen
  • …loop van het programma dat gegevens gebruikt
  • Database verbinding sluiten

Het probleem dat hier kan optreden is de duur dat de databaseverbinding open blijft. Hoe langer het programma draait, hoe meer kans dat de database op een bepaald moment niet bereikbaar is. Typisch is na het blijven openstaan gedurende de nacht; eerste handeling de volgende dag doet het programma crashen als de databasefouten niet juist worden opgevangen.
Het alternatief kan zijn bij elke aktie op de database de verbinding te openen en te sluiten.
Of de verbinding te testen en indien niet meer goed, te heropenen.

Hoe best de procedures maken in de Data module?

Je kan een “result” teruggeven, die kan verder verwerkt worden in de aanroepende code:

PUBLIC SUB getWorkedOn(sWork AS String) AS Result
'  
  DIM myResult AS Result
  DIM sSql AS String
'  
  sSql = "SELECT * FROM reg "
  sSql &= "WHERE reg_type='U' AND ord_code = &1 "
'  
  TRY myResult = $hConNoxqs.Exec(sSql, sWork)
'  
  IF ERROR 
    sLastError = Error.Text
    RETURN NULL
  ELSE 
    RETURN myResult 
  ENDIF 
'
END

Of je kan een waarde teruggeven:

PUBLIC SUB getEmployeeCount() AS Integer
'
  DIM iMonthNames AS Integer
'
  $hResEmployees = MData.getEmployees(MCommon.bActiveOnly)
'
  iMonthNames = $hResEmployees.Count
  SetLog("Employees used: " & iMonthNames & ", active employees: " & Str$(MData.activeEmployees("A")))
'
  RETURN iMonthNames
'
END