Bereik van variabelen als record id

Wanneer kies je in Gambas voor int, wanneer voor long?
Wanneer kies je in de databank voor een int(11), wanneer voor bigint(20)?

https://gambaswiki.org/wiki/lang/type

Kleinere:
Datatype Description Default value Size in memory
Boolean True or false. FALSE 1 byte
Byte 0...255 0 1 byte

Integer meer of minder:
Datatype Description Default value Size in memory
Short -32.768...+32.767 0 2 bytes
Integer -2.147.483.648...+2.147.483.647 0 4 bytes
Long -9.223.372.036.854.775.808...+9.223.372.036.854.775.807 0 8 bytes

Ik merk dat ik uit luiheid meestal “int” gebruik. Dikwijls is dat overkill, en is Short zeker genoeg. En als er geen negatieve getallen kunnen voorkomen (soms wordt een fout aangeduid door een negatief getal), en het maar over een klein getal gaat, dan is Byte zelfs genoeg.
Bij int is het vooral opletten met de grenzen als het bv record nummers woden; 2 miljoen records is niet zo veel.

MariaDB datatypes
MySQL datatypes, bv de integer data types :

Vereiste opslag en bereik van integer data types in MySQL

Type Opslag (Bytes) Minimum waarde Signed Minimum waarde Unsigned Maximum waarde Signed Maximum waarde Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

Zie ook de tabel voor het doen overeenkomen van een type in de programmeertaal naar de databank, db-type mapping:

https://gambaswiki.org/wiki/doc/db-type-mapping

Nieuw project: directory bestaat al

Gitlab project
Ik heb een nieuw project “nieuwproject” gemaakt op gitlab, leeg behalve de standaard aangemaakte README. Ik haal het af met git clone nieuwproject.

cd newproject
ls -A

.git  README.md

Ik open de Gambas3 IDE, en begin daar een nieuw programma met “New Project”, kies de map waar “nieuwproject” staat, geef als naam “newproject”:

The project directory already exists

Er is geen optie om de bestaande directory “newproject” te gebruiken in plaats van een nieuwe te laten maken door Gambas3.

Omgekeerd?
Ik verwijder de directory “newproject”.
Ik maak in Gambas3 “newproject” op die vorige locatie.

cd newproject
ls -A

.directory  .gitignore  .hidden  .icon.png  .lang  .lock  .project  .src

Dan ga ik in de hogere directory terug mijn git project afhalen met git clone:
git clone https://gitlab.com/groupname/newproject.git

fatal: destination path ‘newproject’ already exists and is not an empty directory.

Wat is de juiste manier?

Continue reading

Dataconnection vanuit lib of app?

Ik vraag me af of ik de verbinding met de databank vanuit de applicatie moet doen of vanuit de lib die de data-classes bevat.

Nodig:

1 project als lib (zie properties bij maken nieuw gambas project)
1 project als gewone gambas3 applicatie.

Ik gebruik ook:
gb.db (Database toegang) en “Settings” in project properties, componenten (voorzien in Gambas).
– bibliotheek “DataContext” in project properties, libraries (deze moet je zelf afhalen)

In de lib zitten
– de classes bv CEmployee beschrijft de employee (properties voor velden enz).
– de Module MEmplData: bevat procedures voor het aanmaken van records, opvragen vanuit de classe voor het laden van de variabelen in de properties, bewaren vanuit de classe van het “object/record”.
– de Module MEmpData bezit ook hConData AS Connection

– de applicatie gaat de lib.hCondata initialiseren met de toegangsgegevens van de databank met behulp van DataContext.makeConnection.
(gegevens die gelezen worden uit een settings file – dat gebeurt in de DataContext class CDataContext; je kan er context naar settings mee maken, aktieve context zetten wat ook bewaard wordt in settings, nieuwe settings file maken, lijst alle contexten in settings opvragen, enz)

