Apriamo una finestra su ThinBasic

Delle grandi capacità di questo interprete ne ho già parlato in un precedente post, ma adesso voglio mostrare invece come tra il dire e il mare ci sia il fare e come questo strumento possa gettare un ponte straordinario tra ciò che si pensa e ciò che si ottiene.

Scopo di questo thiny-Tutorial è realizzare una semplice finestrella di "Hello World" giusto per introdurre gli elementi principali della programmazione visuale sotto questo ambiente.

Per prima cosa scaricatevi l'interprete dal solito indirizzo quindi installatelo e registratelo con i dati forniti nel file di testo allegato.

Aprite l'ambiente Thin Air che include l'Ide e il Debugger, tramite il menù a tendina o il pulsante create un nuovo Gui Script.

Per cominciare dobbiamo dire all'interprete che intendiamo fare uso del modulo UI (User Interface) che racchiude tutte le funzioni necessarie alla creazione/gestione di una interfaccia grafica, ciò si ottiene semplicemente con la clausola
USES "UI".
So che non c'è nulla di poetico in ciò che sto per dire però bisogna subito passare alla concezione della nostra prima dialog: ci viene in aiuto la DIALOG NEW che richiede qualche parametro:

  1. hwparent: l'indirizzo della finestra "genitore", essendo "orfana" lasceremo qui un bel 0
  2. hwnd: una variabile dove memorizzare l'identificativo univoco della finestra
  3. Title: Un titolo per la finestra
  4. xPos e yPos: Per posizionare la finestra da qualche parte dello schermo, in questo caso volendola piazzare al centro è sufficiente lasciare i valori -1 per entrambi i parametri
  5. Width e Height: Larghezza e altezza finestra
  6. Style: Elementi dello stile della finestra, per un elenco completo delle varie possibilità potete consultare la guida on line, mi sono limitato alla sola opzione che fa comparire la casella di chiusura della finestra ma ce ne sono per tutti i gusti.

Ultimo comando è quello che impone alla dialog di "mostrarsi"
DIALOG SHOW MODELESS hwnd
Ricapitolando ecco il codice visto fin ad ora

USES "UI"

DIM hwnd as Long
DIALOG NEW 0, "HELLO WORLD!!!", -1 , -1, 200, 100, %WS_Sysmenu TO hwnd
DIALOG SHOW MODELESS hwnd

Se provate con il tasto F5 a far partire il tutto non vedrete niente: qualcosa succede ma di sicuro non vedrete niente.
Questo perchè dobbiamo implementare un gestore di eventi: un semplice while che ha la funzione di tenere attivo il programma e intercettare i "messaggi" inviati dal sistema operativo alle finestre aperte che riguardano click, movimenti del mouse, tastiera ecc. insomma dobbiamo entrare un attimo a contatto con il sistema sottostante, e questa è una parte didattica da non sottovalutare perchè è l'ossatura di tutte le applicazioni con una interfaccia grafica che girano su Windows e adesso avete l'occasione per vedere qualcosa del dietro le quinte :)
Per prima cosa un ciclo: in questo caso viene aperto dalla dichiarazione

WHILE ISWindow(hwnd)
...
WEND

che non è altro una condizione di guardia sul contenuto della variabile hwnd se è un riferimento a una finestra il ciclo si attiva altrimenti niente.
Quindi bisogna sapere se c'è un messaggio per la nostra applicazione e individuare i parametri che questo messaggio porta con se
Msg = GetMessage(hwnd, wParam, lParam).
Adesso cosa farne di questi parametri e soprattutto come utilizzarli? Facendo un giro tra gli esempi contenuti nell'interprete si scopre un template standard che riporto qui sotto:

SELECT CASE Msg
      
  CASE %WM_KEYUP
        
  CASE %WM_COMMAND

  CASE %WM_SYSCOMMAND

    SELECT CASE wParam
        
       CASE %SC_CLOSE
       EXIT WHILE
              
    END SELECT
      
END SELECT

In pratica quando arriva alla finestra un messaggio di chiusura (cliccando per esempio sulla croce in alto a destra sulla finestra) il ciclo termina e il programma stesso termina (o così dovrebbe).
Fuori dal ciclo occorre quindi piazzare la
DIALOG END hwnd
che libera la memoria occupata e termina la dialog.

Ecco il codice completo:

USES "UI"

DIM hwnd as Long
DIM msg as Long
DIM lparam as long
DIM wparam as long

DIALOG NEW 0, "HELLO WORLD!!!", -1 , -1, 200, 100, %WS_Sysmenu TO hwnd

DIALOG SHOW MODELESS hwnd

'Ciclo infinito di "raccolta messaggi"
  WHILE IsWindow(hwnd)                  

    'Ci sono messaggi per noi?  
    Msg = GetMessage(hwnd, wParam, lParam)

    SELECT CASE Msg

      CASE %WM_SYSCOMMAND

        SELECT CASE wParam
            
          CASE %SC_CLOSE
             EXIT WHILE
              
        END SELECT
      
    END SELECT
    
  WEND
DIALOG END hwnd

Ovviamente tutto ciò che occorre per scriptare con questo basic è già all'interno dell'istallazione o nella guida online, un po' di pazienza e non ci vuole niente a riadattare alle proprie esigenze pezzi di codice già scritti.