Gambas 3 en Qt4, Qt5

Geval 1: gb.qt4.ext, qb.gui.qt.webkit
Na updates van mijn OpenSUSE (van 42.3 naar 15.1) werken sommige applicaties die met Gambas3 gemaakt zijn, niet meer.

Het gecompileerde programma, met link op de desktop, lijkt te starten, maar sterft dan een stille dood.

Bij het openen van het project in Gambas3:

Sommige componenten worden gemist: gb.qt4.ext

Het probleem is waarschijnlijk dat er Qt4 specifieke componenten zijn gebruikt, en die zijn nu niet meer aanwezig of verkrijgbaar.

Test:
– project openen, ga verder en negeer de waarschuwingen van missende componenten.
– Project eigenschappen: vink gb.qt5 en gb.qt5.ext aan

Of:
– gb.gui.qt (QT4/QT5 switcher component)

Daarna nog:

Cannot load class “Editor”: Unable to load class file

En:
– gb.gui.qt.webkit (QT4/QT5 WebKit switcher component)

Maar dat blijkt niet alles op te lossen… :

Unknown Control: Editor

Gelukkig had ik 1 nog niet ge-update toestel waarop ik de oude versie kon openen.
Inderdaad werd daar een gb.qt4.ext object “editor” gebruikt dat code in kleur weergaf. Bestaat dat niet in qt5?

Ik denk dat ik in de oude opstelling de waarschijnlijke probleemobjecten zoals qt4 Editor er uit moet schrijven en checken of het dan wel werkt…

Daar zag ik dan in de help dat Editor “deprecated” is sinds 3.8 – “use TextEditor control instead”.

Na de vervanging van die control, en het overschakelen op de algemene gb.gui.qt werkte de applicatie terug.

Geval 2: Dial, LCDNumber, TextEdit, ?

Applicatie omgezet (gambas2 code geïmporteerd in gambas3); geeft een foutmelding op Qt4.ext en werkt niet; de forms bestaan uit tekst met accolades in plaats van een echte form. Ik kan dus in gambas3 ook niets “corrigeren” want ik krijg de form niet open.

Ook hier heeft het te maken met gb.qt4.ext; en die zijn op het nieuwe systeem niet meer aanwezig.

Een tweede fout was

CComponent.Load.626
‘UserControl’ class is missing in gb.form component exported classes
[OK]

en

CComponent.Load.626
‘UserControl’ class is missing in gb.db.form component exported classes
[OK]

gb.qt4.ext
Deze bevat:

  • Dial
  • LCDNumber (vervangen door LCDLabel?)
  • TextEdit

Converteren?
Dé vraag is : kan ik met een recente gambas versie, 3.14.3 bv, (en zonder die qt4 spullen in mijn systeem) dat programma repareren?
Of moet ik op het nieuwe systeem iets als libqt4-devel installeren?

Gelukkig heb ik hier nog een Gambas 3.9.2 op opensuse 42.3 die de oude qt bestanden heeft, en waarin ik het oude programma open krijg. Ik moet daar, veronderstel ik, dan de bovenstaande typische qt4.ext objecten gaan zoeken, die in de code vervangen, en dan opnieuw proberen in het nieuwe systeem … Vermoedelijk zal dat gaan werken als ik op het oude systeem in de IDE de qt4.ext kan uitschakelen in de project-eigenschappen.

(gb.qt4 en gb.qt4-ext af, gb.qt5 en gb.qt5-ext aan).

Terugblik naar Gambas3 in 2019

Nu er hier en daar wat stiltes vallen, is het een goed moment om de tekst eens te bekijken die de programmeur van Gambas, Benoît Minisini scrhreef naar aanleiding van het verschijnen van een nieuwe Gambas versie…

Gambas 2019 overzicht

De programmeertaal Gambas heeft vorig jaar achter de schermen een grote verandering ondergaan. De compiler van de programmeeromgeving is volledig herschreven.

In januari 2019 schreef Benoit Minisini een artikel voor de Franse linuxfr.org website. Het artikel sijpelde door omdat er naar verwezen wordt op de documentatiewebsite van gambas op gambas.sourceforge.net. Het kan beschouwd worden als een vervolg voor een stukje dat hij schreef in 2012 naar aanleiding van het verschijnen van Gambas 3.3, en dat ook op die site te vinden is. Ps: Sinds eind 2019 is Gambas aan versie 3.14.x., de zogenaamde versie “Pi”.

Gambas 3.12

Gambas is een programmeertaal die object oriented werkt en gebaseerd is op een basic-achtige interpreteerder. En het is ook een volledige IDE of programmeeromgeving met ondermeer een compiler, een interpreteerder, een verzameling van modules die complementair gebruikt kunnen worden, en een geïntegreerde programmeeromgeving. Het geheel wordt verspreid onder de GNU GPL v2 licentie.

Een nieuwe compiler

De grootste verandering bij de stap naar versie 3.12 is het afscheid van de oude compiler, die gebaseerd was op LLVM.
De API van LLVM voor het maken van code is een aantal jaar geleden veranderd van versie LLVM 3.5 naar LLVM 3.6. Hoewel het cijfer een kleine versiesprong aangeeft, blijkt LLVM 3.6 niet compatibel met de vorige versie, wat mogelijk de programmeur van Gambas ooit frustreerde, een probleem waar hij nu definitief van verlost wil zijn.

De nieuwe compiler is van het type “in vliegende vlucht” of in het Engels “on the fly” of ook wel “Just In Time”, met de bekende JIT afkorting.

