Gambas 2 en 3 op openSUSE 12.1

En dit is een derde installatie van Gambas op openSUSE 12.1, die vlekkeloos vlot verloopt.
(todo: na deze en deze)

Gestart van een installatie van openSUSE vanaf CD-rom met een image van 12.1 32-bit, download afkomstig van de openSUSE website. Na volledige installatie en alle updates op zoek naar Gambas; we weten van vroeger dat gambas meestal in de community repositories beschikbaar is bij de “Education” packages:

  • Software Repositories: Community “Education”
    URL: http://download.opensuse.org/repositories/Education/openSUSE_12.1/
  • Daarna in Software Management: Zoek “gambas”:
    Zowel versie 2 als versie 3 zijn beschikbaar.
    Zowel de individuele paketten als het geheel ().
    Als je bv gambas3-IDE selecteert, worden alle gambas3 onderdelen mee-geselecteerd; nadien ook nog heel wat afhankelijkheden, zeker als je nog geen programmeertools of omgeving geïnstalleerd had staan. Versie: Gambas 3.3.2
    Voor Gambas2 worden heel wat (oude) KDE3 onderdelen geïnstalleerd. Versie: 2.24

Een melding op het scherm die zonder klikken verdwijnt

In het hoofdscherm van een programma, moet na het drukken van een knop een venster getoond worden met gegegevens uit een databank.

FMain is het hoofdprogramma,
btGetData de knop om de gegevens te vragen.
FDataRecords is het nadien te tonen venster.

Het ophalen van die gegevens gebeurt in FDatarecords en duurt even, waardoor het venster niet onmiddellijk verschijnt. De gebruiker zou in de verleiding kunnen komen nog eens op de ophaal-knop te drukken omdat er “niets gebeurt”.

Ik wil een venster tonen met een melding; bv:

Message.Info("Gegevens worden gelezen en geïnterpreteerd.\n Druk om verder te gaan en wacht tot venster verschijnt ....")

Het nadeel is dat de gebruiker dat venster moet wegklikken. Ik wil een venster dat vanzelf verdwijnt, bv door het maken van een nieuw venster met een nieuwgemaakte tekst:

 
PUBLIC SUB btGetData_Click()
'
  DIM hMessage AS Window
  DIM hText AS TextLabel
  ' de knop even buiten gebruik stellen
  btGetData.Enabled = FALSE
  ' berichtvenster ergens in het midden van FMain (parent)
  hMessage = NEW Window(ME)
  WITH hMessage
    .Width = 600
    .Height = 100
    .X = (.Parent.Width - .Width) / 2
    .Y = (.Parent.Height - .Height) / 2
    .Visible = TRUE
    .Border = .Fixed
    .Picture = Picture.Load("Patroon.png")
  END WITH 
  ' tekst die in het venster komt, met afmetingen in verhouding tot berichtvenster
  hText = NEW TextLabel(hMessage)
  WITH hText
    .Alignment = Align.Left
    .Width = hMessage.Width - 20 - 20
    .y = (hMessage.Height - 20) / 2
    .x = 20
    .Font.Size = 13
    .Alignment = Align.Center
    .Text = ("Retrieving the information from the database - wait ...")
  END WITH 
  hMessage.Show()
  ' bericht even tijd geven om op te komen alvorens aan FDatarecords te beginnen
  WAIT 0.001
  FDataRecords.Show()
  ' bericht sluiten en knop terug vrijgeven
  hMessage.Close()
  btGetData.Enabled = TRUE
END

Je kan ook nadien pas het venster een plaats geven:
hMessage.Move(300, 300)

Een beginners-gids voor Gambas, aangepast aan versie 3

Beginners guide to Gambas
Hoe eenvoudig kan het zijn:
* beginnersguidetogambas.com
Een Engelstalig werk, ook vroeger hier al vermeld, oorsprong VS.

Het was het eerste en enige werk dat in de begindagen van Gambas 1 en 2 te vinden was, en onmisbaar voor elke beginner.

Het mooie is dat deze uitgave bijgewerkt is tot versie 3 van Gambas.

Er zijn nog een paar extra’s:

  • Gambas3_Examples_not_edited
  • BGG_Projects_by_Chapter
  • GambasFormControlsReference (OpenDocument Sheet) zie hieronder:

    This table shows controls that we typically place on Gambas forms. They are valid for Gambas3 and Qt4 or GTK+, and most of them are also valid for

    Een overzicht van de controls, niet mooi maar wel handig. Engelstalig. Een kleine uitsnede:

Het lelijke op de site is de flash-box waar de downloads in zitten, maar dus:

