Een melding op het scherm die zonder klikken verdwijnt

In het hoofdscherm van een programma, moet na het drukken van een knop een venster getoond worden met gegegevens uit een databank.

FMain is het hoofdprogramma,
btGetData de knop om de gegevens te vragen.
FDataRecords is het nadien te tonen venster.

Het ophalen van die gegevens gebeurt in FDatarecords en duurt even, waardoor het venster niet onmiddellijk verschijnt. De gebruiker zou in de verleiding kunnen komen nog eens op de ophaal-knop te drukken omdat er “niets gebeurt”.

Ik wil een venster tonen met een melding; bv:

Message.Info("Gegevens worden gelezen en geïnterpreteerd.\n Druk om verder te gaan en wacht tot venster verschijnt ....")

Het nadeel is dat de gebruiker dat venster moet wegklikken. Ik wil een venster dat vanzelf verdwijnt, bv door het maken van een nieuw venster met een nieuwgemaakte tekst:

 
PUBLIC SUB btGetData_Click()
'
  DIM hMessage AS Window
  DIM hText AS TextLabel
  ' de knop even buiten gebruik stellen
  btGetData.Enabled = FALSE
  ' berichtvenster ergens in het midden van FMain (parent)
  hMessage = NEW Window(ME)
  WITH hMessage
    .Width = 600
    .Height = 100
    .X = (.Parent.Width - .Width) / 2
    .Y = (.Parent.Height - .Height) / 2
    .Visible = TRUE
    .Border = .Fixed
    .Picture = Picture.Load("Patroon.png")
  END WITH 
  ' tekst die in het venster komt, met afmetingen in verhouding tot berichtvenster
  hText = NEW TextLabel(hMessage)
  WITH hText
    .Alignment = Align.Left
    .Width = hMessage.Width - 20 - 20
    .y = (hMessage.Height - 20) / 2
    .x = 20
    .Font.Size = 13
    .Alignment = Align.Center
    .Text = ("Retrieving the information from the database - wait ...")
  END WITH 
  hMessage.Show()
  ' bericht even tijd geven om op te komen alvorens aan FDatarecords te beginnen
  WAIT 0.001
  FDataRecords.Show()
  ' bericht sluiten en knop terug vrijgeven
  hMessage.Close()
  btGetData.Enabled = TRUE
END

Je kan ook nadien pas het venster een plaats geven:
hMessage.Move(300, 300)

Printen uit Gambas: tekst, html of echt.

Eenvoudige tekst, html, of ingebouwd printen?

  1. Voor uitvoer kan je gemakkelijk een txt bestand maken vanuit gambas, dat je dan in eender welk programma kan openen en printen (bv Kate, …).
  2. Een andere mogelijkheid, waarmee je veel kanten uit kan is .html files maken vanuit gambas: die kunnen zowel bekeken worden met de browser, als van daaruit geprint. Als ze op een bereikbare plaats (gedeelde map of webserver) staan, zijn ze gemakkelijk te delen. (zie ook “html rapport weergeven of printen“)
  3. Je kan ook printen vanuit Gambas, dan moet je echt alles doen wat erbij komt; pagina beschrijven enz.

De online documentatie vermeldt onder Gambas versie 2.0 de uitleg van 3.0.

Gambas 2.21 bevat in ieder geval een “voorbeeld” toepassing: “Printing”, dat al bestaat sinds 2006.
Die bevat de componenten:

  • gb
  • gb.qt (bevat Draw, gebruikt voor sturen van grafische informatie naar het Printer object)
  • gb.qt.ext (bevat Printer)

Nota:
Deze componenten gaan niet samen met de algemene gb.gui component.
Wel kan je voor de gb.gtk en gb.gtk.ext kiezen, vermoedelijk verschaffen ze ongeveer dezelfde functionaliteit met licht anders uitzicht (KDE = Qt, Gnome = GTK).

In Gambas3 bestaat een Printer (gb.qt4) object.