De compiler vertaalt de bytcode van Gambas (in C) tijdens het uitvoeren, en gebruikt vervolgens de compiler van het systeem (meestal gcc of clang) om verder te vertalen naar de uiteindelijke machinetaal. Vladimir Makarov van de programmeertaal Ruby moet ongeveer dezelfde ideeën gehad hebben, en die zijn toegepast in versie 2.6.0 van de programmeertaal Ruby. (www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-released/).

Deze methode heeft een nadeel: ze is trager dan de vroegere compiler. Maar ze heeft het grote voordeel niet afhankelijk te zijn van de API van de soms minder betrouwbare aanwezige C compilers. In tegenstelling tot de vroegere compiler neemt de programmeertaal nu de zaak helemaal in eigen handen. Meer nog, er kunnen nu bepaalde testen uitgeschakeld worden om aan snelheid te winnen. Maar daarbij stijgt dan het risico op het crashen van het programma, bijvoorbeeld door een onmogelijke deling door nul.

Door het gebruik van de nieuwe compiler doken er kleine probleempjes op na het verschijnen van 3.12, maar die werden de daaropvolgende weken snel gerepareerd in versies 2.12.1 en 3.12.2.

Webapplicatie met grafische interface

Een andere grote ontwikkeling van Gambas 3 is de mogelijkheid om web-applicaties te maken vanuit de programmeeromgeving, alsof je een klassiek desktop programma maakt.

Nieuwe component en gebruik van de programmeeromgeving

Die nieuwe mogelijkheid is gebaseerd op een nieuwe component “gb.web.form”, die kan omgaan met javascript notering, JSON formaten en URL methodes. Met “gb.web.form” krijg je een extra form, de WebForm. Dit type van Forms dient om de grafische schermen te definiëren die in je webapplicatie gebruikt gaan worden. Ze kunnen overeen komen met klassieke html pagina’s of dialoogvensters. De component biedt dan verschillende grafische controle-elementen om te gebruiken op je Form.

(hier een voorbeeld van zo’n form: op linuxfr.org)

Werking

Het principe van een webapplicatie verschilt grondig van een typische “Modale” toepassing. De webapplicatie wordt gecompileerd tot een cgi script dat daarna draait op de server, en niet op de desktop van de gebruiker.
De browser van de gebruiker dient als interface, een soort grafische terminal. Html wordt de beschrijvig van de interface.
Er wordt zo weinig mogelijk javascript gebruikt. De handelingen van de gebruiker worden onder de vorm van http/xml requests naar het programma op de server gestuurd. Die antwoordt met de nodige javascript code om de pagina te verversen. De toestand van de grafische interface van de gebruiker wordt bewaard in de sessie van de browser. Dat is natuurlijk veel trager dan webapps die voornamelijk in de browser draaien, en het biedt minder mogelijkheden, maar het werkt toch vrij goed.

(een voorbeeld van zo’n form op linuxfr.org)

Voor gambas ontwikkelaars heeft dat bovendien het voordeel dat ze kunnen werken voor een platform dat verschilt van hun eigen Linux computer, denk aan collega unix-achtige Mac, waar spijtig genoeg geen gambas op draait.

Welkom, Git

Er zijn ook wijzigingen in de ontwikkeling, het programmeren van gambas zelf. De programmeurs van gambas zijn overgeschakeld van het subversion systeem van Sourceforge op het Git broncodebeheer systeem. De referentieversie van de ontwikkelaars vind je nu op gitlab.com.
De hoofdontwikkelaar gebruikte een jaar en een half git om het te proberen, en hij vindt het krachtiger, sneller, gemakkelijker, en betrouwbaarder. Er is letterlijk niets tegen in te brengen.

Ook de mailinglist is overgebracht van SourceForge naar een prive-server die door een gambas gebruiker beheerd wordt.
Het systeem om foutmelding te beheren, de bug-list, wordt al langer beheerd met een eigen programma dat in gambas geschreven is, en draait op de server van de werkgever van de hoofdprogrammeur.
Nu zit enkel de hoofdwebsite nog op SourceForge, maar ook daar zal verandering in komen.

Nieuwe systemen

Er zijn naast GNU/Linux op x86 steeds meer andere systemen waarop gambas compileren al lukt :
FreeBSD
NetBSD
GNU/kFreeBSD
Cygwin

(maar dat betekent niet dat de hele IDE daarop draait zoals op Linux)

En de hardware breidt uit naar ARM, ARM64, PowerPC64.

Er werden ook aanpassingen gedaan voor Hurd.

Software platform

Gambas heeft ook een eigen platform om programma’s te publiceren die in gambas zijn geprogrammeerd. Je kan er gambas programma’s op publiceren en van afhalen. Dat kan van in de programmeeromgeving; je kan er de lijst van programma’s zien, filteren op categorie, en de programma’s installeren en de-installeren in je werkomgeving. En natuurlijk kan je je eigen project er aan toevoegen. Ook de voorbeeldprogramma’s die vroeger bij de IDE zaten, zitten nu in dat online systeem. De ontwikkelaar noemt het de “Logithèque Gambas”.

Programmeeromgeving

