Author Archives: cybrarian
Gambas 3 voorbeelden niet meer meegeleverd
Sedert een tijd zijn de Gambas voorbeeldprojecten niet meer meegeleverd met de Gambas 3 IDE. In de plaats daarvan is een downloadsysteem voorzien. Een lijst geeft weer welke voorbeeldprojecten beschikbaar zijn. Met een eenvoudige klik kan je ze afhalen. Dit zorgt ervoor dat de updates van de voorbeelden onafhankelijk kunnen gebeuren van de Gambas3 updates, en dat de Gambas3 installatie kleiner wordt (door de vb weg te laten).
Nadeel is wel dat als je ergens off-line zit te werken, je niet aan voorbeelden kan (behalve deze die je al gedownload had).
Bovendien zijn er nog niet zo veel voorbeelden voorradig online; misschien komt het voorbeeld dat je nodig hebt nooit online.
Door upgrades vanuit vorige systemen kan het zijn dat je de voorbeelden nog hebt, of als je alvorens te upgraden zeker wil zijn dat je de voorbeelden nog hebt:
/usr/share/gambas3/examples
Je kan ze gewoon naar je eigen map kopiëren.
Gambas 3 v 3.8.90.svn.7791
Om één of andere reden startte de gambas 3 IDE niet meer en na wat pogingen om een recentere versie af te halen en een de-installatie + installatie ging het nog steeds niet
Enkele van de foutmeldingen die ik zag:
~> gambas3
ERROR: #2: Cannot load class ‘Action!’: Unable to load class file
~> gambas3
gbx3: unable to find startup file
~> gambas3
bash: /usr/bin/gambas3: No such file or directory
Daarna gekeken in de repositories (via software.opensuse.org):
Education
3.8.4
32 Bit
64 Bit
Sourcehome:munix9
3.8.4
32 Bit
64 Bit
Sourcehome:munix9:unstable
3.8.90.svn.7791
32 Bit
64 Bit
Source
En dus de laatste versie gekozen, die heel wat Qt5 spullen afhaalt.
Nu draait 3.8.90!
Gambas3 voorbeelden, WaveGenerator 3.6.3
Op openSUSE 13.1 kan het WaveGenerator voorbeeld een foutmelding geven:
Unable to create media control
en dit op de lijn met “autoaudisink”:
$hOutput = New MediaControl($hPlayer, "autoaudiosink")
Dat heeft te maken met het openen van een audio-uitvoer. Er zijn nogal wat verschillende audiosystemen, in verschillende lagen, en meestal lukt het met die autoaudiosink; hier dus niet.
Ik heb* “autoaudiosink” vervangen door “alsasink”, en daarna loopt het voorbeeld normaal.
$hOutput = New MediaControl($hPlayer, "alsasink")
(*) Op basis van een bericht op de mailinglist waar alsasink wordt vervangen door autoaudiosink.
Ik vond enkele meldingen van het probleem, met verwijzingen naar het audiosysteem, maar nergens een lijst met mogelijke waarden om uit te proberen om het snel te doen werken voor mezelf.
Objecten die een array bevatten
Array in een Klasse
Een objectklasse kan gegevens en methoden bevatten, maar ook bv een array. Die array kan bestaan uit getallen of tekst, maar kan ook weer uit objecten bestaan.
Ik maak een object met twee arrays;
- 1 met string elementen
- 1 met ‘object2’ elementen.
Object2 bevat enkel twee eigenschappen ter demonstratie: een tekstveld en een getal.
Een testprogramma maakt eerst de objecten en vult de arrays.
Daarna kan elk van de arrays weergegeven worden in een tabel.
(upd) Code testprogramma zie verder, maar eerst een opmerkig:
embedded arrays
Er wordt op online Gambas documentatie gewezen op het probleem van “embedded arrays” (lees meer).
Het testprogramma ziet er zo uit; het aantal elementen wordt bepaald door het getal, de tekst die opgeslagen wordt door het tekst-invulveld:
Als het draait:
Hieronder de broncode … Continue reading
Klik en slepen beheren met een object? (Drag’n drop object)
In een bepaalde toepassing wilde ik meer controle krijgen over de klik en sleep akties in een form, omdat er verschillende mogelijke bronnen en bestemmingen waren. Ik weet niet of het een goed idee is, maar ik maakte er een apart object voor; zeg maar door een Class CDragDrop.
Daarin definieerde ik de nodige constanten.
Ik hield bij waar de klik en sleep vandaan kwam, en in geval van een tabel bv ook de coordinaten dmv rij en kolom in die tabel (row, col).
Ik definieerde een aantal mogelijke ontvangers in een array.
(deze zijn redelijk specifiek voor het scherm (Form) waarin ik werk)
bv:
' Gambas class file
' CDragDrop - to manage drag n drop
'
PUBLIC CONST Employee AS String = "employee"
PUBLIC CONST DestinationOne AS String = "destination1"
PUBLIC CONST DestinationTwo AS String = "destination2"
'
PRIVATE arrReceiver AS String[] = [Employee, DestinationOne, DestinationTwo]
Klik en sleep toestanden kan je bijhouden door methodes als:
Door procedures als
- setOrigin
- setReceiver
- getOrigin
- getReceiver
(deze zijn op zich redelijk universeel, invulling verschilt).
Ook kan je de bron en bestemmeling checken in de klasse.
Ik hergebruik het object van deze klasse:
PUBLIC SUB clear()
waarin ik alles leeg maak; maar je kan ook een nieuwe instantie maken en de gebruikte bijhouden als referentie (fifo lijstje?), als je nadien moet weten wat je vorige klik-en sleep aktie was.
English summary:
I created my own class to manage drag’n drop in my app. I can keep code away from my Form, and have all drag’n drop information at hand in one place. I could even keep the last action archived by keeping the previous instance(s) (in a FIFO array?).
Tekst van runtime knop onbereikbaar (button Text property)
In bepaalde omstandigheden kwam ik op een foutmelding bij het gebruiken van de tekst die ingesteld staat bij een knop. De foutmelding:
Unknown symbol ‘Text’ in class ‘Control’
De klasse van het object waarvan ik de tekst eigenschap wil gebruiken is niet “Control”, maar wel “Button”, maar dat ziet Gambas niet. Toch niet ‘at runtime’, maar… :
Bij het stilleggen van het programma, en het selecteren van de betreffende code, toont hij de juiste tekst in de tooltip.
Daarom gebruik ik nu deze kleine omweg:
In plaats van de children van hboxItems aan te spreken met een index, en daarvan ineens de tekst op te vragen, wijs ik nu eerst het i-de item van de children toe aan een voorgedefinieerde button, en gebruik ik daarvan de tekst eigenschap:
ps: Dit is een stukje code uit een complexer stuk programma, en om de fout te isoleren heb ik me hier beperkt tot het weergeven met DEBUG van de Text eigenschap; in werkelijkheid gebeurt daar iets anders mee, meer bepaald een drag’n’drop bewerking.
De buttons werden niet gemaakt in de Form designer, maar vanuit het programma, met als parent de hboxItems container. Daarom kan ik ze enkel onrechtstreeks aanspreken.
English summaray:
To use the Text attribute of a button (in this case), you have to make a button object first, then allocate the child object (with index i) to this button object. Then you are able to use the button text property.
The buttons in the hBoxItems were made under program control (at runtime), that’s why I have to call them in this inderect way, as children of the parent container.
openSUSE Leap 42.1 en Gambas2, Gambas3
Update 03/2016:
Ondertussen draait Gambas2 IDE (2.24) perfect op LEap 42.1!
* Een update van openSUSE 13.1 naar openSUSE Leap:
– Gambas2 programma’s compileren en draaien via runtime ok.
– Gambas IDE’s opstarten: werkt niet (meer), te checken.
Opgelet; Trek geen andere conclusie; dit is dus geen “verse installatie” van Leap; kan een verschil maken!
(inderdaad, na nieuwe installatie of updates was het in orde, zie boven)
openSUSE Tumbleweed en Gambas2, Gambas3
Op dit moment heb ik zowel Gambas2 als Gambas3 draaiend op Tumbleweed (inst ong. 2016-jan.)
- Gambas 2: 2.24.0 openSUSE-Education
- Gambas 3: 3.8.4 obs://build.opensuse.org/home:munix9
Gambas2 ziet er niet meer mooi uit, evenmin de programma’s die erin gemaakt zijn.
Klik en sleep van TableView naar GridView
Klik en sleep
De eenvoudige voorbeelden van klik en sleep met de muis, zoals die waarbij een tekst van een TextBox naar een TextLabel worden gesleept, schieten te kort als je een TableView of een GridView gebruikt (beiden even roosters genoemd). Immers: je kan een heel rooster slepen naar een ander rooster en daar allerlei leuke dingen mee doen, maar meestal is dat niet de bedoeling.
Cel in plaats van rooster
Je wil een bepaald vakje, één cel, of eerder nog de inhoud daarvan, naar een andere plaats slepen. De bestemming is dan niet een element als TextBox of GridView, maar ook weer een bepaalde cel van een TableView of GridView rooster.
Drag..
De basis blijft hetzelfde:
Voor de vertrekplaats moet een _MouseDrag() gemaakt worden:
PUBLIC SUB TableView1_MouseDrag()
IF Mouse.Left
Drag.Icon = PictureBox1.Picture
TableView1.Drag(TableView1[TableView1.Row, TableView1.Column].Text)
ENDIF
END
Ik heb in de IDE op voorhand een PictureBox1 op FMain gezet, er in de IDE een beeldje voor gekozen uit de verzameling (stock), en die PictureBox1.Visible op FALSE gezet.
.. en Drop
De bestemming moet als eigenschap Drop = TRUE hebben:
GridView1.Drop = TRUE
en er moet drop code gemaakt worden:
PUBLIC SUB GridView1_Drop()
GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data
END
Om de data in de Text te krijgen van de gewenste cel op rij, kolom
GridView1[row, column].Text = Drag.Data
moet je die coördinaten eerst detecteren:
GridView1.RowAt(Drag.y)
GridView1.ColumnAt(Drag.X)
Dit is de kleine “truuk” om het klikken en slepen tussen TableViews en GridViews mogelijk te maken.
Er zit nog wel een addertje onder het gras: als je een beetje buiten de bestaande cellen sleept en daar in het gridview gebied onder de laatste rij cellen bv loslaat, zijn de coördinaten niet gedefineerd. Crash!
Dus:
TRY GridView1[GridView1.RowAt(Drag.y), GridView1.ColumnAt(Drag.X)].Text = Drag.Data
Verder moet je de code aanvullen met alles wat moet gebeuren, zoals opslaan in een databank, berekeningen enz.