http://beginnersguidetogambas.com/

Gevonden dankzij een tip van Jon Nicholson

Oude grap: Gnu Visual Basic

Ik stootte toevallig op een oude 1-april grap, waarin iemand Richard Stallman het uitbrengen van een Visual Basic cloon laat aankondigen: Gnu Visual Basic. Ik kan niet afleiden uit de brongegevens van wanneer deze grap dateert, maar waarschijnlijk van voor Gambas enige bekendheid had. Als je niet beter wist zou je zelfs denken dat het over Gambas gaat (waarom begint het met een G? Gnu’s Alternative Means BASic? – Sorry Minisini, but you never really explained where the G A M came from – or were you really bitten by a shrimp?)

Het zou oorspronkelijk gepubliceerd zijn op freshmeat (dat ondertussen freecode heet). Momenteel is het nog na te lezen op deze site: www.shlomifish.org/humour/GNU-Visual-Basic
Om het artikel geloofwaardig te maken werd zelfs een website gemaakt over Gnu Visual Basic, maar het e-mail adres daarop spreekt boekdelen:
owner-gnuvb@april.org

Naar die site moet je niet op zoek gaan want die staat nu vol opdringerige reklame, kwestie van nog een beetje van de URL-bekendheid te profiteren zeker.

Kijk dus liever naar het origineel: gambas (op sourceforge)

Probeer niet te debuggen (Don’t TRY to DEBUG)

Tijdens het werken aan een project kan je snel “DEBUG” code tussenvoegen om feedback of een resultaat te kunnen volgen in de commandolijn onderaan…   Working on code, I encoutered an interesting problem using DEBUG …

DEBUG "test"
toont “test” in het zwarte venster, maar evengoed kan je een variabele laten zien:
DEBUG sSqlStatement
of nog iets duidelijker voor jezelf:
DEBUG "SQL statement is:" & sSqlStatement

Een andere techniek is het gebruik van TRY (code) / IF ERROR (code).

Mijn fout was de combinatie van de twee:

TRY DEBUG resultOfProcedure()
IF ERROR
(code)
ELSE
(code)
ENDIF

In de IDE werk dat perfect, maar het probleem steekt de kop op als je het project compileert; de DEBUG code wordt niet meer uitgevoerd (tenzij je compileert met behoud van DEBUG code), en de applicatie crasht.

Het behouden van DEBUG code kan je aanzetten in de IDE bij het compileren naar een uitvoerbaar programma:

Menu: Project, Make, Executable (ctrl-alt-m)

Open daar onderaan > Options en kies “Keep debugging information in executable”

Door dit verschil kon ik de fout opsporen: door de TRY DEBUG combinaties te vervangen door TRY PRINT werkte de uitvoerbare versie wel na “make executable”.

English version:(Don’t TRY to DEBUG)



Problem using DEBUG

If you code:
DEBUG "test"
it shows “test” in the black window underneath the Gambas IDE, but of course it is more interesting to show the content of a variable
DEBUG sSqlStatement
maybe with some explanation on the same line (in case the variable is empty):
DEBUG "SQL statement is:" & sSqlStatement

Another thing is the use of TRY (code) / IF ERROR (code).

My error was the combination of both:

TRY DEBUG resultOfProcedure()
IF ERROR
(code)
ELSE
(code)
ENDIF

In the IDE it does what you want, but the problem pops up if you run the compiled project.
The DEBUG code is not included any more* and your program crashes.
* Except if you compile with option to keep debug info.

In the IDE, you find the option to keep the DEBUG code here:

Menu: Project, Make, Executable (ctrl-alt-m)

Open > Options and check

“Keep debugging information in executable”.

If you run the program afterwards, the “TRY-DEBUG” crash will not happen. If you replace TRY DEBUG by TRY PRINT, the crash will not happen any more in the compiled program.
Problem identified!

Commandolijn, SHELL: Distributie en versie opvragen

Een commandolijnprogramma kan je vanuit Gambas uitvoeren met SHELL of EXEC.

bv:

EXEC [ "ls", "-lF"]

Vanaf er “wildcards” in komen, als een ‘*’ om een reeks niet op voorhand gedefinieerde files aan te duiden, moet je SHELL gebruiken.

bv:

SHELL "ls /etc/*release"

Je kan in de Gambas IDE in het console venster onderaan de resultaten zien.

Je kan de uitvoer naar een variabele binnen Gambas sturen door de lijn te eindigen met

TO sVariabele

Klein voorbeeldje:

Maak een nieuw project “Command line application”

plak in MMain:

' Gambas module file

