Hoe

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

  1. 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
  2. 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

Leave a Reply