Eenvoudige grafieken met Gambas2

Article op Linux.com: “Creating simple charts with Gambas 2.0” van 12 december 2007 door Mark Alexander Bain.
Hij volgt een aantal conventies niet, en dat maakt de code moeilijker te lezen:
– Het type van een variabele wordt in Gambas aangegeven door een beginletter (bv iGetal, sNaam, …)
– Hij gebruikt in de namen van de variabelen veel “underscores” om twee delen van een woord te scheiden en die zo leesbaarder te maken. Maar in Gambas heeft die underscore een andere betekenis en wordt met hoofdletters in de woorden gewerkt, hoewel de underscores geen fouten geven in Gambas.
– Omdat er nogal veel met x en y coordinaten gewerkt wordt is het nodig meer betekenisvolle namen te geven.
x_string wordt dan sTitleX ; met 1 letter minder zeg je meer.

Hieronder (een stukje) “vertaalde” broncode:


' Gambas class file

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

  drawChart()
  
END

SUB drawChart()
  
  DIM iOriginX AS Integer
  DIM iOriginY AS Integer
  DIM iMaxX AS Integer
  DIM iMaxY AS Integer
  DIM sTitleX AS String
  DIM sTitleY AS String
  
  'Initialize 
  DrawingArea1.Clear
  draw.Begin(DrawingArea1)
  
  ' Axis titles text
  sTitleX = "Value"
  sTitleY = "Date"
  
  ' Origin
  iOriginX = Len(sTitleX) * 10
  iOriginY = DrawingArea1.ClientH - 30
  
  ' Axis length
  iMaxX = DrawingArea1.Width
  iMaxY = DrawingArea1.Height * -1
  
  ' Axis draw
  draw.Line(iOriginX, iOriginY, iMaxX, iOriginY)
  draw.Line(iOriginX, iOriginY, iOriginX, iMaxY)
  
  ' Axis titles
  draw.Text(sTitleX, 0, iOriginY + iMaxY * 0.90)
  draw.Text(sTitleY, iMaxX * 0.90, iOriginY + 10) 
  
  draw.End
  
END

Vertalen van een project in Gambas

– Kies de eigenschappen van je project Project, Properties, tab Options, en kijk bij Translation. Daar staat of je project vertaalbaar is (verzet naar Yes), en welke de basistaal is (bv English, United Kingdom).
– Indien vertaalbaar kan je bij Project, Translate kiezen (of het vlaggensymbool in de knoppenbalk).

In mijn geval leidde dat tot volgende foutmelding:

Cannot read translation file for language ‘English (U.S.A.)’
File already exists
sh: msgmerge: command not found

De help zegt:
How To Translate A Gambas Project
To translate a project into your own language, open it in the IDE, and click on translate… in the Project menu. (If the IDE complains about msgmerge, make sure you have GNU gettext on your computer)

Ik installeer
Gettext-devel – Tools for Native Language Support (NLS)

Daarna werkt de vertaalfunctie wel en krijg je een venster. Van elke te vertalen stuk tekst wordt getoond uit welke module het afkomstig is, en vanop welk regelnummer.
Links staan de originele teksten, rechts kan je de vertalingen invullen:

Vertalen in Gambas

De taal-onderdelen komen terecht in een subdirectorie in je Gambas project:
.lang

vertaalfiles
Daarin zie je de files met de vertalingen herkenbaar aan hun naam “en_us”, “nl_be” enz, en andere bestanden blijkbaar per module, form …
In de .pot bestanden (zoals FMain.pot) komt bovenaan de hele directory structuur /home/gebruikersnaam/… leesbaar voor; denk daaraan bij verspreiding!

Als je de resultaten wil uitproberen zonder je “eigen” taal te verzetten, kan je de taal over je eigen taal kopieren. Maak eerst een vertaling van bv 1 woord naar de “eigen” taal.
(“eigen” taal = taal ingesteld in je werkomgeving; kan bv Engels zijn, of Nederlands, zie systeemmenu’s)

