Gambas user mailing list, bug list

Er is onlangs iets gebeurd met de gambas user mailing list:

https://sourceforge.net/p/gambas/mailman/gambas-user/?viewmonth=201710

Terwijl er meestal zo’n 400 berichten per maand zijn, is dat aantal in oktober plots teruggevallen tot 85.

In een van de posts lees je :

Please stop using the old mailing-list, and use the new one instead.

Er is ook een link te vinden naar de “nieuwe” mailinglist:

http://lists.gambas-basic.org/listinfo/user

De bug list zit nu op:
http://gambaswiki.org/bugtracker/

Posted in Gamblog | Comments Off on Gambas user mailing list, bug list

Gambas 3 op Sparky 5.0 (met omweg)

Sparky Linux 5.0 (ondertussen is ook 5.1 uit) heeft Gambas3 niet in zijn standaard software-aanbod zitten (via de desktop met softwarebeheer gezocht); evenmin Gambas2.
Sparky is een Debian-gebaseerde distributie (5.1: Debian Testing Buster), dus kan je proberen met apt-get:

apt-get install gambas3
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package gambas3 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
apt-get install gambas2
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package gambas2

Ik probeerde nog:

Je zal dus een andere bron moeten zoeken.
De uitleg voor Debian: http://gambaswiki.org/wiki/install/debian
In debian is het blijkbaar standaard wel beschikbaar.

Een ander debian-derivaat?
De uitleg voor Ubuntu: http://gambaswiki.org/wiki/install/ubuntu

$ sudo add-apt-repository ppa:gambas-team/gambas3

geeft:
add-apt-repository ppa:gambas-team/gambas3
bash: add-apt-repository: command not found

Ik las ergens:
The add-apt-repository command is part of the software-properties-common package
dus ik probeerde:

apt-get install software-properties-common

Maar ook dat gaf me geen toegang tot gambas3:

sudo add-apt-repository ppa:gambas-team/gambas-daily
Traceback (most recent call last):
File “/usr/bin/add-apt-repository”, line 95, in
sp = SoftwareProperties(options=options)
File “/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py”, line 109, in __init__
self.reload_sourceslist()
File “/usr/lib/python3/dist-packages/softwareproperties/SoftwareProperties.py”, line 599, in reload_sourceslist
self.distro.get_sources(self.sourceslist)
File “/usr/lib/python3/dist-packages/aptsources/distro.py”, line 93, in get_sources
(self.id, self.codename))
aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Sparky/Nibiru

Ik heb Gambas dus niet aan de praat gekregen op deze Sparky 5

Een laatste poging:
(ik weet niet hoever je mag/kan gaan in het toevoegen van repo’s in debian)

$ sudo mcedit /etc/apt/sources.list

plak achteraan:
deb http://ftp.nl.debian.org/debian/ jessie main
deb-src http://ftp.nl.debian.org/debian/ jessie main

bewaar, sluit. Repo informatie terug inlezen en opnieuw proberen:

$ sudo apt-get update
$ sudo apt-get install gambas-ide

(die ide erachter is maar een probeersel, om niet enkel de runtime/compiler te krijgen maar ineens de hele programmeeromgeving.)

Daarna staat er netjes in het menu “Programming”: Gambas3.
Geinstalleerd is gambas 3.5.4.

Posted in Gambas2, Gambas3, installatie | Comments Off on Gambas 3 op Sparky 5.0 (met omweg)

Rapportgenerator 2 : Rapport met velden uit een databank

(vervolg van Gambas3 Rapportgenerator 2 basis)

Ik maak een eenvoudig rapport met drie kolommen gegevens; de lijnen zijn data uit een databank, de kolommen velden.
De datalijnen worden onder elkaar herhaald, en lopen over meer dan één blad.

Rapport layout

Aktiveer de module gb.report2 in Project, Properties, Components.

Maak een nieuw Rapport aan bij Sources, (rechtsklik) New, Report.

Teken op het scherm een titel met Report, ReportLabel, en vul de Titel in bij de eigenschap “Text”

Teken op het scherm een vertikaal kader met Container, ReportVBox; deze mag de overblijvende bladspiegel vullen.
Zet de eigenschap om de marge onderaan de pagina vrij te laten, bv: Margin Bottom: 16mm