De IDE of geïntegreerde programmeeromgeving, het programma waarin je werkt om gambas programma’s te schrijven, is ook verbeterd, meer bepaald de beeldbewerkingsmodule. Die liet toe zeer eenvoudige pixelbewerkingen te doen, maar is nu volledig herschreven en kan nu veel meer:
Er is nu
– mogelijkheid voor meervoudige selectie.
– booleaanse operaties op verschillende selecties, dank zij een nieuwe component, gb.clipper (waarover later meer).
– rotatie en uitrekken en verdubbelen van selecties.
– selecteren via een toverstaf
– kleurbalans, helderheid, doorzichtigheid.
– kleurenpallet, kleurverzadiging, een kleur omzetten naar transparant
Kortom, het is een kleine gimp geworden.

Intrede van gitlab

De ingebruikname van Git heeft ook gevolgen voor de grafische interface, die vroeger enkel mogelijkheden had voor Subversion. De interface is dus aangepast om ook Git te kunnen gebruiken, tot en met de git branches. Maar niets gaat boven het gebruiken van de commandolijn voor het gebruik van git, want het programma heeft zoveel mogelijkheden die je niet allemaal kan uitwerken in de grafische interface.
Er is een Git menu bijgekomen met onder het menu Publier, Synchroniser, Annuler tous les changements, Tout ajouter au référentiel, en Branche, wat de andere takken toont. Je kan het je als programmeur niet beter wensen! Bij het gebruik van de commando’s via het menu krijg je een venster met de output van git, zoals je die normaal zou zien op de commandolijn.

Apart bestand openen

De programmeeromgeving kan nu gebruikt worden om een apart bestand te wijzigen, zonder dat je er een project voor moet openen. Je kan dus snel een beeldbestandje openen, of een SQLite database aanpassen. (ps Ik zie niet direct veel verschil met vroeger, want in Gambas 3.9.2 kon dat ook al)
Bij het starten van Gambas3 kan je kiezen voor Open Bestand, en dan krijg je bv alleen het tekenprogramma als je een pixel bestand hebt gekozen. Het lijkt op de File, Open file (Bestand, Open bestand…) die je kan doen als je in een project staat, maar dan komt dat bestand in de lijst bij de bestanden van je project te staan onder “File”, en je krijgt hem er niet zo snel weer weg (tip: delete verwijdert effectief het oorspronkelijke bestand!)

Modellen

Het venster om een project te openen is herzien: het baseert zich nu op een lijst van modelprojecten. Die lijst is naar hartelust uitbreidbaar. Het volstaat een nieuw project te maken in de verborgen map ~/.local/share/gambas3/template/ en dat zal mee opgenomen worden als nieuw modelproject. Standaard lijkt die leeg te zijn.

Gambas Lettertype

Er is nu een eigen lettertype voor Gambas beschikbaar. Als je wil kan je het installeren vanuit Gereedschap, voorkeuren, Letterypen (Tools/Preferences/Fonts). Met een knop wordt dan dat lettertype geinstalleerd in je persoonlijke map. Het bestaat uit Gambas9 en Gambas10, en van beiden een vet (bold) versie. Het zijn dus bitmap lettertypes met 9 en 10 punt groote. Het lettertype bevat heel wat unicode tekens, en hoewel niet helemaal volledig, toch bruikbaarder dan heel wat andere bestaande bitmap lettertypes.
Het standaard lettertype voordien hangt af van bv je distributie; bij Ubuntu zal dat bv “Ubuntu,11” zijn, in KDE “NotoSans,10”, enz (of ik zou ze daarnaartoe veranderd kunnen hebben).

Diverse verbeteringen

Een greep:
– mogelijkheid om een breakpoint te de-activeren
– gebruik van bestanden met het patch formaat
– de maker van de packages beheert nu de applicatie los van de grafische toolkit.
– automatisch aanvullen van de naam van bestanden
– de gewijzigde bestanden zijn automatisch bewaard bij het crashen van de programmeeromgeving
– het venster van het openen van een project is herzien
– de online hulp is te downloaden vanuit het opties menu voor offline gebruik
– de compressie van javascript bestanden en CSS is verbeterd
– PNG bestanden kunnen automatisch versleuteld worden indien het hulpprogramma pngquant aanwezig is. (ps: pngquant kan gemakkelijk bij-geïnstalleerd worden met apt get of via online zoek bij de paketten van je distributie, zoals software.opensuse.org; pngquant is a command-line utility and a library for lossy compression of PNG images)
– het beheer van donkere thema’s is aanzienlijk verbeterd
– het beheer van de sessies is onder handen genomen
– de interface van de debugger is herzien
– er is een venster voor het ingeven van speciale tekens
enz.

Toegang tot databanken

Het systeem voor de toegang tot databanken is verbeterd:
– de verbindingen gedefineerd in de instellingen van de programmeeromgeving zijn bereikbaar bij het uitvoeren van het programma, en de wachtwoorden die bewaard zijn in de portefeuille van de desktop kunnen automatisch gebruikt worden.
– de collation van de databankvelden wordt nu beheerd en worden in aanmerking genomen volgens het type van de onderliggende databank
– een klasse SQLrequest is toegevoegd, die toelaat om een SQL-request te maken die automatisch rekening houdt met de verschillen in syntax tussen de database systemen.
– de eigenschap Connection.LastInsertId laat toe om de laatste waarde van een toegevoegd record te krijgen bij een automatisch voortnummerend veld.
– de component gb.db.mysql laat toe sneller met mysql databanken te werken dankzij een interne cache van de meta-data.
– de component gb.db.sqlite3 laat toe met SQLite 3 databanken te werken en is volledig herschreven in C; ze is nu betrouwbaarder, sneller, gebruikt minder geheugen.
– de component gb.db.odbc kan nu een string verbindingsgegevens met ODBC ontvangen als hostname van de datanbank
– de component gb.db.form die grafische controle-elementen voorziet voor gebruik met databanken heeft een aantal verbeteringen gekregen.