– in de applicatie ga je gewoon de “current” datacontext gebruiken, en je kan “switchen” van context door de “current” aan te passen via DataContext, en te “herladen”, maw de connectie terug te maken.

Taalinstelling desktop: invloed op gambas programma

Een eigenaardig verschijnsel: een gambas3 applicatie werkt op sommige desktops goed, en op andere niet; opvragen van gegevens uit de databank gaat wel, maar bij het bewaren van wijzigingen treedt een fout op.
Allen zijn OpenSUSE/KDE/Plasma5. De versies van de gebruikte libraries moet ik nog controleren. Maar het enige verschil lijkt voorlopig de taalinstelling; op de Nederlandstalige desktops werkt de applicatie niet, op de Engelstalige wel.
Als ik op dezelfde computer waar het bij een [Be/nl] gebruiker niet werkt, een gebruiker aanmaak met als desktopinstelling Engelse als taal, werkt het daar wel.

Heeft de taalinstelling van een desktop invloed op het uitvoeren van Gambas programma’s?

Bv de manier hoe een datum wordt weergegeven/gelezen uit database/geschreven naar database..?

Soms zie ik bij het uitvoeren van een programma vanuit de IDE een melding in de console:

gbx3: warning: cannot switch to language 'en_BE.UTF-8': No such file or directory. Did you install the corresponding locale packages?

Deze treedt op bij een Engelstalig (US) geïnstalleere KDE desktop, met een programma waarbij de optie vertaling afstaat.

Het mysterieuze uitroepteken in library of bibliotheek beschrijving

Bij Project, Eigenschappen, Bibliotheken: selecteer een bibliotheek (of voeg één toe).

Eigenschappen onder bibliotheeknaam zijn:

– Locatie: /home/loginname/.locql/share/gambas3/lib/vendorname/libname:0.0.gambas
– Voorziet in: CContract, CEmp!, CReqProc, CReqState!, ...

Vanwaar die uitroeptekens achter de naam van sommige klasse/modules?

(in de Engelstalige versie is het Project, Properties, Libraries, provides:…)

Antwoord (van gambas mailing list)

  • ! betekent dat de klasse statische symbolen heeft (“An exclamation mark means that the class
    has static symbols.”)
  • ? betekent dat (ipv Export) “Export Optional” is gebruikt. (“There is also a question mark suffix for classes declared with “Export Optional”)

Concreet: als je in een klasse het volgende zet:

STATIC sStaticString AS String = "Statische variabele"
of
PUBLIC CONST cConstString AS String = "Constante"

.. krijg je dus dat uitroepteken achter de naam van de klasse.

ps
Library versie verandert niet
Als je uittest met twee gambas IDE’s naast elkaar open, met een waar je de library maakt, en een ander waarin je die gebruikt, moet je de omgeving van die laatste afsluiten en terug openen om de juiste library gegevens te zien in oudere Gambas v. 3.7.1.
Zoniet blijf je daar altijd het library versienummer zien van toen je de IDE opende in Project, Libraries (zelfs als je de library verwijdert en terug toevoegt, houdt ze oud nummer en Provides gegevens).
De programma’s die je in de IDE start gebruiken echter wel de ondertussen ge-update library!

Nieuw project in gambas, hulpmiddelen

(Zie ook de praktische nieuwe project checklist en bij het programmeren de domme fouten checklist)

Enkele hulpmiddelen bij het starten van een nieuw project:

Leeg project
– Gebruik een sjabloon of een modelproject om van te starten. Het standaard leeg project van Gambas zelf bevat niets meer dan een startprocedure (methode), maar zelf zal je merken dat je telkens hetzelfde soort dingen er standaard insteekt. Denk maar aan een menubalk met File, Edit, Help/About/Changes/Licentie.. enz. Je maakt je eigen standaard leeg project met die menu’s er allemaal in, en dan kan je iedere keer daarvan starten. Je zet dat best online zodat je er van overal aankan. Je past het ook aan met de kennis en ervaring die verder opdoet, zodat het leeg project je steeds meer werk bespaart. (Voorbeeld “Emptyproject”).