Teken in die ReportVBox bovenaan een ReportHBox, over de hele breedte van de ReportVBox.
(alle eigenschappen op False, behalve Visible: True; marges en spacing naar wens)

Teken in die ReportHBox drie ReportLabels naast elkaar: ReportLabelColumn1, ..ReportLabelColumn2, ReportLabelColumn
(je kan ertussen bv een ReportTextLabel zetten met een scheidingsteken als – of ; )

Deze ReportLabels zullen in code gevuld worden met de inhoud van velden uit de databank.

Rapport code

Declareer een databankverbinding en een resultset in de Report1.Class:

  Private hConData As Connection
  Private hres As Result

Initialiseer; je maakt een procedure waarin je een verbinding maakt naar je databank:

Eenvoudige uitvoering:

Public Sub initDb()
  '
  With hConData
    .User="databank-gebruiker"
    .Password="mijn-wachtwoord"
    .Host="localhost" ' of hostnaam of ip adres
    .Type="mysql" ' in mijn geval
  End With
  hConData.Open()
  hres = hConData.Exec("SELECT * FROM test")
End

Voor elk data element dat je gemaakt hebt, maak je een _Data methode:

Public Sub ReportLabelColumn1_Data(Index As Integer)
  Dim s As String
  '
  hres.MoveTo(Index) ' dit moet je niet meer doen voor 2 en 3
  s = Str$(Index) & ") " & hres!id & " : " & hres!name ' overeenkomend met velden uit je tabel
  Last.Data = s
End

In Report_Open() roep je de databank initialisatie aan, en geef je de herhaling van de invulling tov de records aan:

  initDb()
ReportHBox1.DataCount = hres.Count

Shift-F5
De rest gebeurt wonderwel vanzelf bij het draaien van het rapport (je kan het rapport apart testen met “Shift-F5”; vgl Run=F5)

Valkuil

Opgelet als je een voorwaarde inbouwt bij het vullen van de _Data! Data van de vorige record blijft er in staan!
(Gambas 3.10.0)

Posted in Databank, Gambas3 | Comments Off on Rapportgenerator 2 : Rapport met velden uit een databank

Printen in Gambas3

Printen in Gambas3 gaat een beetje anders dan printen in Gambas2.

Voor Gambas3 vind je documentatie op gambaswiki.org/wiki/howto/print

Je gebruikt de Klasse “Printer” om je eigen object van te maken.
Zoals je ziet gebeurt het eigenlijke werk in de _Draw() event:

Public MyPrinter AS Printer
'
..
'
MyPrinter = New Printer As "MyPrinter"
'
MyPrinter.Orientation = Printer.Portrait
MyPrinter.Paper = Printer.A4
MyPrinter.FirstPage = 0
'
IF Not MyPrinter.Configure() ' toont een printkeuzebox aan gebruiker
  MyPrinter.Print() ' maakt alle stappen _Begin, (_Paginate), _Draw, _End
Endif
'
Public Sub MyPrinter_Begin()
  '  
  MyPrinter.Count = iPageCount
  '
End

' Public Sub MyPrinter_Paginate()
'   
'   
'   
' End

Public Sub MyPrinter_Draw()
  '
  Draw.FillColor = Color.Black
  Draw.Foreground = Color.Black
  Draw.Rect(20, 20, 100, 100)
  Draw.Text("ABCDEIFGQEFSDJFKLQ3", 100, 100)
  '
End

Public Sub MyPrinter_End()
  '
  Message.Info("Printed " & iPageCount & " page(s) ")
  '
End
'

ps: misschien komt het vierkantje in de hoek niet goed door, dan moet je de lijn wat dikker zetten, standaard staat ze nogal dun merk ik.

Let verder op de beschikbare bladspiegel; die is normaal kleiner dan het papierformaat (marges door beperking printer).

Printer.FullPage
De rechthoek om in te printen begint bij 0,0.
Je moet gebruikers de kans geven om te finetunen.

Afmetingen in mm opvragen kan met:
Printer.PaperWidth
Printer.PaperHeight

Paint.Scale laat je toe mm te gebruiken:

Paint.Scale(Paint.Width / MyPrinter.PaperWidth, Paint.Height / MyPrinter.PaperHeight)

Paint.Font.Size geeft de absolute lettergrootte in typografische punten, ong 0.353 mm.

