Project, nieuw
- starten (in eigen project-subdirectory; die wordt gemaakt met de opgegeven projectnaam)
- FMain is de standaardnaam voor het hoofdscherm, daarbij komen classes, forms, modules, …
- Exit button voorzien, met als code bv:
ME.Close()
in gambas 1
MainForm.Close
? - ESC functie voorzien.
- DEFAULT eigenschap zetten voor “bij enter automatisch in te drukken” knop
- About kan in apart venster
Project, vertalen
- Gambas gebruikt de instellingen van omgevingsvariabelen, op te vragen in een term door echo $LANG of in de Gambas commandolijn met
? System.Language
, wat iets geeft als “nl_NL.UTF-8” (maar die UTF-8 kan je blijbaar verwaarlozen) - vertalingen komen terecht in een (onzichtbare) .lang directory met herkenbare .po en .mo bestandsnamen. Het project zelf als en_US.mo_nl, en_US.po_nl (op mijn systeem) en vertalingen als nl_BE.mo, nl_BE.po, de Duitse vertaling de.po en de.mo
- De verborgen directory .lang wordt gemaakt als je bij Projects / Properties / Options, Translation “Project is translatable” op “yes” zet. Daar kies je ook de standaard taal van je applicatie (als je nog geen andere talen heb gemaakt – nog niet “vertaald” hebt)
- In die directory staan eerst de bestanden:
- FMain.pot (bevat de strings in basistaal)
- .pot (bevat ook de strings)
- #project.pot (dingen door de compiler geschreven)
- Start het project bv in het Engels (algemene taal “en_US”), dwz maak de interface helemaal in het Engels. Vertaal daarna naar de taal die je zelf nodig hebt; dat geeft meeste mogelijkheden naar hergebruik.
- Nadat je een taal bijgemaakt hebt (new), bv Nederlands, België, verschijnen in de .lang directory:
- nl_BE.po (bevat de originele tekst “message string”, en daaronder de vertaalde tekst.
- nl_BE.mo
- Alle teksten op het scherm komen automatisch in aanmerking voor vertaling, teksten in de code moet je aangeven voor vertaling met ()
- Kies het vertaalsymbool (of menu Project/Translate), maak een taal bij, en vul de kolom in. Niets invullen gebruikt de originele tekst van programmatie. Een minstreepje – zetten geeft aan dat het niet vertaald moet worden.
- Gambas zelf in een andere taal starten dan waarin je systeem draait kan door Gambas op te starten met een andere taalinstelling;
LANG=nl_BE.UTF-8
gambas2 - Andere taalversie van je programma testen? Gambas opgestart als hierboven gebruikt ook de bijhorende taal voor de in Gambas geschreven programma’s die je start.
- Je kan ook van in je applicatie de taal verzetten, bv in een string
sLang
:DIM sLang AS String sLang="nl_BE" System.Language = sLang
Die geldt vanaf dat moment, dus een venster dat al openstaat blijft in de vorige taal, ook na
ME.Refresh()
.
Project, instellingen vensters enz.
- gebruik de module settings: aanzetten in Properties/Components
- Een setting bestaat uit een naam of “key” en een waarde. Verschillende settings die bij elkaar horen worden gegroepeerd, wat je dan als eerste naam ziet in de key groupnaam/setting
- Zie Toepassing van instellingen of configuratiebestand
Project, verwijderen
- databases verwijderen
- datadirs en files buiten de prj dir verwijderen
- de project directory verwijderen
Dynamisch gegeneraarde arrays, multidimensionale arrays
- Ofwel werk je met een ééndimensionale array. Die kan je vast declareren als public arrSingle[5] bv, of je kan hem nadien uitbreiden met arrSingle.Insert
- ofwel werk je met een multidimensionele array, maar die moet je declareren en is daarna vast van dimensies: public arrMulti AS integer[10,3]
Op de mailinglist hier:
You can create dynamically an array with any number of dimensions and
any size in each dimension, but once instanciated, you cannot modify the
size and the number of dimensions.The only exception is arrays with one dimension, where the size can be
increased or decreased.So:
Dim myArray As Integer[]
myArray = New Integer[Expr1, Expr2, Expr3]
If you don’t know the number of dimensions at design time, you have to
do that:Dim myDimensions As Integer[]
myArray = Object.New(“Integer[]”, myDimensions)
Dynamisch gegenereerde knop (of ander schermobject of “control”
Je kan een schermelement kiezen uit de lijst met beschikbare controls voor de gekozen Desktop (Form editor), of maken vanuit je programma (created from program control)
In een procedure met DIM, op niveau erboven met PUBLIC of PRIVATE declareren:
DIM btButton AS Button btButton = NEW Button (Parent AS Container)
De container is bv de Form waarin hij staat:
DIM btButton AS Button btButton = NEW Button (ME)
.. of de layout container op een form, bv een horizontale balk (HBox) die al bestaat
DIM btButton AS Button btButton = NEW Button (HBox1)
Alle “events” gaan via de “group”, de naam daarvan definieer je bij creatie als een string:
DIM btButton AS Button btButton = NEW Button (HBox1) AS "grpButtons" WITH btButton .Text = "ABCDEF" END WITH
De events kan je dan definieren vanuit de group:
PRIVATE sSelected AS String PUBLIC SUB grpButtons_Click() sSelected = LAST.Text END
Je kan op deze manier een groep van knoppen definiëren die samenhoren, maar niets weerhoud je ervan om de groep naam individueel te maken voor die ene control, en dan geef je hem gewoon dezelfde naam als de control:
DIM btStart AS Button btStart = NEW Button (HBox1) AS "btStart" .. PUBLIC SUB btStart_Click() ...
Dynamisch gegenereerde objecten
Gelijkaardig aan de controls:
PUBLIC arrKeuze AS String[]
arrKeuze = NEW String[]
Dynamisch gegenereerde objecten van eigen class:
Je hebt een klasse gemaakt CEmployee. De h duidt op een “handle”:
PUBLIC hEmployee AS CEmployee .. hEmployee = NEW CEmployee ..
Initialisatie code
Code die uitgevoerd wordt bij creatie van een object is die van de _new methode in het object.
Code die uitgevoerd wordt bij het begin van het scherm (form) is die tussen
PUBLIC SUB Form_Open() ' END
bv:
Form1.Caption = " Titel van het venster "
Her-initialisatie
Constructor terug oproepen kan met
_new
in gambas 1 zelfde ?
Andere form oproepen
bv vanuit een menu met menu-item-code:
PUBLIC SUB mniOpenForm2_Click() frmForm2.Show END
Opgelet als je elders in je code een andere form oproept; er wordt niet gewacht tot de nieuwe form gesloten is om verder code uit te voeren … dus als je code afhankelijk is van iets wat in dat nieuwe venster gebeurt, kan dat problemen geven lijkt me.
Menu in toepassing
Op de form, klik rechts, kies Menu Editor
(of ctrl-E).
Insert
Name (dit is in het programma de naam van het menu) bv mnuHelp
Caption (dit is de naam die zichbaar is als menu) bv Help
Submenu door inspringen (Insert, wijzig niveau door pijltjes)
Code voor submenu door in form op het menu, submenu-item te klikken.
Standaard knop
hButton.Default = TRUE ' voor enter
hButton.Cancel = TRUE ' voor escape
String
sString = "abc" PRINT sString[1]
Strings worden geteld vanaf 1 (niet vanaf 0)
Image/picture
DIM hPic1 AS Picture
hPic1 = NEW Picture
hPic1.Load("GridPic.png")
locale var declareren, instantie maken, beeld laden
Focus volgende, vorige
hButton.next ' volgende control binnen zelfde container
hButton.previous ' vorige control binnen zelfde container
Volgorde knoppen: tab naar volgende knop.
Binnen de IDE worden deze eigenschappen niet als properties niet weergegeven maar als hierarchy!
Variabelen: resultset resSql AS result (resultaat van sql opvraging) op welk niveau?
In aparte module ; variabele niet bereikbaar vanuit hoofdprogramma.
Je kan de resultset wel laten invullen in de module door hem daar als RETURN te geven.
toetsindruk: key, keypress, keyrelease
Hier (vb uit calculator) in een aktieve valuebox:
PUBLIC SUB vlbxInput_KeyPress() SELECT Key.Code CASE Key.Enter Message.Info("enter : " & Key.Code, "ok") CASE Key.Return Message.Info("return : " & Key.Code, "ok") CASE ELSE Message.Info("other : " & Key.Code, "ok") END SELECT END
MySQL db, verbinding, datarecords ophalen
Afdrukken van resultaten of rapporten
Een eenvoudige manier om af te drukken of te bewaren om op het scherm te bekijken, is html bestanden schrijven vanuit je toepassing. Je kan in de html pagina zelfs het commando om te printen steken, zodat bij openen onmiddellijk de print-keuze opduikt.
Zie ook Gambas Index
Klik en sleep of “Drag and Drop”
Er zijn 3 vragen:
- vanwaar vertrek je
- wat wordt gesleept
- waar wordt het losgelaten?
In Gambas vertaalt dat naar:
- VanObject_MouseDrag()
- VanObject.Drag(DraggedObject)
- ToObject_Drop()
Waarbij VanObject.Drag(DraggedObject) in de code van VanObject_MouseDrag() zit.
Het object waarboven “gedropt” wordt, moet “ontvankelijk” zijn, dus “drop” moet aangezet worden in de eigenschappen:
TargetObject.drop = TRUE
Betrokken objecten, bv VanObject en NaarObject moet een aantal gedragingen ingevuld krijgen:
VanObject.Drag
NaarObject.Drop
Drag op zich heeft : Drag.Data
Slepen doe je met de muis, dus die is ook betrokken, bv:
' PUBLIC SUB Mousedrag() IF Mouse.Left THEN ME.Drag(ME[ME.Index].Text) ENDIF END