Voor Gambas2: gebruik het “Printer” object, dat ondermeer volgende eigenschappen heeft:

  • Orientation (Portrait, Landscape)
  • Size “A4”
  • Copies (getal)
  • ColorMode (Black, Color)
  • Resolution (bv 600)

bv: Printer.Orientation=Printer.Landscape

Opbouwen van print in 4 stappen:

  1. Printer.Setup()
    Oproepen van print setup : geeft een standaard venster “Setup Printer” met de printerkeuze (als er meer printers zijn), en andere instellingen als “Printer Settings”, “opties”, papierformaatkeuze en aantal prints.
    Printer.Setup() geeft een waarde terug naargelang knop “OK” (FALSE) of “Cancel” (TRUE) gedrukt wordt.
    Aangezien “Cancel” TRUE geeft kan je een test doen met:

    IF NOT Printer.Setup()
    '  print commands
    ELSE
    '  Message.Error("print setup canceled")
    ENDIF
    

    Het aanroepen van Printer.Setup() is niet verplicht, maar wel nuttig voor de gebruiker.

  2. *1)
    Draw.Begin(Printer)

    vanaf hier begint het printen
     
  3. Draw.Text((“Voorbeeldtekst”), iStartX, iStartY)
    Draw.Rect(iStartX, iStartY, iBreedte, iHoogte)

    Zet tekst of teken vormen, bv: Teken een rechthoek op locatie … met afmetingen …

    Draw.Rect(800, 800, 80, 40) ‘ zet bovenaan links een klein rechthoekje op papier.
    Hoewel 800, 800 doet vermoeden dat het evenver van de boven als van de zijkant staat is dat niet het geval!

  4. Draw.End
    *2)

    Tot hier loopt het printen;

* Opmerking: “Application.Busy”

  1. INC Application.Busy
    wordt door de voorbeeldprogramma’s verhoogd net voor Draw.Begin
  2. DEC Application.Busy
    Application.Busy wordt door de voorbeeldprogramma’s verlaagd net na Draw.End
  3. Tekst wordt geprint op plaats x, y met:
    Draw.Text(“Deze tekst wordt afgedrukt”, x, y)

    Een paar andere eigenschappen kunnen ingesteld worden met/als:

          Printer.Orientation = Printer.Landscape
          Printer.Size = "A4"
          Draw.Font.Size = 18
          Draw.Font.Name = "Arial"
          Draw.Font.Underline = TRUE
          Draw.Font.Bold = TRUE
    

    en dat kan voor het aanroepen van Printer.Setup() gebeuren; je zal de instelling daar weergegeven zien, bv als je Printer.Landscape hebt ingesteld en nadien Printer.Setup() aanroept, staat “Paper Format” op “Landscape” in de drop-down box in het “Setup Printer” venster.

    Waarschijnlijk wil je een aantal (public of private) variabelen declareren, als:

    ' Gambas module file
    PUBLIC iFirstColStart AS Integer = 120
    PUBLIC iSecondColStart AS Integer = 2000
    PUBLIC iThirdColStart AS Integer = 5500
    PUBLIC iCurRow AS Integer = 800
    '
    PUBLIC iRepeatColStart AS Integer = iSecondColStart
    PUBLIC iDimensionColStart AS Integer = 3000
    PUBLIC iColorColStart AS Integer = 3500
    PUBLIC iNumberColStart AS Integer = 4000
    PUBLIC iDeliveredColStart AS Integer = 4500
    '
    PUBLIC iFontSizeMainData AS Integer = 28
    PUBLIC iFontSizeMidData AS Integer = 24
    PUBLIC iFontSizeDataTitle AS Integer = 14
    PUBLIC iFontSizeSmallData AS Integer = 10
    PUBLIC iFontTinyData AS Integer = 7
    PUBLIC sFontMainData AS String = "Arial"
    '
    PUBLIC fborder AS Float
    PUBLIC fTextHeight AS Float
    PUBLIC fTop AS Float
    

    Om te vermijden dat teksten door elkaar lopen in de print kan je de data wat inkorten, eventueel proefondervindelijk, bv:

    PUBLIC iMaxCusLen AS Integer = 12
    PUBLIC iMaxOrdNameLen AS Integer = 20
    

    Hier een stukje code waarin dat gebruikt wordt:

      IF NOT Printer.Setup()
      
          ' some printer settings
          Printer.Size = "A4"
          Printer.Orientation = Printer.Landscape
          ' why this?
          INC Application.Busy
           ' Draw printer page
          Draw.Begin(Printer)
          
          border = Printer.Resolution
    
          Draw.Rect(100, 100, 10, 10) ' just to fix the corner
          
          ' Draw.Ellipse(3000, 3000, 1200, 190)
          
          iCurRow = 300
          
          Draw.Text("Klant", iFirstColStart, iCurRow)
          Draw.Text("Ordernaam", iSecondColStart, iCurRow)
          Draw.Text("Ordernr", iThirdColStart, iCurRow)
          
          iCurRow = 500
    
    '      Draw.Rect(iFirstColStart, iCurRow, 2200, 300)
          
          Draw.Font.Size = iFontSizeMainData
          Draw.Font.Name = sFontMainData
          Draw.Font.Bold = TRUE
                
          
          Draw.Text(thisOrder.ShortCusName(iMaxCusLen), iFirstColStart, iCurRow, 1200)
          
          Draw.Text(thisOrder.ShortOrdName(iMaxOrdNameLen), iSecondColStart, iCurRow)
          
          Draw.Rect(iThirdColStart - 100, iCurRow, 1200 - 100, 280)
          Draw.Text(thisOrder.sOrdCode, iThirdColStart, iCurRow)
    
    ' ... enz.
    
          Draw.End
          
          DEC Application.Busy
      ELSE 
        Message.Error("Printing was canceled")
      ENDIF 
    

    Meer pagina’s printen?

    PUBLIC SUB GoNextPage()
      Printer.NewPage()
      INC iPageNumber
      iCurRow = iRowStart
    END
    