Ps: merk op dat de printerresolutie verschilt van (meestal groter is dan) de schermresolutie.

Kijk ook naar Paint.Scale, Paint.Translate, Paint.Rotate, …

Posted in Gambas3 | Comments Off on Printen in Gambas3

Gambas3 beginners: icoon, menu

Een paar goede Gambas3 youtube filmpjes (in het Engels) over het maken van een
– menu in je applicatie https://www.youtube.com/watch?v=92duzqE59wU&t=204
– een icoon voor je applicatie: https://www.youtube.com/watch?v=lC5qR960vkM

Veel plezier..

Posted in Gambas3, Hoe - in Gambas | Comments Off on Gambas3 beginners: icoon, menu

Initialiseren gridview, tableview

Als ik een tabel op het scherm zet (in de vorm van gridview, tableview, ..) ga ik ze meestal eerst initialiseren.

Bij het openen van het scherm Form_Open() roep ik de initialisatieprocedures aan, wat overzichtelijk is:

Public Sub Form_Open()
'
initGridImport()
init...
'
End

En als je later in je toepassing nieuwe inhoud moet weergeven kan je de init terug aanroepen om zeker te zijn dat alle vorige weergave weg is en de tabel terug goedstaat.

Ook de naamgeving van de kolomtitels of hoofden kan je in die init doen, dan vind je ze ook gemakkelijk terug. Ik ben onlangs begonnen met de kolomtitels omgekeerd te vullen zodat
– het aantal kolommen en de invulling ervan op een overzichtelijke manier aftelt; een anomalie valt sneller op.
– het gemakkelijker is er één toe te voegen nadien; bovenaan waar je het aantal wijzigt heb je onmiddellijk eronder de nieuwe kolomtitel.

Public Sub initGridImport()
' shows imported record id's and values
grvwImported.Header = GridView.Horizontal
grvwImported.Columns.Count = 4
grvwImported.Columns[3].Text = "values"
grvwImported.Columns[2].Text = "col-id"
grvwImported.Columns[1].Text = "ref-id"
grvwImported.Columns[0].Text = "id"
'
End

En onmiddellijk de kolombreedte is handig omdat je daar weet over welke kolommen het gaat:

grvwImported.Columns[3].Text = "values"
grvwImported.Columns[3].Width = 120

Het instellen van het aantal rijen kan je er ook doen, maar dikwijls zal je dat herhalen bij het hervullen, wat niet moet voor bv de kolomtitels.
grvwImported.Rows.Count = 0
' etc...

Misschien maak je een resetGridImport() waar dat inkomt.

Posted in Gambas2, Gambas3 | Comments Off on Initialiseren gridview, tableview

Luie programmeurs: automatische naam voor button

Als je aan het programmeren bent en je snel wat knoppen in je vensters zet, is het belangrijk om die knoppen een relevante naam te geven.

Bv een nieuwe knop Button1 krijgt de naam buttonQuit of in mijn geval btQuit (ik kort de prefix voor het schermobjecttype af tot 2 of 4 lettertekens zoals bt, lsbx, cmbx, enz).

De knoppen hebben ook een functie naar de gebruiker, je moet ze dus ook een etiket geven voor de gebruiker, de Text property: Button1.Text of bij mij: btQuit.Text=”Quit”.

Zie je de luiheid al opkomen? In de nieuwere versies van Gambas (Gambas3) wordt de Button1.Name ook weergegeven op de knop als je zelf nog geen tekst erin zette; dit is bijzonder handig tijdens het programmeren.

Maar als die tekst eens ineens kan blijven staan als goede tekst? In mijn geval zou btQuit wel de opdruk “Quit” moeten krijgen, dus de twee letterjes prefix van het type moeten eraf. Right(Button1.Text, -2) als het ware.

Daar gaan we dus:

In een steeds in mijn projecten voorkomende schermfunctiesverzameling plant ik deze:

MForm

