ValueBox.Allowed is not a property

Het programma dat werd geïmporteerd uit gambas2 naar gambas3 3.14 (op KDE/openSUSE 15.3) crasht of (gedraaid vanuit de IDE) stopt met de melding:

ValueBox.Allowed is not a property

Een zoek op “ValueBox.Allowed” in de broncode van het scherm waarin het gebeurt levert niets op.
Een zoek op “ValueBox.Allowed” in de broncode van het hele project levert ook niets op.

Langzaam begin ik te vermoeden dat de foutmelding te maken heeft met het venster (Form) dat een beetje verder in de code geopend wordt.

In dat scherm worden een aantal waarden geïnitialiseerd, en daarbij worden valueboxen zo behandeld:

vlbxSomeValue.Clear()

Die heb ik er uit gehaald;
(eventueel vervangen door:
vlbxSomeValue.Value = 0?)

Het volgende probleem is:
vlbxAmounthh.Select()

Verminderde aktiviteit (tijdelijk)

Het Covid-19 virus is ook de gambas mailinglist binnengeslopen (9/11-18/11), en zorgt er voor verminderde aktiviteit.
Een voorspoedig herstel toegewenst!

Update: na een weekje lijkt alles terug te draaien als voorheen, met een vermeerderde aktiviteit wat covid discussies betreft.
Ook wordt gesproken over het oprichten van een “stichting” om de toekomst van Gambas te ondersteunen/garanderen.

Databank toegang aanpassen aan situatie

Databank toegang
Ik gebruik van in mijn Gambas programma een databank (type mysql/mariadb), waarvoor ik over het netwerk inlog naar de databank.
Ik moet de instellingen ergens bewaren; Gambas heeft daarvoor zijn “Settings” in een configuratie-bestand. Daarin bewaar ik server-adres, login, wachtwoord en databanknaam. Mijn toepassing kan verschillende databanken aanspreken, ik noem die “datasets”

Dataset
De dataset situeert zich op een server en heeft zelf als eigenschappen dat ze een naam en een omschrijving heeft.
Voorbeeld van enkele datasets die ik gebruik:

  • pers : personeelsdossiers
  • reg: tijdsregistratie (tikklokken)
  • crm: klantengegevens-databank
  • gitin: it-inventaris

De korte naam wordt intern gebruikt, bv in programma’s en documentatie.

Andere server?
Terwijl ik de applicatie ontwikkel, wil ik niet op de “goede” databank werken, om die data niet te beschadigen, eventueel is dat ook een andere server.
Ik kan andere instellingen gebruiken (bewaard in het configuratie bestand).

Ontwikkel-test-gebruik
Op het moment dat ik wil testen op de goede data, moet ik ofwel het configuratie bestand verwisselen voor een andere versie, of – en dat zou nog handiger zijn – omschakelen in mijn toepassing zelf. In mijn programma zou ik moeten kunnen kiezen voor de databanken van de ontwikkeling, die om te testen, of de echt gebruikte databank “in productie”.

Onderweg – ter plaatse
Die drie verschillende “omgevingen” noem ik de DataContext. Die DataContext kan ook nog verschillen op een andere manier: als ik op mijn laptop werk, offline van mijn productieomgeving, wil ik een lokale kopie op de “localhost” gebruiken (en moet ik daar gemakkelijk naar kunnen overschakelen). Als ik dan op het werk kom, schakel ik over naar de productie-databank, dus hier zijn het eerder verschillende “situaties”.

DataContext
Ik wil dus omschakelen tussen
* Voorbeeld 1:

  1. mobiel (laptop met localhost server)
  2. ter plaatse (server op netwerk)

* Voorbeeld 2:

  1. ontwikkeling (“development”)
  2. test
  3. in gebruik (“in production”)

Instellingen
In mijn instellingen wil ik dus voor een verbinding de combinaties kunnen maken van de datacontext en de dataset (“DataContextX-Dataset”, ofwel de “Connection” gegevens).
Datacontext-Dataset
In het config bestand ziet dat er zo uit:

[DataContext0-Crm]
host="server.domain.tld"
login="myname"
password="qsdljfsdfjqsdljjdsqf"
database="crm"

Ik kan heel flexibel een andere verbindings-combinatie maken voor mijn laptopwerk:

[DataContext1-Crm]
host="localhost"
login="myname"
password="oupotykhlvkhsjhf"
database="crm"

Om aan te geven waarvoor de DataContext0 of DataContext1 staat, definieer ik dat ook in de instellingen:

[DataContext0]
Name="production"
Description="Ter plaats op het werk"


[DataContext1]
Name="mobile"
Description="laptop localhost kopie databank"

En ook over de datasets kan ik die informatie bijhouden:

[DataSet]
Pers="personeelsgegevens"
Reg="tijdsregistratie"
Crm="klanten bestanden"

De dataset kan in een module of library gedefinieerd zijn als constante string:

ModCrm
Public csDATASET as String = "Crm"
Public hConData as Connection
...

Het bewaren in de instellingen en het terug ophalen kan je systematisch doen door daar een “libary” DataContext voor te maken, waardoor dat ook altijd op dezelfde manier gebeurt, en met dezelfde syntax. De library maak je in Gambas als library project, en als uitvoerbaar programma kan die als libarary gebruikt worden in een ander project.

CDataContext
De klasse CDataContext moet aanbieden:
– nieuwe datacontext maken (met naam en beschrijving gegeven)
– nieuwe dataset maken (met naam en beschrijving)
– opvragen van de beschrijving van een gegegven dataset of datacontext
– context kiezen/instellen (vanaf dan wordt gekozen context gebruikt als “huidige”)
– bewaren van nieuwe instellingen voor een datacontext, dataset en connection
– verbinding maken met de databank van een gegeven dataset voor een gegeven connection (met “huidige” context)
– opvragen van allerlei informatie over de bewaarde verbindingen, bv of een bepaalde bestaat, hoeveel er zijn, of de lijst van …

Zie ook Datacontext voor Directory en Datacontext voor directory voorbeeld

Gambas3 na update naar opensuse 15.3

Hier treedt een bekend probleem op, met de foutmelding

gbx3: unable to find startup file

als je op de commandolijn gambas3 probeert te starten.
(omdat het uit het menu niet lukt – dan krijg je schijnbaar geen reaktie).

Ga naar softwarebeheer in Yast, zoek “gambas3” en vink de nog niet geïnstalleerde onderdelen aan, bv:

gambas3-gb-gtk3, gambas3-gb-inotify, gambas3-gb-jit, gambas3-gb-media, gambas3-gb-option, gambas3-gb-report2, gambas3-gb-scanner

Vooral “gambas3-gb-jit” is belangrijk.
Installeer, en start.

Versie van je bibliotheek (Library Version)

De versie van je eigen programma en die van Gambas kennen we al, maar hoe kennen we de versies van de libraries die we gebruiken?
In de programmeeromgeving kan je die vinden in Project, Eigenschappen, Bibliotheken, maar hoe kunnen we in een lopend programma weergeven welke versie van bibliotheken er gebruikt worden?

Library versie
Voor mijn eigen libraries kan ik het oplossen door een functie te maken die het versienummer levert.
In het library project gebruik ik een bestand met de naam VERSION (volledig in hoofdletters).
Dat is ook voorzien in de IDE: vink aan bij project: “Haal uit ‘VERSION’ bestand”.

Dan maak ik een method die ik getVersion() noem en die me de versie uitleest en doorspeelt:

Return File.Load("VERSION")

Tussen de methodes van de klasse zie je nu ook getVersion() staan.

ps: In Gambas kan je die informatie vinden in het verborgen .project bestand.
Library=:supplier/SomeLib:0.2