Veronderstel:
– Taal van de Gambas toepassing: Engels (UK) zie project properties, language, default language.
– Taal van je omgeving (KDE): Engels (US) zie keuze bij installatie van je Linux distributie.
– Taal van de vertaling: Nederlands (BE).

Sluit Gambas en
1. Verwijder en_US.po en en_US.mo.
2. Kopieer nl_BE.po naar en_US.po
3. Kopieer nl_BE.mo naar en_US.mo
Start het programma terug op.

Gambas “2″ op KUbuntu 8.4?

Ondertussen is Gambas doorgedrongen tot de Ubuntu softwareverzameling. In Kmenu, Add/Remove software (“adept installer”), zoek “Gambas”: Gambas 2 aanklikken, installatie bevestigen.
“Installation Complete” (Quit)

Helaas weer de Ubuntu-way: je kan hier niet zien welke versie het exact is. Na installatie krijg ik nog altijd de 1.9.91 versie van Gambas.
Daarom eerst een “uninstall” en dan een “install” vanuit het software management pakket (add/remove software).
Het blijft versie 1.9.91…

Er staat uitleg op http://gambas.gnulinex.org/ubuntu/ hoe de daar vermelde packages te gebruiken:
– wijzigen van de lijst met servers in

/etc/apt/sources.list

bv door een terminal te openen en sudo mc, daar in /etc/apt/ het bestand sources.list zoeken en met F4 (edit) openen

Een lijn toevoegen met (althans voor versie 8.4 “Hardy” – zie de pagina voor andere versies)

deb http://azores.linex.org/gambas-other/ hardy main

Daarna nog altijd op de command prompt:
sudo apt-get update

Uiteindelijk:
sudo apt-get install gambas2

Dat sluit af met
Setting up gambas2 (2.5-1ubuntu1) …

Maar als Gambas gestart wordt geeft die vreemd genoeg versie 1.9!

Ps: het is een KUbuntu na upgrade van 7.10 naar 8.4.

Bestaan globale variabelen in Gambas?

Volgens de tip of the day zijn er geen globale variabelen in Gambas. Je kan wel op hoogste niveau een variabele declareren en die gebruiken; ofwel vanuit de hoofdmodule (main module):
PUBLIC myGlobalVar
ofwel vanuit het hoofdscherm (FMain):
PUBLIC STATIC myGlobalVar

Om ze te gebruiken vermeld je de modulenaam:
ModMain.myGlobalVar
FMain.myGlobalVar

Wat ik ook al gezien heb is een aparte module waarin de variabelen komen die je gemeenschappelijk nodig hebt:
ModCommon.myGlobalVar

Rolluik: ComboBox als afrol-lijst (Drop-down list)

ComboBox De Combobox lijkt het meest op een gewone “drop down list” of rolluiklijst.
Toch gedraagt hij zich niet zo. Als je op de lijst klikt gaat die niet open, maar krijg je een “carrot” of cursor in het woord “ComboBox1” (knipperend vertikaal streepje).
De enige plek waar je de lijst kan doen openklappen is het pijltje rechts ernaast, en dat is in verhouding een klein vlak.
Om de hele oppervlakte op een klik te laten reageren met openklappen van de keuzelijst kan je het gedrag van “mousedown” definiëren:
Rechtsklik, Events, MouseDown brengt je in de code onder PUBLIC SUB ComboBox1_MouseDown() van de combobox. Voeg daar de “Popup” toe:

PUBLIC SUB ComboBox1_MouseDown()
ComboBox1.Popup()
END

Wil je de lijst nog “gevoeliger” maken kan je in plaats daarvan de lijst al laten openklappen als het pijltje er voorbijkomt:

PUBLIC SUB ComboBox1_enter()
ComboBox1.Popup()
END

Hoe je die lijst terug laat “inklappen” als je niet geselecteerd / geklikt hebt, heb ik niet gevonden.
(misschien met de _leave methode?)

Meer dan 1 waarde terugkrijgen uit functie

Een functie geeft normaal geen, ofwel 1 waarde terug. De waarde kan een boolean zijn voor gelukt/niet gelukt, of het resultaat van een berekening of bewerking op getallen of tekst.