Instellingen
Vrij snel merk je dat je allerlei instellingen wil bijhouden, zoals adressen van servers waarmee je verbindt, instellingen op het scherm van de gebruiker enz. Daarvoor dient de “settings” module van Gambas. Maar zowel het uitlezen van de settings als het bewaren ervan moet je programmeren, en die kunnen niet beide tegelijk klaar zijn. Met een “Gambas settings tool” kan je een nieuw settings bestand maken voor je project, met een scherm om snel de sleutel/waarde combinaties in te geven, er waarden inzetten zodat je ze al kan uitlezen met code, controleren wat je programma er in geschreven heeft enz. (Voorbeeld “Gambas Settings Tool”)

Vormgeving
Om de vormgeving een beetje te stroomlijnen kan je een form “Layout.form” maken waarin alle kenmerken voorkomen, bv de voor- en achtergrondkleuren van je schermen, de eigenschappen van de tekst, enz. Er hoeft geen code in te zitten, maar je kan wel zien hoe het er uit ziet op het scherm. Je zet er van ieder object een voorbeeld van op een scherm, (wel public zetten) en je applicatie neemt telkens daar de kleur, font, enz. van bij het openen van een nieuw scherm. (Zoals in Main.form bv een tekst die je initialiseert in FMain met txbx.Foreground=FLayout.txbxInput.Foreground). Als je dan je Layout.form aanpast, is heel je applicatie aangepast!

Databank
Ook voor de databank-koppeling kan je je laten helpen.
– Instellingen: door een vaste manier van databankgegevens op te slaan in de settings, met de mogelijkheid om te schakelen tussen je ontwikkel-databank (op je laptop bv), een test-databank op een testserver, en je productie-databank voor het uiteindelijk gebruik.
– Ontwerp: bij het ontwerpen van de databank komen bepaalde velden in tabellen telkens voor, zoals de id, het bijhouden van de datum van wijziging van een record, en de gebruiker die het wijzigde, een opmerkingen veld, enz. Met een tool kan je snel een nieuwe tabel maken, waarbij de standaard velden al voorgesteld worden op het scherm en je maar moet aanvinken welke je wil, en er bovendien automatische een data-dictionary bijdrage wordt gemaakt met mogelijkheid tot voorbeeld data en uitleg over de velden. (Voorbeeld: “DbInfoCode”)
– Ontwikkeling: bij het omzetten van objecten naar de databank of omgekeerd (persistence), van record naar objecten heb je ook telkens wat standaard handelingen als bewaren en ophalen van de inhoud van het object, het omzetten van de velden naar de properties van het object. Een hulpprogramma kan de velden van de records lezen en er objecten met properties voor maken, met de bijhorende get/set procedures. (Voorbeeld: “DbInfoCode”)

Opkuis
Om af en toe je programma op te kuisen, bv allerlei variabelen die je ooit eens maakte maar nooit gebruikt, kan je ook een hulpprogramma gebruiken dat de code voor je leest en op zoek gaat naar wat weg mag enz. Voor Gambas2 gebruikte ik daarvoor “ProbableCause”, maar nu is veel daarvan al geïntegreerd in Gambas3.

Door deze hulpprogramma’s zelf te programmeren kan je ze steeds laten evolueren met je noden. Zet ze online en schrijf erover.

Domme fouten checklist

Af en toe loop ik vast en als ik na lang zoeken de fout vind blijkt dat bijna altijd een “domme fout” te zijn. Iets vanzelfsprekend waar ik over keek. Ik zou een kleine checklist moeten hebben om die stomme fouten er snel uit te halen.