Gebruikte Libraries
(Upd. 07-2023)

Een Gambas programma (applicatie/project) dat één of meer libraries gebruikt, is voor zijn werking afhankelijk van de versies daarvan; je moet dus te weten kunnen komen welke versies van de libraries je moet installeren om het programma goed te draaien.
Ik standaardiseer daarvoor op een bestand “Libraries.txt”, waarin ik in volgorde de libraries opsom met hun versienummer, 1 per lijn, en in volgorde van afhankelijkheid; bv DataContext gebruikt zelf RunCounter, dan:

RunCounter 0.0.1
DataContext 0.2.9

Als tijdens de ontwikkeling van het programma overgeschakeld wordt naar RunCounter 0.0.2 dan pas je in Libraries.txt deze versie aan, en dan weet je dat het de bedoeling is met die versie te werken.

Demo in je Form

Ik heb een grappige manier gevonden om iets te demonstreren in je Gambas3 programma.
Ik heb in het “Help” menu (of ? menu) naast About, What’s new, Licentie, Help, enz een item bijgemaakt: Demo.
Ik laat daarbij op het scherm, in volgorde, oplichten wat een gebruiker achtereenvolgens moet doen.
Oplichten doe ik door tijdelijk een (achtergrond-)kleurtje te geven, bv geel. Na een kleine wachttijd van 2 seconden (die gemakkelijk kan aangepast worden in de code – misschien moet ik het instelbaar maken voor de gebruiker), krijgt het voorwerp terug de normale kleur.

mniHelpDemo_Click()
'
Dim iWaitABit as integer = 2
'
'...
'
Button1.Background = Color.Yellow
'
Wait iWaitABit
'
Button1.Background = Color.Background
'
Tabstrip1.index=4
'
Tabstrip1.Background = Color.Yellow
'
Wait iWaitABit
'
Tabstrip1.Background = Color.Background
'
Textbox1.Background = Color.Yellow
'
Wait iWaitABit
'
Textbox1.Background = Color.Background
'
'
combobox1.Background = Color.Yellow
'
combobox1.Popup
'
Wait iWaitABit
'
' combobox1.Popdown - doesn't exist? *
'
combobox1.Background = Color.Background
'
' etc...

* Combobox sluiten
Het enige wat niet goed werkt is dat ik een combobox (rolluikje met keuzes) wel kan openen om te tonen wat er allemaal in staat, maar ik kan het niet sluiten zonder een keuze te maken. Dit was niet voorzien in Gambas3, maar zal er aan toegevoegd worden vanaf de volgende versie.
Het is al opgenomen in de broncode, in commit:
https://gitlab.com/gambas/gambas/-/commit/9d08d1371982221fe876fb29ea12d020d2dd264b

Commit 9d08d137
authored 4 days ago by Benoît Minisini’s avatar Benoît Minisini
ComboBox: Close() is a new method that closes the ComboBox popup.

[GB.QT4]
* NEW: ComboBox: Close() is a new method that closes the ComboBox popup.

[GB.QT5]
* NEW: ComboBox: Close() is a new method that closes the ComboBox popup.

Niet voldoende argumenten / Not enough arguments

Situatie: Bij het proces van het integreren van een library die voorheen gemaakte eigen classes moet vervangen, treedt deze fout op.

We krijgen geen regelnummer bij de fout.

1. Klasse
Onderaan zien we aktief:

FMain.@new.0

De hele MMain (opstartklasse) wordt doorlopen zonder probleem (stap voor stap gecheckt met breekpunten).

Vanuit MMain wordt FMain gestart, dan treedt het probleem op. Er zijn wel een aantal variabelen zichtbaar in de foutopsporing, dus een stukje van FMain lijkt te lopen, maar met breekpunten is het niet uit te zoeken: zelfs een breekpunt op de eerste lijn geeft toch al een fout bij het uitvoeren van FMain.

Het probleem leek verdwenen na het verwijderen van de klasse die ook in de library zit.