Anderzijds biedt de databankbeheerder van de ontwikkelomgeving nu de mogelijkheid om de struktuur van een databank te bewaren bij het project. Deze struktuur kan nadien gebruikt worden bij het uitvoeren van het programma om automatisch de databank te maken (bij eerste gebruik) via de methode Connections.create().

De tekstverwerker component

De tekstverwerker met kleurcodering voor het programmeren is volledig herschreven in Gambas. Hij is geïmplementeerd in de nieuwe component gb.form.editor. Die tekstverwerker biedt alle mogelijkheden van de oude tekstverwerker, en brengt de volgende nieuwigheden:
– schuifbalken met vooruitzicht op de tekst (een beeld toont waar in de hele tekst je bent).
– automatische aanvulling van de aanhalingstekens; als je ze opent wordt er onmiddellijk een sluit-aanhalingsteken gezet. Ook voor het automatisch sluiten van haakjes en strings.
– meer kleuraanduiding voor de syntax
– automatische lijnoverschrijding (line break)
– smooth scroll
– duidelijk maken van de huidige controlestruktuur
– oplichten van de huidige zoekgeschiedenis

En aangezien de tekstverwerker geschreven is in Gambas, kan je hem gebruiken in GTK+ applicaties.

Terminal emulator component

De nieuwe component gb.form.terminal implementeert een terminal emulator controle, compatibel met de VT-100, volledig geschreven in Gambas. Hij laat toe aan de programmeeromgeving om de uitvoer van een programma dat draait, weer te geven in een echte terminal. (ps: ik denk dat deze uitvoer vroeger al onderaan het scherm voorbijrolde in een soort commandolijnbox)

Toegang tot kaarten

gb.map is een nieuwe component die toelaat om kaarten te gebruiken in een vierkantjespatroon, van OpenStreetMap, Google, Microsoft Earth en anderen.

