Gambas 2 in Ubuntu 8.10

Gambas 2 in Ubuntu 8.10 Ubuntu krijgt Gambas 2

In de live CD van Ubuntu 8.10 kan je bij “software installeren” al nazien of Gambas 2 nu beschikbaar is.

Kijk bij Add/Remove applications, All available applications, Programming.

Na het installeren vanuit de live CD:

Synaptic Package Manager, Development, Quick Search gambas2.

Gambas installeren was nog nooit zo gemakkelijk.
Gambas 2 draait in Ubuntu
Gambas werkt echt fantastisch goed, dit is de eerste Gambas-Gnome combinatie die er zo goed uitziet, zelfs met een project dat gemaakt is in KDE.

Database opvraging met result set

Een sterk hulpmiddel voor het opvragen van gegevens uit een databank en verdere verwerking ervan is de “resultset”, de resultaatset van de opvraging. Een opvraging bestaat meestal uit een tekstlijn met een SQL query. Die kan op voorhand opgebouwd worden in een variabele.
Er wordt trouwens aangeraden om eerder de echte variabelen mee te geven als parameters.( zie Databank aanspreken..)

sRequest = "SELECT * FROM &1 LIMIT &2"
TRY myResult = db.Exec(sRequest, "test", "2000")

Met de resultset kan je dan hetvolgende:

  • Kijken hoeveel records of resultaatrijen er zijn:

    PRINT myResult.Count

  • bewegen met de pointer of index:

    Die begint te tellen bij 0 en kan gevolgd worden met:
    PRINT myResult.Index

    Naar een bepaalde rij:

    myResult.MoveTo(iRow)

    Naar een relatieve rij bewegen met de pointer: eerste, laatste, volgende, vorige

    myResult.MoveFirst()
    myResult.MoveLast()
    myResult.MoveNext()
    myResult.MovePrevious()

    Een veld uit het huidige record aanspreken:
    PRINT myResult!fld_name

    Omdat het een “enumerable” resultset is hoef je zelf niet te tellen, maar kan je FOR EACH gebruiken:

    FOR EACH myResult
    PRINT myResult!fld_id & " - " & myResult!fld_name
    NEXT

    (als de databank-tabel de velden fld_id en fld_name bevat )

  • De inhoud van een veld opvragen om in te vullen in bv een TableView:

    TableView1.Data.Text = myResult[sVeldnaam]

Extra interessant zijn de “subcollecties”: bv de beschikbare velden:

myResult.Fields[]

Die zijn “enumerable”: dwz te gebruiken met FOR EACH. Je moet wel een “tellervoorwerp” hebben; bv een veld.

DIM myField AS Field

FOR EACH myField in myResult.Fields
‘ …
NEXT

Voorbeeld:

PUBLIC SUB fillLsbxTableFieldsForEach()
'
' try to make a better fillListbox by using enumerated type
'  
  DIM iInd AS Integer
  DIM sTableAndFields AS String
  DIM hField AS Field
  DIM hTable AS Table
'  
  DEBUG "Database:" & lsbxDatabases.Current.Text
  WITH $hConDb
    .Name = lsbxDatabases.Current.Text
  END WITH 
  $hConDb.Close
  $hConDb.Open
  TRY $hRes = $hConDb.Exec("SHOW TABLES")
  IF ERROR 
    Message.Error(Error.Text, "ok")
  ELSE 
    DEBUG $hRes.Count
    $hRes.MoveFirst
    lsbxDbTables.Clear
    FOR EACH hTable IN $hConDb.Tables
    '[$hRes[Str($hRes.Fields[0].Name)]]
      WITH hTable
        DEBUG .Name
        sTableAndFields = .Name & "="
      END WITH 
      FOR EACH hField IN hTable.Fields
        WITH hField
          'DEBUG .Name
          sTableAndFields &= .Name & "+" 
        END WITH 
      NEXT       
    lsbxDbTables.Add(sTableAndFields)
    NEXT      
  ENDIF 
'  
END

Upd 3/11/2010: index start op 0.

Hoe een shell commando uitvoeren

Er zijn 2 mogelijkheden om commando’s naar het systeem te sturen:

EXEC en SHELL

EXEC start een extern process. SHELL start een extern command in een shell.
Bij EXEC geef je de parameters allemaal als parameter mee. Bij SHELL geef je een string met het hele commando mee.
EXEC [ "ls", "-la", "/tmp"] WAIT SHELL "ls -la /tmp" WAIT
EXEC wordt uitgevoerd in ? SHELL wordt uitgevoerd in /home/username
Gebruik bv
Application.path & "/this.txt"
voor een bestand dat in het Gambas programma-pakket zit (directory)
Test bv met
DIM sReturnValue AS String
SHELL "pwd" TO sReturnValue
DEBUG sReturnValue

Parameters meegeven naar Form

In het voorbeeld Database (voorbeelden inbegrepen in Gambas) wordt zo informatie doorgegeven naar een opgeroepen form:


' Gambas class file

PRIVATE $hConn AS Connection

'......

PUBLIC SUB btnRun_Click()

  DIM rData AS Result
  DIM hForm AS FRequest

  rData = $hConn.Exec(txtRequest.Text)
  hForm = NEW FRequest($hConn, rData)
  hForm.Show

CATCH

  Message.Error(DConv(Error.Text))

END

De regel
hForm = NEW FRequest($hConn, rData)
geeft een Connection en een Result object mee.

Die worden opgevangen in de _new method van de aangeroepen form:


' Gambas class file

PRIVATE $hConn AS Connection
PRIVATE $rData AS Result
'....

PUBLIC SUB _new(hConn AS Connection, rData AS Result)

  $hConn = hConn
  $rData = rData