2. Methode
Deze keer ligt het aan een methode in de gebruikte klasse; die is ooit hermaakt geweest en er moest een methode met de nieuwe naam gebruikt worden: bv “loadConnection” en “makeConnection”.
De oude bestond nog maar werkte niet correct.

3. Declaratie

In een module staat:

Private hDayReq As New CDayReq

“AS NEW” vervangen door aparte declaratie en initialisatie, waardoor je de fout ziet bij de initialisatie (bv daar moest nog een waarde aangeleverd worden als argument).

Private hDayReq As CDayReq
'
hDayReq = New CDayReq("A")

Als de initialisatie niet expliciet gebeurt, maar bij het eerste gebruik van deze module/classe, dan krijg je enkel een summiere foutverwijzing naar de module, maar niet naar de lijn in de module waar de fout vandaankomt.

De impliciete initialisatie met AS NEW gebeurt voor alle gedeclareerde objecten als één ervan gebruikt wordt, niet noodzakelijk hetgene waarvan de initialisatie een fout heeft.

Projecteigenschappen auteurs en beschrijving

Project “Authors” en “Description”

Bij Projecteigenschappen zie je:

Project type (normaal/bibliotheek/component)
Verkoper ("vendor")
Versie ("version)
Titel ("title")
Beschrijving ("Description")
Auteurs ("Authors")

Deze twee laatse leken me handig om te gebruiken voor, bv, het About scherm. Maar ik vond nergens een manier om ze op te roepen. Ze worden bewaard in het bestand .project, maar kunnen niet opgevraagd worden met Application.Description of Application.Authors.
Volgens Benoît Minisini komen ze alleen voor in de broncodeversie van het project, in de “project configuration file”. Ze worden niet meegenomen naar het uitvoerbare .gambas programma. (mailinglist 09-2021)

Dan lijkt het dus eerder bedoeld voor de programmeurs, niet voor de gebruikers van het afgewerkte programma. Ik vraag me nog af of het een goed idee is om hier dan programmeurs commentaren in te zetten, of moeten we rekening houden met een toekomstige update waarbij dit de standaardvelden worden voor auteurs en beschrijving?

Het mysterieuze uitroepteken in library of bibliotheek beschrijving

Bij Project, Eigenschappen, Bibliotheken: selecteer een bibliotheek (of voeg één toe).

Eigenschappen onder bibliotheeknaam zijn:

– Locatie: /home/loginname/.locql/share/gambas3/lib/vendorname/libname:0.0.gambas
– Voorziet in: CContract, CEmp!, CReqProc, CReqState!, ...

Vanwaar die uitroeptekens achter de naam van sommige klasse/modules?

(in de Engelstalige versie is het Project, Properties, Libraries, provides:…)

Antwoord (van gambas mailing list)

  • ! betekent dat de klasse statische symbolen heeft (“An exclamation mark means that the class
    has static symbols.”)
  • ? betekent dat (ipv Export) “Export Optional” is gebruikt. (“There is also a question mark suffix for classes declared with “Export Optional”)

Concreet: als je in een klasse het volgende zet:

STATIC sStaticString AS String = "Statische variabele"
of
PUBLIC CONST cConstString AS String = "Constante"

.. krijg je dus dat uitroepteken achter de naam van de klasse.

ps
Library versie verandert niet
Als je uittest met twee gambas IDE’s naast elkaar open, met een waar je de library maakt, en een ander waarin je die gebruikt, moet je de omgeving van die laatste afsluiten en terug openen om de juiste library gegevens te zien in oudere Gambas v. 3.7.1.
Zoniet blijf je daar altijd het library versienummer zien van toen je de IDE opende in Project, Libraries (zelfs als je de library verwijdert en terug toevoegt, houdt ze oud nummer en Provides gegevens).
De programma’s die je in de IDE start gebruiken echter wel de ondertussen ge-update library!