Public Sub doNameButtons(hMainObject As Object)
  '
  Dim hObject As Object
  Dim hButton As Button
  Dim iChildrenCount As Integer
  '
  Debug hMainObject.Name & " " & TypeOf(hMainObject)
  '
  Try iChildrenCount = hMainObject.Children.Count
  '
  If Not Error 
    '
    For Each hObject In hMainObject.Children
      '
      Try hButton = hObject
      '
      If Not Error
        If Left(hObject.Name, 2) = "bt" And hButton.Text = ""
          Debug "CHANGE TO " & Right(hObject.Name, -2)
          hButton.Text = Right(hObject.Name, -2)
        Else
          ' not named with naming convention of buttons, this is a way to let you exclude empty-text buttons from this auto-name 
          ' name not empty, so it stays as it is - and can be translated 
          Debug "NO CHANGE: " & hObject.Name
        Endif
      Else
        ' recursion
        Debug hObject.Name & " is no button; check for .children : "
        doNameButtons(hObject)
      Endif        
    Next
  Else
    Debug "Error hMainObject.Children.Count " & hMainObject.Name & " " & iChildrenCount
  Endif  
End
'

In mijn FMain (en alle andere schermen die ik snel in elkaar flikker) roep ik dat zo aan voor iedere container met buttons in (soms nog eens in een container – dus recursief):

FMain

Public Sub Form_Open()
'
  MForm.doNameButtons(HBox1)
' ...
End

Alle knoppen in de Form die al een opschrift hebben, houden die. De anderen krijgen één, afgeleid van de knopnaam.

Let op!
Dit is alleen handig tijdens het programmeren, als de knoppen nog van functie en naam veranderen enz.

Eens het project zo ver af is dat je het gaat vertalen zul je toch de Text properties van de knoppen moeten invullen, anders werkt het vertaalsysteem niet.

Check eerst of het een button is:

TypeOf(hObject) = TypeOf(hButton)

Dit is geen oplossing, omdat er niet zo’n fijn onderscheid wordt gemaakt tussen objecten in TypeOf; beiden zijn “16” (een constante voor gb.Object); ook een HBox of VBox behoort daartoe.

Ik vond geen andere methode dan het child object proberen toe te wijzen aan een button; bij fout is het geen button, anders wel.

Zelfs tussen buttons kan er een ander object staan zoals een leeg tekstveld om als “spacer” te gebruiken; tekst leeg maar expand=TRUE zodat het een knop aan de rechterkant naar rechts tot aan het einde van de container (bv HBox) duwt.

Hernoemen uitvoeren op button object met naam beginnend met “bt”, de anderen worden overgeslagen.

Recursie
Als het object geen button was, kan het altijd nog een container zijn die ook weer buttons bevat, dus wordt dat gecheckt en kan de hernoem-test opnieuw beginnen.
Daarom wordt de procedure zelf terug opgeroepen.

Ik vond ook geen mooie manier om te testen of het een container is, en als er geen children objecten zijn, crasht

For Each hObject In hMainObject.Children

Daarom test ik eerst of een Children.Count wel kan:

Try iChildrenCount += hMainObject.Children.Count

If Not Error

(het optellen heeft niet echt zin)

Upd 13092017: bug fix: crash bij ander object dan button en helemaal herwerkt.

Posted in Uncategorized | Comments Off on Luie programmeurs: automatische naam voor button

Vormgevingconventies doorheen app

Om een concistente applicatie te krijgen moet je overal dezelfde conventies toepassen.

bv: titels (grootte), foutmeldingen, kleuren bij invulvelden, …

Form Textlabel Title : font, size, color, em.

Field Textlabel Title: font, size, color, bgcolor, em.

Field content: font, size, bgcolor
– vaste tekst : zwart
– invulveld (niet invul/wijzigbaar) color dark gray, background light gray
– invulveld (vast): color black
– wijzigbaar: color blue,
– gewijzigd: color light blue (darkcyan)
– bewaard na wijziging: dark blue
– geweigerde invoer: red
– nog niet bewaard: orange
– voorbeelden, help: green

Het handigst is in MForm een aantal procedures te maken voor het instellen van eigenschappen van velden en die van overal te gebruiken.

Posted in Uncategorized | Comments Off on Vormgevingconventies doorheen app

Drie tabellen

Producten-kleurcombinaties: Tabel producten (id, name..), tabel kleurcombinaties (id, prd_id, kleur).
Deze beantwoordt niet aan de typische hiërarchie van bv factuurhoofd-factuurlijn, employee-employee-registrations, enz.

Omgevormd tot drie tabellen:
product (id, name, ..)
color (id, color, ..)
productcolor (prd_id, klr_id, meta ..)