' ...

END

en omgezet in eigen variabelen (de $hConn is twee keer PRIVATE).

Kan misschien ook/anders door een aparte ModCommon te maken en daarin PUBLIC te declareren.

Broncode verzameling (sourcecode printen)

Dit artikel is in 2008 gemaakt voor Gambas versie 2!
Versie 3 heeft een andere plaats voor zijn bestanden!

De broncode van de schermen zit in de bestanden met de uitgang .class, als je de naamgeving systematisch doet beginnend met F__ of Form___. De layout van het scherm is ook tekst en zit in dezelfde naam met uitgang .form. De code van modules heeft extentie .module en zit in M___.module

Broncode is pure tekst en kan in bestandbeheerder preview bekeken, of in Kate geopende worden.
Afdrukken van de broncode gaat niet vanuit gambas. Wel vanuit Kate (bv met regelnummering aan).
Of in OOo Writer, eventueel na het samenvoegen van de broncode van de verschillende forms en modules.

Verzamelen van de broncode in 1 bestand:
(class en modules)

(zie shell script hieronder) Continue reading

Listbox: bovenste item selecteren?

listboxIk probeerde het bovenste element van de listbox te selecteren bij het openen van het scherm en het vullen van de lijst, met:
lsbxInvoice.Current.Selected = ..
maar dat werkte niet zo …

Een listbox is een lijst met n elementen; bv 15 elementen.
De elementen worden genummerd en kunnen aangesproken worden met een index.
Het eerste element in de lijst heeft index nummer 0, dus het laatste n-1.
Vb element[0] .. element[14].

Een listbox wordt gevuld door de methode “Add”, eventueel aangevuld met de plaats waar de toevoeging moet gebeuren.
bv
lsbxInvoice.Add("001-aankoop")
lsbxInvoice.Add("001-aankoop", 0)

Na het vullen van de listbox kan het bovenste element geselecteerd worden door de index te zetten:

lsbxInvoice.Index = 0

Op deze manier kan bij het openen van het scherm een element van de lijst geselecteerd worden.

Selectie uit een rolluiklijst (combobox)

ComboBox Events … Een rolluiklijst of dropdownlist heet in Gambas “combobox”.ComboBox
Het is namelijk een combinatie van 2 verschillende schermobjecten:

op de knop drukken laat het rolluik met mogelijkheden neer; het opent de lijst.

Helaas zijn hier nogal veel mogelijkheden ingebouwd, en is het niet altijd zo snel duidelijk wat ze wanneer doen.

ComboBox Events …Wat een combobox doet is bv afhankelijk van de “events” (klik rechts, “events”, zie afbeelding )

ReadOnly: TRUE
ComboBox Read Only
op “pijltje” openen: ok
_Activate: nvt
cmbx1.Popup() doet niets
_MouseDown() –
_Change: nvt
_LostFocus: –
_Click() ook bij “enter”
meeste akties hier
  ReadOnly: FALSE
ComboBox 1
op “pijltje” openen: ok
_Activate: opgeroepen bij “enter” vlgs DEBUG
cmbx1.Popup() Automatisch openen lijst – niet?
_MouseDown() : cmbx1.Popup() om ipv tekst met cursor lijst te krijgen
_Change: als de tekst wijzigt …
_LostFocus: controleer of waarde …
_Click()

Dus cmbx_change wordt niet geaktiveerd door het veranderen van de selectie in de combobox (bv scrollen van de waarden).
cmbx_change wordt alleen geaktiveerd in een “writeable” cmbx, waarin je op de plek van de selectie de tekst verandert. Ook als je een keuze maakt uit de waarden van de rolluiklijst wordt dat als een verandering van die tekst beschouwd en wordt _change uitgevoerd. (waardoor het lijkt op de reaktie van _click bij een readonly combobox)

Project source download en run

Ontwikkeling in Gambas op verschillende computers, en het project heen en weer kopieren:

  • – overbodige Form files verwijderen
  • – opletten met “deel compilatie” *

* (ik weet niet waardoor het veroorzaakt wordt)

Eerste computer:
Project dat uit verschillende forms, modules en classes bestaat. Make source package. Upload source.tar.gz.

Andere computer:
download source.tar.gz
uitpakken.
Run: niet alle vensters lijken helemaal mee te zijn met de development versie van Eerste.
Compile all

Opgelost met: Project, Compile All.
Uit menu of dubbele groene pijl (ze schermafbeelding)

(Gekozen tussen “Compile all”, Project, “refresh” en Tools, “update all forms”)

Shell script draaien vanuit Gambas

Uit de mailing list begreep ik dat het mogelijk is een shell script te laten draaien vanuit Gambas:
( het voorbeeld gaat uit van een script in de project map)

DIM sTempScript as String
'
sTempScript = Temp$
'
COPY "update.sh" TO sTempscript
'
SHELL sTempScript WAIT

Als het project in een andere subfolder staat is het :

COPY "subfolder/update.sh" TO sTempscript

Voorbeeld van mysql gebruik in Gambas

Deze blog post geeft een volledig uitgewerkt voorbeeld, met code, data-beschrijving, en scherm:
How to program Gambas with MySQL in Ubuntu

De installatie is gericht op Ubuntu, maar het voorbeeld is natuurlijk voor alle Gambas gebruikers geldig.

Er wordt teruggegrepen naar een bestaande artikel van 2003 (Gambas versie 1), hier als zip-file die een pdf bevat:
http://www.ilmukomputer.com/wp-content/uploads/2007/02/tamrin-gambasdanmysql.zip

en er wordt verwezen naar een inleiding hier (Maleisische site, ook Ubuntu gericht):
Gambas : Visual Basic untuk linux dan tutorial penggunaanya