Standaard leeg project

Project Type: Graphical application.
Options:

  • Internationalisation
  • Database access
  • Settings files management

Name: EmptyProject
Title: Empty Project

FMain: Menu met

  • File: Quit
  • Help: About, Changes, License

Form_Open: zet programma titel en versie.
doClose(): aangeroepen bij Menu/Quit (of scherm “Exit” button); kan afsluitende code aanroepen (wegschrijven toestand)

FAbout: About logo en tekst: naam plus versie.

FLicense: Toont License.txt
FChanges: Toont Changes.txt

Misschien nog een “test” menu-item dat alleen verschijnt als de conf file de verwijzing bevat:

[Mode]
Developer=”TRUE”

Op basis van die verwijzing zet je bij het starten van het programma het menu op visible.
Daaronder kunnen dat stukjes code getest worden die nog niet zijn vrijgegeven voor gebruik.
Opgelet: de gebruiker kan door het (buiten het programma om) wijzigen van zijn settings file dit menu dus aanzetten!

Logs en foutmeldingen op scherm

– Een eenvoudige weergave van log-meldingen en foutmeldingen kan in het (hoofd-)venster van het programma FMain in een ListBoxLog en ListBoxError. Door ListBoxLog.Add(“Opmerking”, 0) kan je de meldingen bovenaan toevoegen, de oude rollen weg naar beneden.

Fouten met Error Class

Een foutklasse CError kan vanuit het programma geinitieerd worden en de foutafhandeling waarnemen; bv kunnen de fouten naar een bestand gelogd worden, waarin elke regel voorafgegaan wordt door datum en tijd, en de foutmeldingslijn aangevuld wordt met de gebruiker System.User.Name

(laatste aanpassing: 08-2014)

Source archive uitpakken, compileren en draaien

Ik zoek een manier om gemakkelijk een programma in aanpassing bij de gebruiker te installeren.
Programmeur:

  • Maak source archive in de Gambas IDE
  • Upload ergens