Veel voorkomende fouten
Database struktuur is veranderd:

  • extra veld, of veld minder
  • veld mag NULL zijn of niet NULL zijn
  • Default value instelling (bv NULL ipv ”),
  • library niet (helemaal) mee veranderd (bouw test in library: als lib object kan schrijven/lezen, kan het nog moeilijk fout gaan…)
  • Aanroepen uit verkeerde module: bv een functie aanroepen met een verkeerde modulenaam ervoor ipv de interne, of gekopieerde brontekst waar nog een andere modulenaam instaat.
  • Library gecompileerd; juiste versie van de library? (neem op in lib: VERSION en applicatie: libraries.txt, en toon in About)
  • verkeerde veldnaam, vooral met dingen als id en/of employee_id, external key.
  • volgorde initialisatie variabelen (veranderd door nieuwe code?)
  • dubbel uitvoeren van code
  • index (startwaarde vanaf 0 of 1, eindwaarde tot n-1, …)
  • …(aan te vullen)

Component in Gambas2

Basis-uitleg:

  • hoe componenten in Gambas werken
  • hoe ze zelf te maken
  • hoe ze te installeren.

De originele documentatie over componenten vermeldt uitdrukkelijk dat alle “onderstaande tekst” voor Gambas3 is, dus ik doorloop het even in en voor Gambas2:

Componenten

De componenten die je in de Gambas IDE ziet (project, properties), zijn mee geïnstalleerd met de Gambas IDE. (Kijk in je Linux pakket manager om bij te installeren).

In bv OpenSUSE vind je ze na installatie in: /usr/lib64/gambas2/
Bv de gb.chart.component en gb.chart.gambas

De .component is een tekstbestand, en bevat voor gb.chart:

[Component]
Key=gb.chart
State=2
Authors=Fabien Bodard
Needs=Form
Requires=gb.form

en voor gb.settings:

[Component]
Key=gb.settings
Authors=Benoît Minisini

In de IDE zijn de componenten uit te kiezen bij de projecteigenschappen, en tonen bovenstaande zich als:

gb.chart
Chart drawing (Beta version)
Authors: Fabien Bodard
Requires: Graphical form management, gb.form.

en

gb.settings
Application settings managament
Authors: Benoit Minisini

Bij het gebruik van Settings in je broncode worden volgende methodes en eigenschappen zichtbaar in de editor:

De broncode, van bv Settings, vind je na het afhalen en uitpakken van de broncode:
gambas2-2.23.1/comp/src/gb.settings

Een uittreksel (… is overgeslagen code):

' Gambas class file
'
EXPORT
CREATE STATIC
'
CLASS Window
'
STATIC PROPERTY READ Path AS String
'
PRIVATE $sPath AS String
PRIVATE $sTitle AS String
PRIVATE $cSlot AS Collection
PRIVATE $bModify AS Boolean
'
PRIVATE SUB Load()
'  
  DIM hFile AS File
  DIM iLine AS Integer
  DIM sLine AS String
  DIM sSlot AS String
  DIM iPos AS Integer
'
  $cSlot = NEW Collection
  IF NOT Exist($sPath) THEN RETURN
' ...
PUBLIC SUB _new(OPTIONAL Path AS String, OPTIONAL Title AS String)
'
  DIM sDir AS String
  DIM sPath AS String
  DIM sElt AS String
'
  IF Left(Path) <> "/" THEN 
    IF NOT Path THEN
' ...
PUBLIC SUB _free()
'
  TRY ME.Save
'
END
'
PUBLIC SUB Save()
'
  DIM aKey AS NEW String[]
  DIM cSlot AS Collection
  DIM sKey AS String
  DIM hFile AS File
  DIM vVal AS Variant
'
  IF NOT $bModify THEN RETURN