Als de functie meer dan 1 waarde moet teruggeven, kan je een array vullen met de waarden.

Of zoals Benoît zelf voorstelt:

I think the better is using an array of Variant, or better an anoynmous array:

FUNCTION DoSomething(Name AS String) AS Array
DIM FirstResult AS ...
DIM SecondResult AS ...
' Do something
RETURN [FirstResult, SecondResult]
END

Op deze manier kan je tot 63 resultaatwaarden teruggeven.

Bad dimension error bij run: waar zit de fout?

run Na een hoop veranderingen vraag ik een “RUN” en het programma eindigt met de foutmelding “bad dimension”.
Error Bad dim
Spijtig genoeg geeft Gambas deze keer niet aan waar de fout zich voordoet. Normaal kom je in de source code op de plaats van de fout te staan na een foutmelding die de fout beschrijft Normale foutmelding.
Als ik terug op run druk (om het programma voort te zetten), crasht het.error crash

Ik probeer de laatste veranderingen ongedaan te maken, maar het zijn er helaas nogal veel en ik vind daar de fout niet mee.

breakpoints Je kan dan “breakpoints” zetten in je code om het programma tot daar te laten lopen. Ik probeer met breakpoints in PUBLIC SUB Form_Open() van de main form (Forms, FMain) omdat de fout zich voordoet bij het uitvoeren van het programma alvorens ik ergens klik of iets “doe”. In dit geval haalt het niets uit; eender waar ik de breakpoints zet, ik blijf dezelfde foutmelding krijgen.

Je kan dus geen breakpoints zetten in de initialisering van variabelen bovenaan in de Form, voor de eigenlijke instructies beginnen. Je kan wel gemakkelijk een ' zetten vooraan de lijn, om de lijn om te vormen in “commentaar”, waardoor ze dus niet meer wordt gebruikt door het programma. De foutmelding kwam niet meer voor nadat ik een array uitge-comment had: PRIVATE aBookType AS NEW String[0, 0]. Inderdaad dimensie dus; door de foutmelding beter te lezen had ik het kunnen weten. variabelen

Current objects
Een andere mogelijkheid is kijken naar de variabelen na het afbreken van het programma. Onderaan in het tabblad “Current Objects” heb je een lijst met variabelen. Daar stond de foute variabele niet bij, .
Wat dus niet gaat is dimensie nul: PRIVATE aBookType AS NEW String[0, 0]
wat wel gaat: PRIVATE aBookType AS NEW String[1, 1]

kopieer-plak fout (copy-paste crash)

2 x Gambas open (twee keer de hele applicatie gestart).

In de eerste Gambas heb ik een bestaand project open, waaruit ik enkele dingen wil kopieren naar de andere FMain.form.

Gambas, select listbox, copy, schakel over naar andere Gambas, rechtsklik plak: ok

Schakel terug naar eerste Gambas.

Select lcdNumber, copy, switch to other Gambas, rightclick paste:

Gambas2
This application has raised an unexpected error and must abort

Component missing.
FForm.CreateControl.1060

Veroorzaakt doordat het nieuwe project als graphic maar niet als QT project was gestart – het is een typische QT-component.

Toevoegen: Project, properties, “gb.qt” – incompatible met gb.qui – afgezet
en “gb.qt.ext” : daarin zitten de ronde draaiknop en de LCD cijfers.

2 x Gambas open.

In first Gambas I have an existing app to copy from FMain.form.

Gambas, select listbox, copy, switch to other Gambas, rightclick paste: ok

switch back to first Gambas, select lcdNumber, copy, switch to other Gambas, rightclick paste:

Gambas2
This application has raised an unexpected error and must abort

Component missing.
FForm.CreateControl.1060

Caused by missing components in the project. The second, new Gambas environment was started with a new project, with different selection of components: Type graphical application instead of QT graphical application.
The LCD controls are typical for QT.

Solved the problem by adding the components:

Project, properties, gb.qtincompatible with gb.qui – switched off

and gb.qt.ext : this contains these LCD numbers.

Om een beetje universeler te werken kan je die componenten beter vermijden blijkbaar.