De component biedt een klasse Map die een kaart voorstelt; met de mogelijkheid er een aantal vektoren bovenop te leggen. Hij biedt ook een controle MapView die zorgt voor de weergave van de kaart en die muisbesturing toelaat. De omvormingen tussen de verschillende projectiesystemen en de coördinaten worden beheerd door het hulpprogramma cs2cs van het project Proj.(ps: https://proj.org/apps/cs2cs.html)

Voorbeeld:

Public Sub Form_Open()
MapView1.Map.AddTile("OpenStreetMap", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null).Copyright ="© OpenStreetMap contributors"
'
' Centrer sur Paris
MapView1.Map.Center = MapPoint(48.866667, 2.333333)
MapView1.Map.Zoom = 5
'
End

Componenten Grafische interfaces
Grafische toolkits

Gambas gebtuikt altijd de grafische toolkits van Qt en GTK+, en biedt een identieke API voor de componenten van de twee toolkits, wat toelaat om een grafische toepassing te maken die op eender welke van de twee toolkits kan draaien. Een nieuwe component Qt5 (gb.qt5) gebruikt de bibliotheken van Qt5, terwijl een nieuwe component gb.gtk3 de bibliotheken van GTK+3 aanspreekt. Er zijn dus ondertussen vier grafische componenten die allemaal dezelfde grafische interface gebruiken in de programmeeromgeving.

Andere grote wijzigingen zijn:

  • – de standaard API voor tekenen is nu de klasse Paint, die implementeert een model gelijkaardig aan dat van Cairo; de functies om tekst op een lijn te zetten en schaduwen te maken zijn toegevoegd, alsook enkele nuttige tekenhulpmiddelen.
  • – vensters met alfa-componenten worden nu ondersteund
  • – de oude tegen-API GTK+ 2 is achtergelaten, en Cairo wordt overal gebruikt bij de GTK component.
  • – desktop sessies worden nu ondertsteund, de eigenschap Application.Restart laat toe om het commando te bepalen dat wordt uitgevoerd door de sessiebeheerder om de toepassing terug op het bureaublad te zetten bij het starten van het bureaublad.
  • – de ondersteuning van meer schermen is verbeterd (de dialoogvensters moeten verschijnen en centreren op het scherm van hun ouder-venster).

Frustratie no2

Iedere nieuwe subversie van GTK+ 3 bevat de onprettige verrassing om een deel van de softwarebibliotheek niet meer te zien werken. Het ging zover dat sommigen me hebben aangeraden om ze maar helemaal uit Gambas weg te laten.
Ik denk dat GTK+ 3 de slechtste softwarebibliotheek is die ik ooit heb moeten gebruiken, door de afwezigheid van terugwaartse uitwisselbaarheid.
Wat ik hoop: dat GTK+ 3 in werkelijkheid een doorlopende beta versie is van GTK+ 4, en dat in de toekomst alles in orde komt.

Herschrijven van de controle-objecten in Gambas

Heel wat interne controle-objecten zijn herschreven in Gambas, en werken dus op dezelfde manier in Qt of in GTK+. Ze zijn uitgevoerd in een nieuwe component gb.gui.base, die dient als basis voor alle code die in Gambas geschreven is en die gemeentschappelijk is voor alle grafische toolkits

Dankzij dat herschrijven en die doorgedreven gemeenschappelijke basis, is het mogelijk geworden om de volgende functies uit te voeren: afgedekte vensters vertonen nu schaduw binnenin, en ondersteunen nu een vloeiende afdekking.

Toevoeging van vele nieuwe controle-elementen:

  • – ColorPallette: een keuze uit kleuren van een kleurenpallet.
  • – DirBox: een tekstveld gekoppeld aan een mappenkeuze (nota: met een delete knopje voor het tekstveld).
  • – DocumentView: een controle-element die toelaat elk type document te tonen
  • – FileProperties: een controle-element dat de eigenschappen en de grootte van een document laat zien; de grootte wordt berekend in de achtergrond.
  • – FontBox: een tekstveld gekoppeld aan een lettertype kiezer.
  • – ImageView: laat toe een beeld te tonen met verschillende zoom-waarden.
  • – ListEditor: laat toe een lijst van elementen te wijzigen en opnieuw te sorteren.
  • – MessageView: een berichtenvenster dat automatisch verschijnt en verdwijnt.
  • – SliderBox: het samenbrengen van een Slider en een SpinBox, gelijkaardig aan wat bestaat in Gimp.
  • – Spinner: het tonen van een wacht-animatie in een vorm die ronddraait
  • – Spring: een map die uit een Panel spring, waarvan de eigenschap Expand True moet zijn.
  • – SwitchButton: een aan/uit knop

Beheer van de iconenbalk op de desktop

Het beheer van de iconenbalk is herzien. Het maakt gebruik van het DBus protokol van freedesktop.org als dat gevonden wordt. Daarbij maakt het automatisch gebruik van gb.dbus.trayicon. Anders, en zolang het ondersteund is door de desktop, blijft het X11 protocol gebruikt worden.

Frustratie 3

De ontwikkelaars van KDE, Gnome, en Unity zijn erin geslaagd om een gemeenschappelijk protocol DBus te gebruiken voor een iconenbalk. En die dan ieder op zich in een onderling niet uitwisselbare manier uit te voeren.

Daardoor werkt de iconenbalk via DBus enkel met KDE. Voor de anderen werken er sommige dingen wel, andere niet.

Eigen iconen

De component gb.form.stock biedt twee sets van iconen aan voor Gambas; één in monochrome of zwart-wit, de andere in kleur. Ze bestaan uit beeldjes van 32 op 32 beeldpunten, die automatisch worden uitgerokken naargelang de noden. Deze set iconen laat toe een toepassing te schrijven die niet afhangt van de iconen die al dan niet op het desktopsysteem aanwezig zijn.

Multimedia componenten

De component gb.media is momenteel gebaseerd op GStreamer 1.0. Zijn stabiliteit is grotendeels verbeterd, zelfs als alles nog niet perfect is, door -ondermeer- de breekbaarheid van de GStreamer API.

De volgende functionaliteit is toegevoegd:

  • – capsfilter is toegevoegd met filters voor Multimedia formaten.
  • – opvang van signalen die worden uitgestuurd door de GStreamer pijplijn.
  • – al lopend videobeelen opnenmen
  • – opvang van het laatste beeld van een pijplijn
  • – de mogelijkheid om twee stromen van multimedia samen te voegen in een ketting zonder knipwerk.
    Bovendien is er een nieuwe component gb.media.form die voorziet in een eenvoudige multimedia lezer in de vorm van een grafisch controle-element.

Scannergebruik

gb.scanner is een nieuwe component die als een omhullende werkt voor het programma scanimage van het SANE project.

Het nemen van een beeld gaat als volgt:

dim hImg as Image
hImg = Scanners["hpaio:/net/HP_LaserJet_MPF?ip=192.168.1.25"].Scan()

Alle opties van scanimage zijn bereikbaar via de eigenschap Option van ieder Scanner object. De mogelijkheid om meer pagina’s te scannen is voorzien via de asynchrone mode.

Netwerk component

En verder veel foutcorrecties aan de netwerkcomponent gb.net, zoals:
– de component gb.net.smtp, die het protocol SMTP beheert, is volledig herschreven in gambas. Hij is veel betrouwbaarder, en laat authenticatie als PLAIN en CRAM-MD5 toe, alsook SSL en TLS;
– de component gb.web.curl regelt nu het ftps:// protocol. Hij beschikt over een klasse HttpForm om gemakkelijk http pagina’s te kunnen verzenden, en een klasse DownloadManager om verschillende vormen van asynchrone downloads te beheren.
– gb.web.feed is een nieuwe component om de RSS stromen te beheren.
– gb.httpd is een nieuwe component die een eenvoudige HTTP webserver levert, en die wordt gebruikt door de ontwikkelomgeving om webapplicaties te debuggen die ontworpen zijn met de componenten gb.web of gb.web.form.

Multi-precisie berekeningen

De nieuwe component gb.gmp brengt Gambas de mogelijkheid om gehele getallen en rationele getallen te behandelen met een willekeurige precisie. Dit is gebaseerd op de bibliotheek van GNU: GNU multi-precision library. Het aantal getallen na de komma is enkel beperkt door de capaciteit van het systeem waar de berekening op draait.

https://gmplib.org

(Een voorbeeld is opgenomen in het origineel document)

Hulpcomponenten:

Twee componenten werden toegevoegd:
1. De eerste, gb.util, hergroepeert de methodes en praktische extenties van de interpreter.
– lezen van CSV bestanden.
– omzetten van datums van het Unix formaat of RFC822;
– berekening van de datum van Pasen.
– functies voor de creatie, verplaatsing en verwijdering van intelligente mappen.
– afstand tussen twee tekenreeksen volgens Damerau-Levenshtein
– tekst uit een stuk html halen
– uitfilteren van dicritische tekens
– omzetten van phonetisch (voor de Franse taal)

De tweede, gb.util.web, hergroepeert de methoden die nodig zijn voor het programmeren voor het web:
– omcoderen naar javascript
– de stroom van JSON coderen en decoderen
– URL verwerking

Andere nieuwe componenten

– gb.args is ee nieuwe component die dient voor het analyseren van de argumenten die meegegeven worden op de commandolijn vanaf hun beschrijving.
– gb.clipper is ee nieuwe component die gebaseerd is op de Clipper bibliotheek.
– gb.data implementeert nu de heap en PATRICIA boomstrukturen en een interface voor grafiekmanipulatie.
– gb.memcached is een nieuwe component die een memcached client implementeert (key-value db cache).
– gb.openal is een nieuwe component gebaseerd op de audio 3D bibliotheek OpenAL (OpenAL Soft waarschijnlijk, 3D geluid voor games en andere toepassingen)
– gb.openssl is een nieuwe component die een interface biedt voor versleutelingsfuncties van de libcrypto bibliotheek van het OpenSSL project
– gb.inotify is een nieuwe component die toelaat de mappen van het systeem in het oog te houden; het is gebaseerd op de inotify interface van Linux.
– gb.markdown is een nieuwe component die een lichtere vorm aanbiedt van de Markdown syntax.
– gb.report is vervangen door een nieuwe component gb.report2, die ook een verbetering is.
– gb.sdl2 en gb.sdl2.audio voorzien nu de SDL2 bibliotheek.
– gb.term is een nieuwe component die toelaat unix terminals te gebruiken, dichtbij wat het besturingssysteem aanbiedt.

Verbeteringen aan de taal

Nieuwe schrijfwijze (syntax)

– If … Then … Else … kan nu op 1 lijn gezet worden.
Match is een nieuwe operator die een vergelijking mogelijk maakt met een model (pattern matching), waarvoor het de bibliotheek gb.pcre gebruikt
– .[xxx] en !xxx zijn twee nieuwe afkortingen voor bewerkingen op arrays, te gebruiken binnen een struktuur van With … End With.
– het symbool … kan gebruikt worden om alle optionele argumenten van één functie naar een andere functie door te geven.
– numerieke constanten mogen in de octale notatie geschreven worden als &Oxxx (dus beginnend met de hoofdleter O);
– lokale variabelen mogen nu eender waar in de loop van een functie gedeclareerd worden, maar hun bereik blijft altijd beperkt tot die functie.
– het is nu mogelijk om variabelen van een lusstructuur te declareren bij het begin van de lus bij For en For Each, bv: For i As Integer = 1 To 100;
– het is nu mogelijk om onbeperkte toegang te hebben tot strings met arraybewerkingen.
– de compiler genereert een waarschuwing voor iedere lokale of globale variabele die niet geïnitialiseerd werd.

Nieuwe functies

– IsMissing() laat toe om de afwezigheid te checken van optionele argumenten
– Rand() geeft een pseudo willekeurig geheel getal
– System.Log() laat toe om in het systeemjournaal te schrijven (het is een interface van de syslog API van libc)
– Url() en FromUrl() laten toe om URL’s om te zetten.
– Move … Kill … laat toe om een bestand te verplaatsen en daarbij de atomaire bestemming te onderdrukken, onmisbaar bij het werken met processen die tegelijkertijd in hetzelfde bestand mogen schrijven.
– Assert laat toe om assertions (veronderstellingen) in de code te steken die het programma stoppen in geval van crash, ze worden niet gecompileerd tot het moment dat je een uitvoerbaar bestand genereert.

Correctie van de tijd-functies

De organisatie van de functies voor datum en tijd vertoont nu meer samenhang. Er is nu een duidelijke verdeling tussen functies die de lokale datum/tijd interpreteren en die met de universele UTC werken. Meer bepaald zijn nu de functies CStr() en CDate() nu uitwisselbaar, zoals het had moeten zijn van in het begin; het heeft wel de kost dat dit niet achterwaarts compatibel is.

Optimalisaties

– de functie Split() is sneller geworden
– de toegang tot arrays en collecties zijn sneller geworden, de benchmark voor “sort” is 25% verbetered.
– het grootste deel van de methodens Find() en Exist() voor arrays zijn sneller.
– de instructies Input en Line Input zijn sneller
– de omzettingen naar het type Boolean, en van of naar het type Variant zijn sneller.
– de ongelijkheidsoperatoren zijn sneller
– de functies Dir() en RDir() zijn nu 20 tot 40 procent sneller dankzij het gebruik van fstatat(), en door minder aanroepen naar stat() dan de intelligente gok van het aantal vaste linken naar de huidige directory facultatief maken.
– zoeken binnen een string is nu gemiddeld ongeveer vier keer zo snel.
– lussen met een variabele van het type integer zijn nu 5 procent sneller

Snelheidstesten

Hieronder de resultaten van een reeks van zes “benchmarks” die bestaan uit zes programma’s, geschreven in Gambas, Perl, en Python, waarvan de bron hier beschikbaar is (https://gitlab.com/gambas/gambas/tree/master/benchmark).

De gebruikte versies van de verschillende talen zijn:

Python 2.7.1.5rc1;
Perl 5.26.1;
Gambas 3.11.90 (ontwikkelversie van 2 november 2018)

Ze zijn uitgevoerd op een systeem met Ubuntu 18.04 met de Linux kernel 4.15.0-38-generic.
De tijden voor het uitvoeren van het programma zijn in seconden weergegeven.

… (op linuxfr.org staat een tabel met de resultaten)

───────── ───────── ───────── ──────────── ────────────────────────
Python Perl Gambas Gambas + JIT Gambas + JIT
(exécution uniquement)
─────────── ───────── ───────── ───────── ──────────── ────────────────────────
sort 3,93 6,36 4,76 0,84 0,25
polynom 9,94 13,40 8,04 0,84 0,75
primes 6,29 7,65 2,99 0,77 0,61
nbody 4,54 4,55 4,03 0,68 0,29
mandelbrot 5,34 4,24 3,06 0,22 0,10
string 8,94 1,81 1,41 1,49 1,40
─────────── ───────── ───────── ───────── ──────────── ────────────────────────

In vergelijking met de vorige testen kan men vaststellen dat er veel moeite gedaan is om de recente versies van er en Python te optimaliseren. Desondanks blijft Gambas aan kop staan in alle testen, behalve voor sort, waar Gambas na Python komt.
Men kan vaststellen dat de voordelen van een compilatie “in vliegende vlucht” ligt in de optimalisatie van de berekeningen, en dat die geen enkel merkbaar verschil oplevert in de behandeling van lettertekens (strings).

Conclusie

Er is de laatste 6 jaar veel werk uitgevoerd geweest, maar er blijft ook nog veel werk te doen:

  • – zelfs als Wayland nog altijd niet klaar is (integenstelling tot wat voorspeld was), zou er toch over gedacht moeten worden om het eventueel te overwege;
  • – aangezien Gambas ook werkt op ARM zou het goed zijn om te komen tot een werkende gambas op Android; er heeeft niets bewogen op dat gebied sinds vorig overzicht;
  • – de component gb.web.form verdient doorgedreven aandacht als de beste methode om web applicaties te maken in Gambas.
  • – het zou zonder twijfel interessant zijn om een andere taal dan BASIC te implementeren in de compiler.

Behalve enkele irritaties, die in de praktijk te maken hadden met vele verloren uren, te wijten aan (de fouten van anderen) bepaalde op te lossen problemen :-), kijken we met voldoening naar de evolutie van de taal. De mensen die ze gebruiken schijnen zelden teleurgesteld te zijn. Laat ons dus hopen, dat het jullie ook bevalt als jullie het uitproberen.

(En dan wenst hij nog een goed jaar aan alle gebruikers en ontwikkelaars van vrije software)

 ps: Dit is mijn eigen vertaling. Origineel in het Frans verscheen ondermeer op https://linuxfr.org/users/gambas

Temperatuur uitlezen op Raspberry Pi/Raspbian

Installeren van Gambas3 op Raspbian is gemakkelijk (zie vh/elders).

Een temperatuurvoeler aansluiten op een Raspberry Pi is ook gemakkelijk (zie bv hier)

Dan is een beetje code al genoeg, met een nieuw project dat alleen maar CLI hoeft te zijn (geen grafische interface nodig).

In MMain:

' Gambas module file
'
Private Const SENSORID As String = "10-0008032a0f9d"
Private Const DEVICELOCATION As String = "/sys/bus/w1/devices"
Private sFileContent As String
'
Public Sub Main()
'
  Dim hTempFile As File
  Dim sFilename As String = DEVICELOCATION &/ SENSORID &/ "w1_slave"
  Dim iFoundTemp As Integer
  Dim iCounter As Integer = 0
'  
  Debug "Filename is : " & sFilename
'  
  Repeat
    hTempFile = Open sFilename For Read
'  
    sFileContent = hTempFile.Load(sFilename)
    iFoundTemp = InStr(sFileContent, "t=")
 ' 
    hTempFile.Close
 ' 
    Print sFileContent
    Print iFoundTemp
    Print Val(Right(sFileContent, 6)) / 1000
    Inc iCounter
      Wait 10
  Until iCounter > 10
'
End

Dit programma zal 10 keer na elkaar de temperatuur uitlezen en tonen.

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.

Library of Component in Gambas3

1) Libraries