Hoe de juiste SQL syntax vinden om de combinatie op te vragen?

SELECT * 
FROM color, product, productcolor AS pc 
WHERE color.id = pc.color_id AND pc.prd_id = product.id

MySQL gebruikt standaard de inner join.

ANSI syntax moet meer inzicht geven, uit een ander voorbeeld de vorm:

SELECT s.name as Student, c.name as Course 
FROM student s
    INNER JOIN bridge b ON s.id = b.sid
    INNER JOIN course c ON b.cid  = c.id 
ORDER BY s.name 

Wordt dan:

SELECT * 
FROM color
  INNER JOIN productcolor pc ON color.id=pc.color_id
  INNER JOIN product ON pc.prd_id = product.id
ORDER BY color.color
Posted in Databank | Comments Off on Drie tabellen

Rapportgenerator 2 basis

In Gambas3 is een rapportgenerator of “reportdesigner” beschikbaar, waarmee je snel een af te drukken rapport (één of meer blz) mee kan maken, en eerst in preview kan bekijken.

(zie ook “Rapportgenerator 2 : Rapport met velden uit een databank“)

De component
Menu project, properties, Components: gb.report2
(ik heb hier in mijn omstandigheden ook gb.form, gb.gui en gb.image aangevinkt staan)

Gevolg hiervan is dat je een extra menu-item krijgt bij het aanmaken van een nieuw “source” object naast Module, Class en Form. In de linkse kolom bij je project bestanden-overzicht klik je rechts (bv op sources), en je ziet onderaan nu een nieuw item “Report” met printericoon. Als je dat aanklikt krijg je een “New File” met te kiezen/in te vullen naam (standaard “Report1”).
Je krijgt dan een tab met Report1.report.

Rapport vullen
Je kan op de rapport-layout elementen zetten die je kiest onderaan uit een menu: bv ReportLabel, ReportTextLabel, ReportLine, ReportImage, ReportSVGImage, ReportDrawingArea, enz. Je kan ze vullen met inhoud (tekst, beeld), en de eigenschappen wijzigen zoals een rand eromheen, schaduw, achtergrondkleur, je kan afgeronde hoeken maken, enz.

Voor de plaatsing op het scherm moet je bij elk object zelf de eigenschap van marges invullen. Een object dat in het midden staat kan je laten uitdijen om het blad te vullen door de eigenschap “Expand” op TRUE te zetten; het duwt dan de acherliggende objecten naar beneden.

Run
Normaal heb je een klasse “FMain”, de Form die standaard gestart wordt; je kan daar in de broncode zetten:

Public Sub Form_Open()
  Report1.Preview()
End

Bekijken
Als je links op je Source “Report1” rechtslikt, kan je “run that class” kiezen, waarna je een voorbeeld krijgt van hoe het rapport eruitziet, zonder je hele programma te starten. Deze Report Preview laat nog toe zaken te kiezen als de printer waar het naartoe moet, de orientatie, formaat, enz.
Ook of het in grijswaarden gedrukt wordt of in kleur (Grayscale afvinken). En het aantal kopies. Om effectief iets te laten gebeuren als je op de onderste “Print” knop duwt, moet je ook het bereik (“Range”) op minstens 1 zetten.

Extra knop
Aangezien je tijdens het maken van zo’n print-layout waarschijnlijk dikwijls gaat kijken naar het voorbeeld, is het handig om de “run that class” onder een knop te hebben in de report designer. Dat kan; rechtsklik op de knoppenbalk van de reportdesigner en kies “Configure”; Je krijgt de “form toolbar configuration” en daar sleep je de “Run that class” knop naar de knoppenbalk; hij krijgt een “run” achtig icoon.

Bestand
In datzelfde preview scherm kan je ook bovenaan het tabblad veranderen van “Printer” naar “File”, waarmee de bestandsnaamkeuze zichtbaar wordt, en het bij “Print” als pdf bestand bewaard wordt.

Demo
Als je dit alles in sneltreinvaart wil zien demonstreren, kijk dan naar dit filmpje van Fabien Bodard: (muiscursor op de pauzeknop klaarhouden …)
https://www.youtube.com/watch?v=h1yUhcoErjs

Posted in Gambas3 | Comments Off on Rapportgenerator 2 basis