PUBLIC sParameter AS String
PUBLIC sCommand AS String
PUBLIC sAnswer AS String

PUBLIC sLine1 AS String
PUBLIC sLine2 AS String


PUBLIC SUB Main()

  sCommand = "ls /etc/*release"
  
  SHELL sCommand TO sAnswer
  
  DEBUG "Answer was: >" & Trim$(sAnswer) & "<"
  
  sAnswer = Trim$(sAnswer)
  
  sCommand = "cat " & sAnswer
  
  SHELL sCommand TO sAnswer
  
  DEBUG "Answer was: >" & Trim$(sAnswer) & "<"
  
  sLine1 = Left$(sAnswer, String.InStr(sAnswer, gb.NewLine))
  
  DEBUG "sLine1 is: " & sLine1
  
END

Hier kan je code uittesten die je elders in een grotere applicatie inbouwt; sParameter en sLine2 dienden daarvoor.

Printen uit Gambas: tekst, html of echt.

Eenvoudige tekst, html, of ingebouwd printen?

  1. Voor uitvoer kan je gemakkelijk een txt bestand maken vanuit gambas, dat je dan in eender welk programma kan openen en printen (bv Kate, …).
  2. Een andere mogelijkheid, waarmee je veel kanten uit kan is .html files maken vanuit gambas: die kunnen zowel bekeken worden met de browser, als van daaruit geprint. Als ze op een bereikbare plaats (gedeelde map of webserver) staan, zijn ze gemakkelijk te delen. (zie ook “html rapport weergeven of printen“)
  3. Je kan ook printen vanuit Gambas, dan moet je echt alles doen wat erbij komt; pagina beschrijven enz.

De online documentatie vermeldt onder Gambas versie 2.0 de uitleg van 3.0.

Gambas 2.21 bevat in ieder geval een “voorbeeld” toepassing: “Printing”, dat al bestaat sinds 2006.
Die bevat de componenten:

  • gb
  • gb.qt (bevat Draw, gebruikt voor sturen van grafische informatie naar het Printer object)
  • gb.qt.ext (bevat Printer)

Nota:
Deze componenten gaan niet samen met de algemene gb.gui component.
Wel kan je voor de gb.gtk en gb.gtk.ext kiezen, vermoedelijk verschaffen ze ongeveer dezelfde functionaliteit met licht anders uitzicht (KDE = Qt, Gnome = GTK).

In Gambas3 bestaat een Printer (gb.qt4) object.

Voor Gambas2: gebruik het “Printer” object, dat ondermeer volgende eigenschappen heeft:

  • Orientation (Portrait, Landscape)
  • Size “A4”
  • Copies (getal)
  • ColorMode (Black, Color)
  • Resolution (bv 600)

bv: Printer.Orientation=Printer.Landscape

Opbouwen van print in 4 stappen:

  1. Printer.Setup()
    Oproepen van print setup : geeft een standaard venster “Setup Printer” met de printerkeuze (als er meer printers zijn), en andere instellingen als “Printer Settings”, “opties”, papierformaatkeuze en aantal prints.
    Printer.Setup() geeft een waarde terug naargelang knop “OK” (FALSE) of “Cancel” (TRUE) gedrukt wordt.
    Aangezien “Cancel” TRUE geeft kan je een test doen met:

    IF NOT Printer.Setup()
    '  print commands
    ELSE
    '  Message.Error("print setup canceled")
    ENDIF
    

    Het aanroepen van Printer.Setup() is niet verplicht, maar wel nuttig voor de gebruiker.

  2. *1)
    Draw.Begin(Printer)

    vanaf hier begint het printen
     
  3. Draw.Text((“Voorbeeldtekst”), iStartX, iStartY)
    Draw.Rect(iStartX, iStartY, iBreedte, iHoogte)

    Zet tekst of teken vormen, bv: Teken een rechthoek op locatie … met afmetingen …

    Draw.Rect(800, 800, 80, 40) ‘ zet bovenaan links een klein rechthoekje op papier.
    Hoewel 800, 800 doet vermoeden dat het evenver van de boven als van de zijkant staat is dat niet het geval!

  4. Draw.End
    *2)

    Tot hier loopt het printen;