' ....
PRIVATE FUNCTION GetSlot(sKey AS String) AS String
' ...
PUBLIC FUNCTION _get(Key AS String, OPTIONAL {Default} AS Variant) AS Variant
' ...
PUBLIC SUB _put(Value AS Variant, Key AS String)
' ...
PUBLIC SUB Clear(ParentKey AS String)
' ...
PUBLIC SUB Read(hObject AS Object, OPTIONAL sKey AS String, OPTIONAL vDefault AS Variant)
  '
  DIM sVal AS String
  DIM aVal AS String[]
  '
  IF Object.Is(hObject, "Window") THEN
    sKey = Object.Type(hObject) &/ sKey
    LoadWindow(hObject, sKey)
  ELSE
    IF NOT sKey THEN TRY sKey = hObject.Name
    sKey = GetTopLevel(hObject) &/ sKey
    'DEBUG sKey
    TRY hObject.Settings = ME[sKey, vDefault]
  ENDIF
  '
END
'
PUBLIC SUB Write(hObject AS Object, OPTIONAL sKey AS String)
  '
  IF Object.Is(hObject, "Window") THEN
    sKey = Object.Type(hObject) &/ sKey
    SaveWindow(hObject, sKey)
  ELSE 'IF Object.Is(hObject, "SidePanel") THEN
    IF NOT sKey THEN TRY sKey = hObject.Name
    sKey = GetTopLevel(hObject) &/ sKey
    'DEBUG sKey
    TRY ME[sKey] = hObject.Settings
  ENDIF
  '
END
'
STATIC PRIVATE FUNCTION Path_Read() AS String
  '
  DIM sPath AS String = Application.Env["XDG_CONFIG_HOME"]
  IF NOT sPath THEN sPath = System.User.Home &/ ".config"
  RETURN sPath &/ "gambas"
  '
END
'
STATIC PUBLIC FUNCTION Array(...) AS String[]
  '  
  DIM aVal AS NEW String[]
  DIM iInd AS Integer
  DIM sVal AS String
  DIM vVal AS Variant
  '
  FOR iInd = 0 TO Param.Max
    vVal = Param[iInd]
    IF IsBoolean(vVal) THEN 
      sVal = IIf(vVal, "1", "0")
    ELSE
      sVal = CStr(vVal)
    ENDIF
    aVal.Add(sVal)
  NEXT
  '
  RETURN aVal
  '
END
' 
PUBLIC SUB Reload()
  '
  Load
  '
END

Conclusies:

Classe begint met:
EXPORT
CREATE STATIC

De bruikbare, dwz van buitenaf zichtbare elementen zijn vet weergegeven in de broncode hierboven.

Het path is een eigenschap die van buitenaf (enkel) leesbaar moet zijn.

Dat wordt gerealiseerd met een interne variabele die in de (automatisch bestaande) functie _Read() wordt gebruikt om de externe alleen-lezen variabele af te schermen. Als gevolg komt die eigenlijk twee keer voor, waarbij je onderscheid moet kunnen maken tussen de namen, wat hier gedaan wordt door de private variabele als $sPath te definieren, en de externe gewoon als Path:

 
STATIC PROPERTY READ Path AS String

PRIVATE $sPath AS String
'
STATIC PRIVATE FUNCTION Path_Read() AS String
  '
  DIM sPath AS String = Application.Env["XDG_CONFIG_HOME"]
  IF NOT sPath THEN sPath = System.User.Home &/ ".config"
  RETURN sPath &/ "gambas"
  '
END

Allerlei procedures (groene bol) zonder of met (één of meer optionele) parameters:

PUBLIC SUB Save()
PUBLIC SUB Reload()
PUBLIC SUB Clear(ParentKey AS String)
PUBLIC SUB Write(hObject AS Object, OPTIONAL sKey AS String)
PUBLIC SUB Read(hObject AS Object, OPTIONAL sKey AS String, OPTIONAL vDefault AS Variant)

De array ziet er zo uit (groene kubus):

STATIC PUBLIC FUNCTION Array(...) AS String[]

Zelf Component maken

Zelf maak je in de IDE een nieuw project, of wijzigt* een bestaand via menu:

Project, Properties, Options

kruis aan:

Options, Component: Yes. (Advancement: Beta)

Dat voegt onmiddellijk de tabbladen “Provides” en “Requieres” toe:

Schermafbeelding project venster gambas

Component in Gambas2