Gebruiker:

  • Download bv met wget locatie/archivenaam van ergens het “source archive”.
  • Zet het bestand in de gambas werkdirectory, bv in ~/gambasprj
  • Pak uit bv in terminal met tar -xzvf archivenaam; je krijg een projectdirectory met projectnaam
  • Compileer in terminal met gbc2 -va projectnaam (v=verbose: feedback op scherm)
  • Ps: Run in terminal met gbx2 projectnaam; terminalvenster geeft foutmeldingen weer.
  • Als een “archive” gemaakt wordt met gba2 projectnaam, ontstaat in de projectdirectory het .gambas bestand dat vanuit de grafische omgeving kan aangklikt worden om het programma te draaien

Nog uit te zoeken; script kan het afhalen en compileren doen, icoon op de desktop zou het programma moeten starten. Als gambas zelf een programma compileert in de IDE wordt een icoon op de desktop gemaakt met volgend commando:

‘/home/wig/GambasPrj/projectnaam/projectnaam.gambas’

Broncode verzameling (sourcecode printen)

Dit artikel is in 2008 gemaakt voor Gambas versie 2!
Versie 3 heeft een andere plaats voor zijn bestanden!

De broncode van de schermen zit in de bestanden met de uitgang .class, als je de naamgeving systematisch doet beginnend met F__ of Form___. De layout van het scherm is ook tekst en zit in dezelfde naam met uitgang .form. De code van modules heeft extentie .module en zit in M___.module

Broncode is pure tekst en kan in bestandbeheerder preview bekeken, of in Kate geopende worden.
Afdrukken van de broncode gaat niet vanuit gambas. Wel vanuit Kate (bv met regelnummering aan).
Of in OOo Writer, eventueel na het samenvoegen van de broncode van de verschillende forms en modules.

Verzamelen van de broncode in 1 bestand:
(class en modules)

(zie shell script hieronder) Continue reading

Settings toepassing

Eenvoudige toepassing van Instellingen of configuratiebestand

Start een nieuw project met de naam ConfigSettings.
Kies bij Project Type, Options “File Settings Files Management”
Controle: Daardoor is onder project eigenschappen gb.settings aangekruist.

Vertrek op de nieuwe FMain form:
– maak een button bovenaan “btnShowConfig“.
– dubbelklik op de knop en vul er de volgende code in:

Message.Info(File.Load(Settings.path &/ Application.Name & ".conf"))
CATCH
Message.Error(Error.Text & " fout met config - bestaat niet? ")

= Een “run” levert normaal de foutmelding op.

Een beetje lager zet je een invultekstveld “txbxSetText1
Maak een nieuwe knop en zet die ernaast, met naam “btnSetText1” en zet in de code van click:

PUBLIC SUB btnSetText1_Click()

Settings["Instelling1"] = txbxSetText1.Text

END

= Een “run” doet niets nieuws lijkt op het eerste zicht. btnShowConfig geeft zelfde foutmelding. Je verlaat het programma.

= Een direkt daaropvolgende “run” met opvragen van btnShowConfig verrast misschien met je “instelling” van het tekstveld van de vorige “run”: onder een hoofding General (die je niet opgaf – standaard dus):

[General]
Instelling1=”txbxSetText1″

en een knop “ok”. Opeenvolgende “runs” tonen dat steeds de vorige ingevulde tekst, die je met btnSetText bevestigde, opgeslagen was.

Dat kan je terugvinden in de verborgen config directory:

/home/loginname/.config/gambas/

met de naam

ConfigSettings.conf

Open dat bestand met kate of een andere code-tekstverwerker en voeg een tweede “instelling” toe:

[General]
Instelling1="geheim"
Instelling2="nieuw"

Laat het programma lopen en vraag de instellingen op.

update 2012 11 30
Als je een configuratie-instelling opvraagt maar je bent niet zeker of die bestaat, geef je een standaardwaarde op die gebruikt moet worden bij ontbreken van de te zoeken instelling.

iHoogte = Settings[“General/Hoogte”, 120)

Als je wil testen of een configuratie-sleutel voorkomt of niet, zet je zelf “NULL” als alternatieve standaardwaarde.

IF isNull(Settings[“General/Runcounter”, NULL])
Settings[“General/Runcounter”] = 0
ENDIF