Bron: gambaswiki.org/wiki/doc/library

Library
Een library dient om gemeenschappelijk code tussen verschillende projecten te delen.

Een library is een Gambas programmma (executable), dat gebruikt kan worden in een ander project.

Voor eigen gebruik ga je dus steeds een library gebruiken, en geen component.

Locatie

Als een gambas project een library lib01 nodig heeft, wordt die gezocht op volgende plaatsen
(en ook in deze volgorde):

  • 1) uitvoerbare projectdirectory/lib01.gambas
  • 2) $XDG_DATA_HOME/gambas3/lib/vendorname/lib01:versie.gambas
  • 3) ~/.local/share/gambas3/lib/vendorname/lib01:version.gambas
  • 4) Project-Property_Tab_Library_directory-value/vendorname/lib01:versie.gambas
  • 5) /usr/lib[/multiarch]/gambas3/vendorname/lib01:versie.gambas
  • 6) /usr/bin/vendorname/lib01:versie.gambas

1. is de oudste manier
2./3. hangt af van het bestaan van $XDG_DATA_HOME, en gaat over installatie voor de user (single userwide copy; bv handig tijdens testen).
4. is een instelling in het gebruikend gambasproject (project eigenschappen)
5. is voor gebruik op een meergebruikerssysteem, waar je de library wil delen/gemeenschappelijk (dezelfde) gebruiken.
6. zoals 5., maar bij 6. gaat een gewoon gambas programma gebruikt worden als library (oudere manier).