* Wijzigen van een bestaand, niet als component gestart project naar “component” leverde me een crash op bij een klik in het tabblad “Provides” als daar nog niets aanwezig is.

Bij een nieuw project krijg je dan
Classes:

  • CContainer
  • CControl

En onder Data de Controls:

  • ccontainer.png
  • ccontrol.png

Class CContainer bevat:

' Gambas class file

EXPORT

INHERITS UserContainer

PUBLIC SUB _new()

END

En Class CControl bevat:

' Gambas class file

EXPORT

INHERITS UserControl

PUBLIC SUB _new()

  DIM hLabel AS Label
  
  hLabel = NEW Label(ME) AS "MyLabel"
  hLabel.Text = "Gambas!"
  hLabel.Font = Font["+4,Bold,Italic"]
  hLabel.Border = Border.Plain
  
END

PUBLIC SUB MyLabel_Enter()

  LAST.Text = "Gambas Almost Means BASIC!"

END

PUBLIC SUB MyLabel_Leave()

  LAST.Text = "Gambas!"

END

De IDE maakte deze bestanden aan, samen met 2 grafische bestanden, en ik veronderstel dat de code een soort voorbeeldcode is die je zelf kan aanpassen of weggooien als je ze niet nodig hebt.

Bij een bestaand project met classen die je algemeen wil hergebruiken: Begin van je project en pas aan zoals hierboven uitgelegd. Ter vergelijking kan je de broncode van Gambas2 gebruiken als voorbeeld.

In de broncode van je class zelf moet je volgens de documentatie met sleutelwoord “EXPORT” aangeven dat ze geëxporteerd moet worden.

Je kan er een gewoon source archive van maken (tar.gz) om te verspreiden naar de gebruikers.

Je kan als gebruiker het project “compileren”; met “make executable”. Daar krijg je een extra optie:

“Install in the user component directory”

Daardoor wordt de component bruikbaar vanuit je Gambas2 IDE, menu Project, Properties, Components.
Hij komt onderaan in de lijst van de componenten, onder de extra titel “User Components”. Geniaal eenvoudig!

De bestanden .gambas en .component worden geïnstalleerd(*) in
~/.local/lib/gambas2
waardoor ze bruikbaar worden in al de gebruiker’s gambas2 projecten.

* Opgelet!
Ze worden daar niet naartoe gekopieerd, maar er wordt slechts een link, een verwijzing gemaakt naar de gecompileerde versie (i.e. de locatie waar je ze gecompileerd hebt). Gooi het originele project daar weg, en je hebt een probleem!

Nota: virtuele class
In geval van een hierarchie van klassen, waarbij de hoogste een virtuele klasse is, die nooit rechtstreeks gebruikt wordt, moet je ze benoemen met een begin-underscore “_”, zodat ze onzichtbaar wordt. De verwijzing INHERITS hoofdklasse in de subklassen ook aanpassen naar INHERITS _hoofdklasse natuurlijk.

KDE 4.8.5 en Gambas2

Opgemerkt in Gambas2 op KDE 4.8.5 (opensuse 12.2): geen icoon in bovenrand venster en taakwisselaar

FMain: icoon is ingesteld op een png file in de properties, icon van FMain.

In de IDE toont de bovenrand ook dat ingestelde logo.

Start applicatie vanuit IDE: het FMain venster heeft niet het gekozen icoon, maar het algemene X icoon.

Gecompileerde applicatie: ook geen icoon in vensterrand.

In KDE 4.4.4 nog geen probleem.

Het kan wel zijn dat de voorwaarden waaraan het icoon moet voldoen in deze KDE versie “strenger” zijn geworden; en dat het gebruikte icoon vroeger ook al niet voldeed aan de standaard.

Ter vergelijking, dit is hoe de gambas IDE zelf* eruitziet (normaal met icoon):

KDE 4.8.5:

* (de Gambas IDE is zelf een gambas programma).

Ps: in Gambas3 werkt het wel.

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“)