* Opmerking: “Application.Busy”

  1. INC Application.Busy
    wordt door de voorbeeldprogramma’s verhoogd net voor Draw.Begin
  2. DEC Application.Busy
    Application.Busy wordt door de voorbeeldprogramma’s verlaagd net na Draw.End
  3. Tekst wordt geprint op plaats x, y met:
    Draw.Text(“Deze tekst wordt afgedrukt”, x, y)

    Een paar andere eigenschappen kunnen ingesteld worden met/als:

          Printer.Orientation = Printer.Landscape
          Printer.Size = "A4"
          Draw.Font.Size = 18
          Draw.Font.Name = "Arial"
          Draw.Font.Underline = TRUE
          Draw.Font.Bold = TRUE
    

    en dat kan voor het aanroepen van Printer.Setup() gebeuren; je zal de instelling daar weergegeven zien, bv als je Printer.Landscape hebt ingesteld en nadien Printer.Setup() aanroept, staat “Paper Format” op “Landscape” in de drop-down box in het “Setup Printer” venster.

    Waarschijnlijk wil je een aantal (public of private) variabelen declareren, als:

    ' Gambas module file
    PUBLIC iFirstColStart AS Integer = 120
    PUBLIC iSecondColStart AS Integer = 2000
    PUBLIC iThirdColStart AS Integer = 5500
    PUBLIC iCurRow AS Integer = 800
    '
    PUBLIC iRepeatColStart AS Integer = iSecondColStart
    PUBLIC iDimensionColStart AS Integer = 3000
    PUBLIC iColorColStart AS Integer = 3500
    PUBLIC iNumberColStart AS Integer = 4000
    PUBLIC iDeliveredColStart AS Integer = 4500
    '
    PUBLIC iFontSizeMainData AS Integer = 28
    PUBLIC iFontSizeMidData AS Integer = 24
    PUBLIC iFontSizeDataTitle AS Integer = 14
    PUBLIC iFontSizeSmallData AS Integer = 10
    PUBLIC iFontTinyData AS Integer = 7
    PUBLIC sFontMainData AS String = "Arial"
    '
    PUBLIC fborder AS Float
    PUBLIC fTextHeight AS Float
    PUBLIC fTop AS Float
    

    Om te vermijden dat teksten door elkaar lopen in de print kan je de data wat inkorten, eventueel proefondervindelijk, bv:

    PUBLIC iMaxCusLen AS Integer = 12
    PUBLIC iMaxOrdNameLen AS Integer = 20
    

    Hier een stukje code waarin dat gebruikt wordt:

      IF NOT Printer.Setup()
      
          ' some printer settings
          Printer.Size = "A4"
          Printer.Orientation = Printer.Landscape
          ' why this?
          INC Application.Busy
           ' Draw printer page
          Draw.Begin(Printer)
          
          border = Printer.Resolution
    
          Draw.Rect(100, 100, 10, 10) ' just to fix the corner
          
          ' Draw.Ellipse(3000, 3000, 1200, 190)
          
          iCurRow = 300
          
          Draw.Text("Klant", iFirstColStart, iCurRow)
          Draw.Text("Ordernaam", iSecondColStart, iCurRow)
          Draw.Text("Ordernr", iThirdColStart, iCurRow)
          
          iCurRow = 500
    
    '      Draw.Rect(iFirstColStart, iCurRow, 2200, 300)
          
          Draw.Font.Size = iFontSizeMainData
          Draw.Font.Name = sFontMainData
          Draw.Font.Bold = TRUE
                
          
          Draw.Text(thisOrder.ShortCusName(iMaxCusLen), iFirstColStart, iCurRow, 1200)
          
          Draw.Text(thisOrder.ShortOrdName(iMaxOrdNameLen), iSecondColStart, iCurRow)
          
          Draw.Rect(iThirdColStart - 100, iCurRow, 1200 - 100, 280)
          Draw.Text(thisOrder.sOrdCode, iThirdColStart, iCurRow)
    
    ' ... enz.
    
          Draw.End
          
          DEC Application.Busy
      ELSE 
        Message.Error("Printing was canceled")
      ENDIF 
    

    Meer pagina’s printen?

    PUBLIC SUB GoNextPage()
      Printer.NewPage()
      INC iPageNumber
      iCurRow = iRowStart
    END
    

Versie van Gambas vanuit programma opvragen

De versie van je eigen programma kan je in een tekstvariabele steken met:

sMijnVersie = Application.version

Maar als je daarnaast de versie van Gambas zelf nodig hebt?
Binnen Gambas is er geen commando om dat op te vragen.

In de IDE is die natuurlijk zichtbaar in het menu: ? , About Gambas (bv: 2.21).

Maar als je de gambas versie wil weergeven vanuit je draaiende gambas programma?

Meestal zal je dan de runtime bedoelen; die heet gbx (van gambas execute). In gambas 2 is dat gbx2, in gambas 3 vermoedelijk gbx3.

In je besturingssysteem kan je meestal de versie van een programma opvragen met
programmanaam --version
Wat ook geldt voor Gambas:

gbx2 –version
2.21.0

gba2 –version
2.21.0

gbc2 –version
2.21.0

gbi2 –version
2.21.0

gbr2 –version
ERROR: #35: Cannot open file ‘–version’: No such file or directory

Zie ook: archiver, compiler, informer.

Linux command prompt is bruikbaar vanuit Gambas:

EXEC ["gbx2", "--version"] TO sRuntimeVersie

Fout bij starten: FMain.?.0 – starten vanuit MMain

Een applicatie die op zich wel werkt, start “soms” niet op, maar geeft volgende foutmelding:

Error at program start

Fout bij start FMain

This application has raised an unexpected
error and must abort.

[13] Null object.
FMain.?.0

Na enige tijd wordt duidelijk dat ik ze wel kan draaien vanuit de IDE, waar ik dus het project open en “run” kies.
Op een ander toestel waar de applicatie gecompileerd is en gestart wordt van een icoon op de desktop, treedt de bewuste fout steeds op. Het is nochtans identiek dezelfde source, met misschien een miniem verschil in versies Linux/Kde/Gambas IDE.

Als ik het fenomeen terugzie bij een andere applicatie lijkt er een verband te zijn: programma’s die ik start vanuit de gewone, standaard voorezien FMain werken wel na compilatie. De applicatie die ik laat opstarten vanuit een module “MMain” geeft de foutmelding – niet vanuit de IDE dus, maar wel als gecompileerde versie die gestart wordt met een klik op het icoon naar de “programmanaam.gambas” file.

Gambas FMain MMain

Gambas FMain MMain


In MMain worden een aantal initialisaties gedaan, alsook de taal-check. Deze laatste zorgt ervoor dat vanaf het eerste “scherm” (of de eerste Form) de gelezen voorkeur-taalinstelling aktief is. MMain eindigt met de oproep van FMain, van waaruit dan verder gewerkt wordt.

De oorzaak blijkt een bug te zijn: in de MMain code wordt FMain fout aangeroepen:
FMain.Show in plaats van FMain.Show(). De IDE lijkt daar niet over te struikelen, maar -eens gecompileerd- de runtime dus wel.

upd 22/03/2012: Ik ben niet helemaal zeker van deze analyse, ik meen toch nog een ander voorbeeld te zijn tegengekomen waar de Show() correct was. Misschien is het een “combinatie van problemen” ?

Update:
Een interessant verschil blijkt te zitten in het behouden van de debug informatie bij het compileren. Als dat “aan” staat crasht de applicatie niet als je ze start vanop de link op de desktop!
“Make executable”, “options”, “Keep debugging information in executable”.
(Oorzaak van de fout: zie “Don’t TRY to DEBUG“)

Gambas 2 en Gambas 3 op OpenSUSE 12.1

Gambas 2 uit gbvalor
Dit is een andere (*) installatie van Gambas 2 en 3 op openSUSE 12.1 en ze verliep vlekkeloos:
– openSUSE 12.1 van DVD geïnstalleerd.
– software bijgeïnstalleerd: lamp server enz.
– community repositories laten scannen, en .
– repository bijgeïnstalleerd: Google zoek op “gbvalor”, waarvan ik weet dat het de gambas repository is die ik meestal gebruik.
– in Yast, repositories, nieuwe, geef URL, de URL ingeplakt; die wordt gecheckt en aanvaard.
– software management, zoek “gambas”; de hele reeks gambas componenten is beschikbaar.
– Kies Gambas2 IDE, bevestig alles.
– Daarna is het menu-item “Development” bijgekomen (in de “classic” menu-style), met daarin Gambas2; start perfect.
– Nadien wordt het pakket vermeld als behorende tot “Development/Tools/IDE” en als leverancier “openSUSE-Education”.

Als je view op Repositories zet, vind je zowel Gambas 2 als 3 terug onder openSUSE BuildService – Education.

Hetzelfde voor Gambas3:
– Yast, software management, zoek “Gambas”
– Selecteer “Gambas 3 IDE”, bevestig.
– Gambas 3 is daarna opgenomen in het menu onder “Developement”, en start perfect.
– Nadien bij “Package Group: Development/Tools/IDE”, vendor “openSUSE-Education”

Bij Software, view “Pattern” is gambas3 IDE terug te vinden onder “Youth Education Desktop software”, gambas2 vind ik niet terug.

(*)
Op een eerdere openSUSE 12.1 installatie kreeg ik Gambas3 oorspronkelijk niet vlot geïnstalleerd, maar dat was misschien niet representatief…