$XDG_DATA_HOME hoort bij de specificaties van freedesktop.org en veronderstelt een basisdirectory waarin gebruikers-data wordt opgeslagen. Vgl $XDG_CONFIG_HOME voor gebruikers configuratie gegevens.

vendorname: zie Projecteigenschappen, veld “vendor” (of “verkoper” in de NL-talige versie).
Als deze leeg gebleven is bij creatie van de library, krijgt de locatie de mapnaam “(unknown)”:
.local/share/gambas3/lib/(unknown)/myownlib:0.0.1.gambas
Als je de vendorname alsnog invult, komt de lib in de nieuwe directory struktuur -inclusief die vendorname- terecht (en blijft de “unknown” versie bestaan).

Maken

Zie Een eigen Library (maken)

Je kan ze ook op niveau van het systeem installeren (zie boven “Locatie”)

Gebruiken

Het gebruikend project: open Project, Properties. Kies “Libaries” blad. Dan krijg je een venster met het “Runtime library search path”, en een lege lijn plus lege ruimte eronder.
Met “+ Add” knop voeg je er toe.

Je krijgt een venster “Select a Library”; ik zie in mijn geval een library staan – of niet (**)- in de directory waarin dit nieuwe project zit; selecteer, “ok”.

Zichtbaar in de lijst:

vendor > Lib01 0.0.1
Location: /home/naam/.local/share/gambas3/lib/vendor/Lib01:0.0.gambas
Provides: Class1, Class2

Je kan de library hier ook verwijderen, en van plaats veranderen in de lijst.

Nota/Problemen (*)(**)
Ik had nogal eens problemen waarbij ik nadien de library niet kon gebruiken; ik kon ze niet selecteren/vinden vanuit de IDE.
De library in ~/.local/share/gambas3/lib/myvendor bleek ook een gekke naam te hebben met een dubbel versienummer.

Ik heb gemerkt dat ik best:
– Project type : normaal (ipv library)
– Compileren naar .gambas programma ineens in de juiste directory in
~/.local/share/gambas3/lib/myvendor/libprj.gambas
(of de .gambas er naar kopieren).
Library compileren door uitvoeringsbestand te maken. Dat moet voldoende zijn. Maar..
– Als je de Library gebruikt in een project op dezelfde computer, moet je de IDE sluiten en terug starten om de libraries terug te lezen, anders ziet hij de nieuwe versie van de library niet, en kan je ze niet selecteren (momenteel in Gambas 3.14.3).
– opletten met versienummer; get from VERSION of de eigen project nummering kunnen dooreen/uiteenlopen…

Meer
Meer libraries: dan moet je letten op de volgorde in deze lijst; die moet juist zijn.
(volgens documentatie: van bovenaan/eerste tot onderaan/laatste).

Gevorderd?
De documentatie houdt daar zowat op; niets over:

  • Hierarchie van libaries (upd: beetje uitleg hier)
  • Initialiseren van een library: er wordt een aanzet gemaakt maar dat is nooit/nog niet aangevuld
  • Versie-nummering

Versienummer
Als je in de library code Application.Version gebruikt in een procedure, en je roept die op vanuit een gebruikend programma, dan wordt die zo letterlijk uitgevoerd dat je de versie van je uitvoerend programma te zien krijgt, en niet die van de library.
Je kan het versienummer in een Version.txt bestandje in de Data directory van je library zetten, en de inhoud van die file terugsturen in plaats van Application.Version.
Beter nog, als je het bestand “VERSION” noemt, en in het project het vakje “Get from VERSION file” aanklikt, wordt dat ook automatisch gebruikt binnen je library programma zelf.
Zie ook Versie van je bibliotheek (Library Version)

Update v.d. library
Hoe een library updaten?
TestLib is de library.
TestLib.gambas is de executable daarvan.

De file is ook terug te vinden als:
/home/username/.local/share/gambas3/lib/vendorname/TestLib:0.0.1.gambas

TestProgram op hetzelfde systeem is het programma dat deze lib gebruikt.

Wanneer krijgt TestProgram een “nieuwe versie” van TestLib in gebruik?

  • TestLib code gewijzigd. Run TestLib. – Run TestProgram vanuit IDE. –> Nee
  • TestLib code gewijzigd. Run TestLib. – Refresh TestProgram project vanuit IDE + Run –> Nee
  • TestLib code gewijzigd. Make Executable. – Run TestProgram vanuit IDE. Ja!
    Ook: TestLib:0.0.1.gambas datum/tijd wordt aangepast;
  • TestLib code gewijzigd. Make Executable. – Nog draaiend TestProgram vanuit IDE: –> Nee

De library wordt dus geladen bij het starten van het programma.

2) Componenten

Bron:
How To Program Components In Gambas (gambaswiki.org/wiki/dev/gambas)

Component
Gambas componenten zijn gedeelde bibliotheken die geschreven zijn in C, C++ of in Gambas zelf. Ze voegen nieuwe klassen toe aan de Gambas programmeeromgeving, en vormen een uitbreiding van de Gambas taal. Ze zijn voor algemeen gebruik bestemd, en worden dus verspreid met de gambas broncode.

Component maken

Project type: Component.

Je moet in de code EXPORTEER code gebruiken en de component voorzien van alles wat de IDE nodig heeft (eigenschappen met standaardwaarden, help enz).

Ook interessant: het object model van Gambas gambaswiki.org/wiki/doc/object-model