Guida A Livecode

Introduzione

Livecode e' un linguaggio di programmazione completo di grafica, open source e gratuito, per:

  • Windows
  • Linux
  • MacOS
  • Android
  • iOS
  • Raspberry PI
  • Kindle

si puo' scaricare da http://livecode.com/download/ .

Questo nuovissimo linguaggio di programmazione, che con pochissime righe di codice vi permette di creare programmi e APP completi e con una bellissima interfaccia grafica, fino a poco tempo fa ogni licenza costava $ 500, ma ora e' gratuito e opensource!.

Guardate questo video di esempio:

⚠ (:youtube 3AbV4Evqy8E:)

Aggiornamenti

Visto che questa e' una guida generale se volete avere più informazioni vi consiglio di seguire il mio blog:

Altri siti

Potete vedere altre fonti su livecode come:

Requisisti di sistema

Le applicazioni create con Livecode hanno requisiti molto bassi, mentre il software Livecode per crearli ha i seguenti requisiti:

  • monitor almeno 1024x768
  • 256Mb di RAM
  • 150Mb di spazio libero sull'hard-disk

Windows

Per Windows Livecode funziona con almeno:

  • Windows 2000 SP4
  • Windows XP SP2
  • Windows Server 2003
  • Windows Vista SP1 (sia 32-bit sia 64-bit)
  • Windows 7 (sia 32-bit sia 64-bit)
  • Windows Server 2008

Installate QuickTime 7 o successivo per avere accesso alle funzioni multimediali (musica, video, ecc.)

Linux

Pe Linux basta una qualunque moderna distribuzione (da Ubuntu 7 in poi), in particolare i requisiti minimi sono:

  • versione 32-bit, o a 64-bit con la compatibilita' a 32 bit (ormai quasi tutte ce l'hanno)
  • kernel 2.4.x o superiore
  • glibc 2.3.2 o superiore
  • gcc 4.9
  • X11R5 o superiore
  • componenti opzionali:
    • compositing window manager (optional - required for alpha-blended window shapes)
    • gtk/gdk/glib (optional - required for native theme support)
    • pango/xft (optional - required for pdf printing, anti-aliased text and unicode font support)
    • lcms (optional - required for color profile support in JPEGs and PNGs)
    • gksu (optional - required for elevate process support)
    • mplayer (optional - required for video playback)
    • esd (optional - required for audio playback)

Ho fatto anche dei pacchetti di installazione scaricabili da qui: https://www.maxvessi.net/livecode/linux/index.php

Mac OS X

Funziona su:

  • 10.3.9 (Panther) on PowerPC
  • 10.4.11 (Tiger) on Intel and PowerPC
  • 10.5.8 e superiori (Leopard) on Intel and PowerPC
  • 10.6.x (Snow Leopard) on Intel

Licenze

Come gia' detto Livecode e' gratuito, ma la versione gratuita non permette di chiudere il codice e renderlo illeggibile (closed source).

Se siete uno sviluppatore che vuole rendere il proprio codice inaccessibile, e' possibile comprare la versione "commercial. Dopo aver immesso la chiave della licenza del programma, Livecode diventera' COMMERCIAL, scaduta la licenza Livecode poi tornera' COMMUNITY. Questo non vuol dire che i vostri programmi durino solo un anno o meno, i vostri programmi creati con Livecode COMMERCIAL saranno sempre closed source. Il termine della licenza influenza solo l'ambiente di sviluppo per creare nuovi programmi o nuove versioni del programma.

Per le aziende e infrastrutture molto grandi, che hanno bisogno di supporto telefonico, corsi specifici e soluzioni in 24 ore e' possibile acquistare licenze dai costi piu' alti che garantiscono del personale dedicato per 12 mesi.

Elenco licenze

Ecco un elenco aggiornato delle Licenze (Settembre 2015):

  • Community: è gratuita permette di ottenere programmi con licenza GPL per Windows, Linux, Mac e Android. (iOS non permette programmi pienamente GPL)
  • Indy: costa € 55 al mese, permette di ottenere programmi commerciali per Windows, Linux, Mac, Android e iOS. Il codice può essere chiuso.
  • Business: costa $ 188 al mese. E' obbligatoria se si guadagna più di $ 500'000 all'anno con Livecode (Si, c'è gente che guadagna così tanto programmando con Livecode). Vi da' accesso ad un forum riservato.

L'elenco delle licenze e qui: https://livecode.com/products/livecode-platform/pricing/

In caso di problemi

C'e' il forum italiano: http://livecodeitalia.freeforums.org/

C'e' il forum in inglese: http://forums.livecode.com , li' troverete molti esperti.

Livecode ha anche un dizionario integrato che potete ritrovare anche qui: http://docs.runrev.com/

Nella peggiore delle ipotesi potete vedere http://support.runrev.com/ o scrivere a support@runrev.com

C'e' il blog italiano: http://livecodeitalia.blogspot.it/

Concetti principali

Dopo aver installato Livecode, avviatelo e andate su File->New Mainstack. Vi apparira' una nuova finestra vuota. L'idea di Livecode e' quella di creare programmi moderni che hanno degli oggetti tipo finestre, pulsanti, grafici, ecc. Dentro ogni oggetto, che puo' essere la finestra stessa, potete inserire del codice da far eseguire. Il codice e' semplicissimo e molto simile all'inglese parlato.

Mettere gli oggetti nelle finestre e' semplicissimo, basta trascinarli dalla finestra Tool alla finestra del vostro programma, poi potete modificarne l'aspetto, la posizione e inserirci del codice. Il codice si attiverà quando si attiverà l'oggetto che lo contiene. Ad esempio il codice di un pulsante si attivera' quando qualcuno cliccherà su un pulsante.

Infine potete salvarlo e inviarlo così come e' ai vostri amici che hanno Livecode, oppure trasformarlo in un eseguibile che non ha bisogno di Livecode.

Comunque e' possibile realizzare anche programmi senza interfaccia grafica, basta scrivere il codice in un file e inviarlo direttamente all'eseguibile Livecode. Questo metodo e' spesso utilizzato per dialogare direttamente con il webserver Apache.

Esiste addirittura il Livecode webserver.

Modificare e utilizzare

Se siete in Edit mode potete modificare il programma e il suo codice, se siete in Run mode lo state usando. Per passare da un modo all'altro potete:

  • premere uno dei due pulsanti in cima alla finestra Tool,
  • oppure con CTRL+0 e CTRL+9,
  • oppure con Tool -> Browser tool e Tool -> Pointer tool''

In questo modo creare e provare se i programmi funzionano e' immediato! Non c'è nessun lungo tempo di compilazione da aspettare!

Struttura di una applicazione

In Livecode ogni finestra e come un mazzo di carte (stack), una stessa finestra puo' contenere diverse carte (card). Ogni carta e' una sorta di sottofinestra che contiene tutti gli oggetti che sono mostrati in quel momento. Quindi un programma puo' avere una o piu' finestre (mazzi o stack) e ogni finestra puo' cambiare completamente il suo aspetto semplicemente cambiano la carta che mostra.

All'inizio può sembrare complicato, ma in realta' questo sistema e' molto semplice ed anche molto utile.

Per iniziare, fate programmi dove ogni finestra contiene una sola "carta", poi dopo capirete perche' e' utile avere anche piu' carte disponibili in una finestra.

Il mazzo di carte che contiene tutti gli altri mazzi si chiama Mainstack, mentre tutti gli altri mazzi si chiamano ovviamente Substack.

All'interno delle carte mettete tutti gli oggetti che vi aggradano, ma se vi serve di agire su piu' oggetti insieme, li potete raggruppare in gruppi (group).

Livecode salva il vostro programma, anche se composto da tante finestre, sempre in un unico file.

Database

Si possono memorizzare molti dati in Livecode, ma potete anche usare i database. Livecode incorpora SQLite3 e si puo' interfacciare con:

  • MySQL
  • Oracle
  • PostgreSQL
  • Valentina
  • qualunque database che accetti una connessione ODBC

Livecode IDE

Livecode e' anche uno strumento integrato per sviluppare software:

Lo strumento Application browser, che trovate in Tools->Applicatio browser, vi permette di scorrere facilmente attraverso tutti gli elementi del vostro programma.

Menu bar

Il menubar contiene tutta una serie di menu e pulsanti per programmare in Livecode. Non sembra, ma e' il vero cuore di Livecode.

File

Il File menu ha tutta una serie di voci per l'apertura e il salvataggio dei file, l'esportazione del programma in formati nativi di altri sistemi operativi.

Qui di seguito vi spiego i comandi principali:

  • New Main Stack: crea un nuovo programma da zero
  • New Sub stack: crea una nuova finestra (sotto mazzo)
  • Save Salva il file. Ricordate che Livecode non ha il salvataggio automatico, quindi salvate spesso e fate copie di backup.
  • Stand alone application settings: questa voce e' molto importante, da qui potete impostare per quali sistemi operativi ottenere l'eseguibile autonomo, con quali impostazioni e molto altro.
  • Save as Stand alone application: questo e' il comando per ottenere gli eseguibili per i diversi sistemi operativi. In questo modo non c'e' bisogno di installare Livecode per farli girare.

Edit

Qui trovati le classiche voci Undo, Copia, Taglia e Incolla. Inoltre trovate Prefrences per impostare le vostre preferenze, io vi raccomando caldamente di levare la spunta dalla voce Livecode elementes UI appears in list of stack. In questo modo non modificherete Livecode e vi concentrerete solo sul vostro programma!

Un'altra funzione utile e' il Replicate, vi mette tante copie dell'oggetto selezionato a seguendo i parametriche impostate:

Tools

Qui potete passare da Run mode a Edit mode, usando Browser tool e Pointer tool. Inoltre potete lanciare il Application browser, per vedere e controllare tutti gli elementi del nostro programma, o il Project browser (che e' la stessa cosa ma con l'anteprima):


Application Browser

Project Browser

Qui trovate anche Message box, altro non e' che un terminale per provare righe di codice, o dove avere un output usando la parola put:

Un altro strumento molto utile in questo menu e' il Menu Builder, che vi permettedi creare quelle barre dei menu tanto comode (come "File, Edit, Help"):

Object

Questo menu contiene tutti una serie di comandi che e' molto piu' utile lanciare attraverso il tasto destro del mouse.

Text

Qui trovate tutta una serie di comandi che troverete negli inspector per le caratteristiche dei Font. L'unico comando che non troverete e' link che vi permette di dare l'aspetto di un link web ad una scritta o parte di essa.

Development

Qui trovate RevOnline, una specie di market totalmente gratuito dove potete prendere o condividere programmi. I vari programmi possono essere votati e commentati in modo da qualificarli meglio:

Inoltre trovate il comodissimo Object Library, un libreria di oggetti e immagini gia' pronte da utilizzare che amplia e completa tutta i comandi che potete inserire nei vostri programmi:

La voce Plugins contiene dei microprogrami per aiutarvi a programmare, dal righello al programma di salvataggio automatico.

Poi avete tutta una serie di strumenti per fare il debug (trovare errori) nei vostri programmi. Se attivate il Script Debug Mode, il programma si blocchera' raggiunto dei breakpoint che inserite nel codice.

Il Message Watcher e' uno strumento per capire cosa fa il vostro programma, fa vedere tutti i messaggi in ordine cronologico: i messaggi sono la serie di eventi di cui il programma si accorge e per cui reagisce:

Un'altra funzione utilissima e' Suspend development tools, che fa sparire tutti gli strumenti di Livecode, in modo da far eseguire il programma senza altri fronzoli.

View

Questo menu contiene tutti gli strumenti per vedere o nascondere determinati oggetti. Il comando piu' importante e' Show invisible objects, che vi permette di vedere anche gli oggetti impostati come invisibili: potrebbe capitarvi di aver impostato come invisibile l'oggetto sbagliato, in questo modo lo recupererete in un attimo.

Window

Questo menu contiene la lista delle finestre aperte, e ptete passare da l'una all'altra.

Help

Il menu Help e' tra i piu' utili, contiene tutta una serie di esempi e aiuti per programmare. Tra le varie edizioni di Livecode l'ordine delle voci cambia, ma piu' o meno in questa guida troverete tutto.

Dictionary

E' uno degli strumenti piu' importanti, e' un dizionario che contiene la lista di tutti i comandi, le variabili, le funzioni, gli oggetti di Livecode. Spiega tutto!

Ne esiste anche una versione su internet: http://docs.runrev.com/

Start Center

E' un menu contenente tutta una serie di link utili per chi e' agli inizi:

Altro

Poi ci sono tutta una serie di link per svariati aiuti, dalla newsletter al forum.

Code Editor

L'editor integrato in Livecode e' una della parti piu' importanti per programmare. Colora da solo le parole, indenta correttamente da solo le righe, spiega ogni parola mettendo il cursore su quella parola, elenca tutte le funzioni (o messaggi) della pagina corrente. E' utilissimo!

L'uniche cosa importanti da sapere sono:

  • CTRL+S salvate
  • di mettere la spunta alla casella Full Document in basso a destra per vedere la documentazione completa di quello che scrivete
  • CTRL+F cercate
  • premendo il tasto TAB della tastiera si sistema tutto il codice da solo con la giusta indentazione!

Creiamo il nostro primo programma

Apriamo Livecode e clicchiamo su File -> New Main Stack, ottenendo questo:

Ora trasciniamo un pulsante della finestra degli strumenti Tools sulla finestra del nostro programma (che per ora si chiama tristemente Untitled 1, cioe' "senza titolo 1"), ottenendo questo:

Ora clicchiamo con il pulsante destro sul bottone che abbiamo appena messo e clicchiamo sulla voce Edit script del menu che uscira' fuori:

Ora dovrebbe apparirci l'editor e scriviamo il seguente codice:

 on mouseUp
   answer  "Funziona! Ha cliccato sul pulsante!"
 end mouseUp

Bene, salviamo (CTRL+S).

Ora facciamo un piccolo ritocco sul pulsante, clicchiamo sempre con il destro sul nostro pulsante del programma e scegliamo Property Inspector, ci apparira' la seguente finestra:

Scriviamo "Clicca qui..." alla voce Label.

Ora salviamo il programma e proviamo il programma (CTRL+9). Se tutto e' andato per il verso giusto, dovremmo cliccando sul nostro pulsante dovremmo ottenere questo risultato:

Visto quanto e' semplice? Avete scritto solo una riga di codice!!

Nel seguito analizzeremo meglio come fare i programmi

Costruire un'interfaccia grafica

Costruire l'interfaccia grafica e' semplicissimo, basta trascinare gli elementi che vogliamo dalla barra 'Tool' al nostro programma.

In questo capitolo proveremo ad analizzare un po' tutti gli oggetti a disposizione.

La barra degli oggetti, o controlli, è divisa in varie sezioni:

  • pulsanti per passare da Run mode a Edit mode
  • controlli (pulsanti, campi di testo, ecc.)
  • elementi grafici
  • disegno a mano libera

Gli ultimi due li potete usare anche per creare disegni, grafici, videogiochi e molto altro. Questi ultimi due hanno dei pulsantini piu' piccoli per controllare spessore linea, colore e tipo di tratto.

Oggetti

Anche se vedete molti oggetti disponibili, molti sono lo stesso tipo con qualche opzione diversa, gli oggetti principali sono:

  • bottoni
  • campi di testo
  • tab panel
  • data grid
  • scrollbar
  • immagini
  • player multimediale (per audio e video)

Proprieta'

Cliccando sul tasto destro di un oggetto appare un menu a tendina, scegliendo Property inspector appare il menu delle proprieta':

Qui potete modificare tutto dell'oggetto, colore, dimensioni, posizione, il testo (Content) e tanto altro. Se premete il luccchetto, la finestra non cambiera' anche se selezionate un altro oggetto, questo vi permette di provare vari effetti. Dal primo menu a tendina potete accedere di solito ai seguenti sotto menu:

  • basic properties
  • icons & border
  • colors & patterns
  • custom properties
  • geometry
  • graphic effect
  • blending
  • property profiles
  • size & position
  • Text formatting

In seguito entreremo nel dettaglio.

Allineare

Se selezionate piu' di un oggetto alla volta nel menu delle proprieta' apparira' una voce in piu' per l'allineamento e garantire la stessa dimensione agli oggetti. In questo modo la vostra interfaccia grafica avra' uniformita'.

Tipi di finestre (stack)

Le finestre possono essere:

  • Top level: sono le finestre normali dei programmi,solo in questa modalita' possono essere modificate. Hanno i soliti pulsanti in alto per chiuderle e ridimensionarle.
  • Modeless: non hanno i pulsanti in alto per chiuderle e ridimensionarle. Ricordatevi sempre di aggiungere un modo per chiuderle!
  • Palette: per creare menu di aiuto, rimangono a lato della finestra principale ed e' sempre sopra a tutte le altre, non viene mai coperta.
  • Modal : si blocca tutto finchè non si chiudono. Non hanno nessun pulsante predefinito, servono per gli avvisi.

Per trasformarla da un modo ad un altro premete SHIFT+CTRL+tasto destro del mouse, vi apparira il menu con la voce Stack mode.

Interfacce gia' pronte

Ask

Il comando ask serve per generare una domanda:

 ask "Come ti chiami?"

La parte piu' bella che ha gia' pronta tutta una serie di icone per arricchire di grafica l'interfaccia:

  • information
  • question
  • error
  • warning

basta mettere il tipo di icona dopo ask, esempio:

 ask information "Come ti chiami?"

la risposta e' sempre memorizzata nella variabile temporanea it

Ask password

La classica interfaccia per chiedere le password, appaiono sullo schermo gli asterischi al posto delle lettere:

 ask password "Digitare password"

Ask file

Interfaccia comodissima per richiedere dove salvare un file:

 ask file "Dove salvo il file?"

potete anche aggiungere with per specificare un percorso o with filter per specificare un tipo di file:

 ask file "Dove si salvo il tuo diario?"  with filter "Text file, *.txt"

il formato del filtro prevede una descrizione del file (opzionale) e il tipo di estensione. Se volete indicare piu' tipi di file, inserite il punto e virgola, cosi':

 ask file "Dove si salvo il tuo diario?"  with filter  "*.txt;*.doc;*.odt"

Answer

Il comando answer fa apprire una finestra per inviare messaggi all'utente, contiene gia' il pulsante OK.

 answer "Hello"

anche qui possiamo usare le stesse icone di ask:

  • information
  • question
  • error
  • warning

la cosa carina e che possiamo mettere piu' pulsanti con testi molto simpatici usando la parola with

 answer question "Ti piace Livecode?" with "Poco" OR "Tanto" OR "Tantissimo"

Chiaramente il risultato viene memorizzato nella variabile it.

Answer file

E' la maschera per chiedere quale file aprire o leggere.

Answer folder

Il comando answer folder serve per chiedere una directory, esempio:

 answer folder "Quale dierctory contiene i tuoi appunti?"

Answer color

Il comando answer color lancia una finserta per scegliere il colore:

 answer color

Il colore scelto va sempre nella variabile it.

Potete anche decidere il colore di partenza con with:

 answer color with  125,3,255
 answer color with "#FF0033"

per indicare il colore di partenza o usate una tripletta da 0 a 255, che corrispondono alle concentrazioni di rosso, verde e blu; oppure il codice HTML del colore.

Answer printer

Il comando answer printer serve a impostare quale stamapre usare per stampare, comodissimo:

 answer printer

Answer page setup

Il comando answer page setup serve per impostare la pagina di stampa e le impostazioni connesse:

 answer page setup

Answer effect

Il comando answer effect e' il piu' complesso, permette di selezionare un effetto per il lettore multimediale. Il lettore multimediale predefinito e' Quicktime, ad esso si puo' imporre una serie di effetti:

 answer effect

l'effetto scelto sara' memorizzato nell variabile it sotto forma di dati binari e potra' essere usato per creare transizioni molto belle.

Gruppi

I gruppi sono oggetti raggruppati in un gruppo, per esempio i bottoni radio buttons vanno sempre racchiusi in un gruppo in modo che solo uno di loro alla volta si possa scegliere. Il vantaggio dei gruppi che si puo' scrivere uno script del gruppo che influenzi solo gli elementi del gruppo. Il groppo ha delle proprieta' comune a tutti gli oggetti al suo interno, quindi si possono far sparire e riapparire tutti insieme con un solo comando.

Per creare un gruppo basta selezionare piu' oggetti insieme e premere il pulsante Group del file menu, viceversa per annullare un gruppo basta selezionarlo e premere il pulsante Ungroup. Il pulsante Gruop diventa Ungroup quando selezionate un gruppo.

I gruppi possono contenere all'interno altri gruppi.

Un gruppo puo' essere condiviso (shared) con piu' carte.

Un gruppo che deve apparire su tutto le carte, cioe' condiviso su tutte le carte, si chiama background.

Carte

Ogni finestra (stack) contiene all'interno sempre almeno una carta (card). Sono le carte che contengono gli oggetti e i gruppi, Le carte sono numerate automaticamente a partire da 1. E' possibile vedere solo una carta alla volta. Per passare da una carta all'altra basta usare il comando go:

 go to card 2

chiaramente si puo' usare il comando go in varie maniere:

 go to stack "finestra comandi"
 go to card 3 of stack "finestra comandi"

Usare piu' carte su una finestra e' comodo anche per stampare, ogni carta e' una pagina da stampare, basta creare una carta per pagina e poi mandare in stampa l'intero stack:

 go to card 1
 open printing to pdf "./MiaStampaInPDF.pdf"
 print this stack   
 close printing

Immagini

Le immagini in Livecode possono essere utilizzate facendo riferimento a file esterni o incorporarli nel programma.

Fare riferimento a file esterni e' molto semplice:

  • trascinate il simbolo dell'immagine dal tool menu al vostro programma
  • aprite le proprieta' dell'immagine
  • premete sulla cartellina vicino al campo source indicando dove si trova l'immagine

Per incorporarli e' piu' complicato bisogna andare su File -> Import as Control -> Image File. Cercate sempre di usare immagini della dimensione giusta, sia perche' occupano meno spazio, sia perchè il motore grafico di ridimensionamento non e' il massimo.

Behavior

Il behavior e' una delle funzioni piu' importanti di Livecode. Immaginate di avere tanti oggetti che si devono comportare allo stesso modo, invece di scrivere il codice dentro ognuno di essi, basta prendere un pulsante e infilarci dentro tutto il codice che deve essere eseguito dai nostri oggetti, ed indicare ai nostri di usare il behavior di questo pulsante.Il behavior è l'ultimo campo delle proprieta' Basic properties, nel behavior va sempre inserito il long ID del nostro pulsante contenente tutti i comandi.

Facciamo un esempio:

  • creiamo due pulsanti
  • chiamiamoli comandante e soldato
  • in uno inseriamo nel pulsante comandante un script tipo:
 On MouseUp 
   answer the name of me
 End MouseUp
  • digitiamo nella message box
 put the long id of me
  • copiamo il risultato nel behavior del pulsante soldato
  • ora entrambi hanno lo stesso comportamento!

Scrivere il codice

Fino ad ora abbiamo visto cosa si puo' comporre con livecode, ma il codice da scrivere come e'? Da un lato il codice e' molto semplice e molto simile alla lingua inglese, riesce a ottenere processi complessi in poche riche; ma dall'altro per operazioni molto semplici puo' sembrare un po' prolisso.

Ad esempio per inderire il valore 5 nella variabile temp, il codice e':

 put 5 into temp

Un'altra differenza rispetto ad altri liguaggi e' che il codice (script) non e' scritto in un singolo file che viene eseguito dall'inizio alla fine, ma il codice deve essere sempre inserito in qualche oggetto che puo' essere lo stack, una carta, un gruppo o un oggetto. Questo perche' ogni azione dell'utente genere un evento, e gli eventi attivano i messaggi, e quindi il codice associato al messaggio verra' eseguito. Puo' sembra complicato, ma un esempio vi fara' capire come sia semplice e logico.

Il messaggio MouseUp si attiva quando l'utente clicca su un oggetto, quindi se scrivo nello script di un bottone:

 on MouseUp
   answer "Hai cliccato"
 end MouseUp

Cliccando sul pulsante mi fara' apparire un'altra finestra (comando answer) con la scritta "Hai cliccato". Possiamo mettere anche messaggi che richiamano messaggi:

 on MouseUp
   MioMessaggioPersonale
 end MouseUp

 on MioMessaggioPersonale
    answer "Hai cliccato"
 end MioMessaggioPersonale

Nei prossimi capitoli affronteremo meglio questo concetto. Per ora affrontiamo le basi del linguaggio di programmazione.

Variabili

Le variabili sono contenitori temporanei per i valori, possono essere chiamate con qualsiasi nome che cominci per una lettera, ad esempio: mario, Luigi2, pippo.3, etc. L'importante e che non comincino per "rev", le variabili che cominciano per rev sono riservate, la compagnia che possiede LiveCode si chiama RunRev e ha deciso che tutte le variabili interne iniziano per rev.

Per assegnare un valore ad una variabile, basta usare il comando put

 put "testo di esempio" into test

Le variabili non sono visibili al di fuori del messaggio in cui sono scritte, ad esempio:

 on MouseUp
   MioMessaggio
   answer temp
 end MouseUp

 on MioMessaggio
     put  1 into temp
     put 1 + temp into temp
 end MioMessaggio

Vi apparira' "temp" come risultato invece di 2, perche' nel messaggio MouseUp non e' stata indicata nessuna variabile di nome temp e quindi LiveCode la considera direttamente una stringa.

Se volete una variabile che sia visibile da altri messaggi o da altre parti del programma, dovete usare una custom property (proprieta' personalizzata). Che vedremo piu' avanti

Vettori e Matrici

Le variabili di solito contengono solo un valore, ma puo' far comodo che una singola variabile contenga molti valori, come un elenco telefonico, i dati di una tabella, le coordinate dei punti di un grafico, ecc. Per contenere molti valori si possono usare i vettori (matrici modimensionali) e le matrici (matrici multidimensionali). Anche in matematica esistono tantissime funzioni che operano direttamente sulle matrici.

I vettori o matrici monodimensionali sono variabili dove ogni valore dentro la variabile e' contrassegnato da un'etichetta; ad esempio il codice:

 put "esempio" into mioVettore["primo"]

inserice il valore esempio dentro la varibile mioVettore, etichettandolo con la parola primo.

Le matrici usano piu' etichette, ad esempio il codice:

  put "esempio2" into miaMatrice["primo"]["h"][4]

usa ben tre etichette per indicare dove si trova il valore dentro la variabile.

I dati delle matrici sono sottoforma di dati binari e non possono essere salvati cosi' come sono su disco, bisogna usare le funzioni arrayEncode() e arrayDecode() per trasformarle in una stringa che possa essere salvata o usata esternamente a LiveCode.

Potete svuotare il contenuto di un elemento dentro una matrice inserendo il valore empty, in questo modo l'etichetta rimarra', esempio:

 put empty  into miaMatrice["primo"]["h"][4]

mentre se volete cancellare anche l'etichetta, bisogna usare delete:

 delete variable miaMatrice["primo"]["h"][4]

Le etichette di una matrici si richiamano con la parola key:

 put the keys of miaMatrice into ListaEtichette

Potete anche richiamare solo alcune etichette, per esempio solo quelle che hanno gia' una etichetta, in pratica si fa cosi':

 put the keys of miaMatrice["primo"] into ListaEtichette

Anche un testo puo' essere convertito in una matrice usando il comando split, questo comando permette anche di indicare cosa interpretare quali caratteri interpretare come separatori per i valori e le etichette. Ad esempio il seguente testo:

 A 12
 B 13
 C 14

puo' essere trasformato in una matrice cosi':

 split testo by return and space

a questo punto la variabile testo e' diventata una matrice:

  • testo[A] = 12
  • testo[B] = 13
  • testo[C] = 14

Per trasformare una matrice in un testo, basta usare il comando combine nella stessa maniera di split:

 combine testo using return and space

E' anche possibile inserire una matrice dentro una matrice:

 put miaMatrice1 into MiaMatrice2["nodo51"]

Funzioni utili con le matrici

Alcune funzioni sono applicabili a tutti gli elementi di una matrice, in questo modo si risparmia tantissimo tempo! Ecco le funzioni piu' utili:

  • add somma o sottrae un numero a tutti gli elementi
  • multiply moltiplica tutti gli elementi per un numero. Se usato fra due matrici esegue un prodotto matriciale.
  • divide divide tutti gli elementi per un numero
  • sum fa la somma di tutti gli elementi
  • transpose fa la matrice trasposta di quella data
  • union unisce due matrici evitando chiavei duplicate, se gia' c'e' una chiave nella prima, non aggiunge nuovamente l'elemento della seconda.

Esempio:

  put 25 into myArr[1]
  put 50 into myArr[2]
  add 1 to myArr
  multiply myArr by 3
  divide myArr by 2
  answer "la somma di tutti gli elementi e': " & return  & sum(myArr)
  combine myArr with return and comma
  answer "La matrice ora e' composta cosi': " & return  & myArr
  put 25 into myArr[1]
  put 50 into myArr[2]
  put 75 into myArr2[2]
   put 100 into myArr2[3]
  union myArr with myArr2
  combine myArr with return and comma
  answer "L'unione di due matrici ha dato: " & return  & myArr

Proprieta'

Tutti gli oggetti hanno delle proprieta', per esempio visible e' una proprieta' che decide se un oggetto e' visibile o invisibile. Il comando set permette di impostare il valore di una proprieta', ad esempio il seguente codice permette di far diventare invisibile il pulsante "test":

 set the visible of button "test" to false

Per prendere il valore di una proprieta' basta usare put:

 put the visible of button "test" into temp

Di solito si mette il the davanti alle proprieta' per far capire che sono proprieta', abbellisce il codice e lo rende piu' leggibile.

Proprieta' personalizzate (custom property)

VIsto che le proprieta' sono visibili a tutti, si possono usare come variabili globali. Ogni volta che provate ad assegnare un valore ad un proprieta' che non esiste ad un oggetto, creerete automaticamente una proprieta' personalizzata; altrimenti andrete a modificare una proprieta'.

 set the miaproprieta of me to "questo e' un esempio"

Riferimenti

Come abbiamo visto quando si lavora con una proprieta', bisogna sempre indicare a chi si riferisce, possiamo indicare gli oggetti con:

  • me: rappresenta l'oggetto in cui si svolge lo script
  • this ....: di solito si riferisce a qualcosa in cui l'oggetto corrente e' contenuto, per esempio: this card, this stack, this group
  • ID 1234: Livecode numera automaticamente tutti gli oggetti in maniera univoca, ogni oggetto si puo' indicare con un ID seguito dal numero univoco. Personalmente sconsiglio questa tecnica, crea solo molta confusione.
  • button "nome": questa tecnica e' la migliore, si specifica il tipo di oggetto e il nome che gli avete dato: field "Esempio"

Commenti

I commenti sono parte di codice che non viene eseguito, serve per chiare al programmatore a cosa serve un comando, esitono molti modi per commentare in LiveCode, ad esempio con il simbolo cancelletto #:

 #il seguente messaggio serve per scrivermi
 on scrivi_a_max
    revMail  "angerangel@gmail.com"
     #non abusatene!
 end scrivi_a_max

I commenti si possono fare anche con il doppio meno e se dovete fare un commento molto lungo su piu' linee /* per aprire e */per chiudere, esempio:

 #Io sono un commento
 -- anche io sono un commento
 /*Io sono un commento
 molto molto
 molto lungo*/

I commenti possono essere usati per escludere del codice velocemente.

Messaggi

Come anticipato ogni evento fa scattare un messaggio, per esempio l'avvio di una finestra fa scattare il messaggio OpenStack.

Tutti i messaggi di uno oggetto sono disponibili agli oggetti contenuti in esso: ad esempio i messaggi di una finestra (stack) sono disponibili a tutti i bottoni, testi, immagini, gruppi, carte (card) all'interno della finestra. Quindi se create un messaggio in una finestra, tutti i bottoni di quella finestra potranno chiamarlo.

Viceversa se create un messaggio dentro un bottone, potra' essere chiamato solo dentro a quel bottone.

Se dentro un oggetto chiamate un messaggio con lo stesso nome di un altro, all'interno di quell'oggetto verra' eseguito quel messaggio e non quello del contenente... Ok sembra complicato, ma facciamo un esempio: un carta ha un messaggio che si chiama "test" che fa apparire la scritta "test", se un bottone ha un messaggio che si chiama "test" ma che fa apparire la scritta "test2", premendo il pulsante apparira' "test2".

LivCode legge tutti i messaggi degli oggetti mostrati, se qualche oggetto ha un messaggio attivato da un qualche evento, lo eseguira'. Ad esempio, il codice:

 on OpenStack
   answer "Finestra aperta"
 end OpenStack

puo' essere messo dentro un qualunque oggetto della finestra (immagini, bottoni, testi, campi...) e quando verra' aperta la finesta apparira' "Finestra aperta".

I messaggi possono avere degli argomenti, ad esempio:

 on MouseUp
    somma  1, 2
    somma
    somma 2
 end MouseUp

 on somma primo,secondo
    put primo + secondo into temp
    answer temp
 end somma

Gli argomenti si separano sempre con la virgola e non sono mai obbligatori.

E' possibile usare messaggi di altri oggetti basta usare send oppure call.

Funzioni

Le funzioni sono come i messaggi, solo che debbono ritornare un risultato. Ad esempio la funzione round() arrotonda al numero intero piu' vicino di quello indicato e si usa così:

 answer round(2.7) 

ma non potete usare una funzione come un messaggio:

 round(2.7) #ERRORE

per creare una funzione il codice e' il seguente:

 function miafunzione  parametro1
    put parametro1  * 3 + 4 into temp
    return temp
 end miafunzione

Se non mettete il return il valore di ritorno sara' vuoto (empty).

getProp

Le funzioni getprop si intromettono quando uno richiama una proprieta' (che sia personalizzata o meno). Sono molto utili per attivare una qualche funzione quando viene chiamata una proprieta', ma bisogna indicare sempre il valore di ritorno, altrimenti quella proprieta' risultera' vuota utilizzandola.

Ad esempio:

 on MouseUp
    put the miaprop of me into temp
    put temp
    answer temp
  end MouseUp

 getprop miaprop
    answer "attivato"
    put the miaprop of me into temp
    return temp
 end miaprop

SetProp

Similmente a getpropo anche le setprop si intromettono, ma solo quando viene imposto un valore ad una proprieta'. Anche in questo caso intromettendosi interrompo il normale flusso di dati e quindi bisogna inserire nel setprop il comando per cambiare il valore della proprieta' o usare pass, altrimenti non verra' cambiato. Ecco un esempio chiarificatore:

on MouseUp

   set the miaprop of me to "Esempio" 
   answer  the miaprop of me
 end MouseUp

  setprop miaprop parametro1
    answer "attivato"    
    set the miaprop of me to parametro1
 end miaprop

oppure

 on MouseUp
   set the miaprop of me to "Esempio2" 
   answer  the miaprop of me   
 end MouseUp

  setprop miaprop parametro1
    answer "attivato"    
    pass miaprop    
 end miaprop

Passare le variabili per referenza

Quando si scrive un programma di solito si passano le variabili da un messaggio ad un altro per valore, cioe' si copia il contenuto. In altri linguaggi di programmazione si puo' passare anche per referenza, e anche Livecode offre questa possibilita', ma io la sconsiglio fortemente. Passare le variabili per referenza rende il programma piu' difficile da leggere e puo' creare dei risultati assolutamente imprevedibili se si prova a migliorare il codice.

Esempio di variabili passata per valore:

 on MouseUp
   put "Esempio" into temp
   pervalore temp
   answer temp   
 end MouseUp

 on pervalore temp2
   put " testo aggiunto" after temp2
 end pervalore

esempio variabile passata per referenza:

 on MouseUp
   put "Esempio" into temp
   pervalore temp
   answer temp   
 end MouseUp

 on pervalore @temp2
   put " testo aggiunto" after temp2
 end pervalore

Come vedete per passare per referenza basta aggiungere una @ davanti alla variabile.

Scelte

In programmazione esistono sistemi di scelte che indicano al programma cosa fare a seconda di certe circostanze. LiveCode non e' da meno. Generalmente la condizion e' il valore di una variabile.

IF... THEN... ELSE

Il ciclo IF (l'italiano se) e' il ciclo di scelta piu' comune a tutti i linguaggi di programmazione. Ecco un esempio in Livecode:

 if miaVar is 3 then
    answer "MiaVar vale 3"
 else
    answer "MiaVar non vale 3, chissa' quanto vale?"
 end if

la condizione da controllare dopo IF puo' essere qualsiasi cosa: a>3, a="pittore", ecc. Else e' opzionale, potete non metterlo.

Switch

Switch si usa per fare una scelta quando i possibili valori di una variabile sono molti e per ognuno bisogna eseguire un'azione diversa.

Ad esempio controlliamo la variabile miaVar':

 switch miaVar
   case 3
       answer "miaVar vale 3"
       break
   case 4 
       answer "miaVar vale 4"
       break
   default
       answer "Non ho la piu' pallida idea di quanto valga miaVar"
 end switch

Come vedete dall'esempio ogni situazione indicata da case e' chiusa dalla parola break; se non si chiude la situazione, tutti i casi successivi sono eseguiti fino ad incontrare un break oppure un end switch. Alla fine si mette la condizione di default, cioe' che viene eseguita se gli altri casi non sono eseguiti.

Il comando break e' comodo, perche' omettendolo si possono costruire strutture di scelta molto articolate, ad esempio:

 put 80 into etti_di_pasta
 switch invitati
    case 4
        add 110 to etti_di_pasta
    case 3
         add 100 to etti_di_pasta
    case 2
          add 90 to etti_di_pasta
    case 1
          add 80 to etti_di_pasta
 end switch
 answer "Bisogna usare " & etti_di_pasta & " etti di pasta per " & invitati & " persone invitate"

WHILE

In programmazione la scelta while serve per ripetere una operazione fintanto che una certa condizione e' vera.

Ad esempio:

 put 1 into a
 repeat while a < 5
   add 1 to a
 end repeat
 put a

mostra come risultato 5.

UNTIL

Il comando until e' utilizzato per smettere di ripetere un'operazione quando una condizione diventa vera, ad esempio:

 put 1 into a
 repeat until a < 5
   add 1 to a
 end repeat
 put a

mostra come risultato 1. Il ciclo viene completamente ignorato perche' la condizione e' gia' vera.

Al contrario:

 put 1 into a
 repeat until a > 5
   add 1 to a
 end repeat
 put a

mostra come risultato 6.

Forever

E' il ciclo piu' pericoloso, se non mettete un modo per uscirne entrerete in un ciclo infinito da cui il programma non uscira' piu':

 put 0 into myVar
 repeat forever
  add 1 to myVar
  if myVar = 10 then
    exit repeat
  end if
 end repeat

Ripetere n volte

Potete usare repeat per ripetere un numero di volte una determinata operazione, esempio:

 put 0 into myVar
 repeat for 10 times
  answer myVar
  add 1 to myVar
 end repeat

Repeat WITH

E' una forma per utilizzare una variabile che tenga conto del numero di ciclo, e' molto personalizzabile questa forma, ad esempio:

 repeat with myVar=21 to 32
  answer myVar
 end repeat

vi mostrera' tutti i numeri da 21 a 32.

Mentre indicando l'incremento (step) potete fare:

 repeat with myVar=21 to 32 step 5
  answer myVar
 end repeat

questo esempio mostra 21, 26, 31 e 36!!! Questo perche' a 31 non ha raggiunto la fine ed esegue un altro ciclo!

si può anche andare all'indietro:

 repeat with myVar=21 down to 1 step -3
  answer myVar
 end repeat

FOR EACH

La forma con for each consente di sfruttare testi, liste o matrici (array).

Vediamo un testo formato da item (di solito gli item sono separati dalla virgola):

 put "red,green,blue" into myVar
 repeat for each item temp in myVar
  answer temp
 end repeat

vediamo ora come ripetere una operazione per ogni riga

put "Prima riga" & return & "Seconda riga" into myVar repeat for each line temp in myVar

  answer temp

end repeat

vediamo ora con le matrici:

 put 15 into myVar["Mario"]
 put 24 into myVar["Luigi"]
 repeat for each element temp in myVar
  answer temp
 end repeat

il risultato sara': 15 e poi 24.

Programmi temporizzati

Generalmente un programma esegue tutto il suo codice nel minore tempo possibile, senza interruzioni. In alcune situazioni puo' essere utile aspettare un certo lasso di tempo fra un evento ed un altro, oppure ripetere un messaggio di sveglia ogni cinque minuti.

Per esempio se vogliamo mandare un messaggio tra un po':

 send "updateStatus" to me in 20 seconds
 send "updateAnimation" to me in 33 milliseconds 

come vedete si puo' specificare il tempo in secondi o millisecondi

Per ripetere un messaggio ad intervalli di tempo, basta scrivere in un messaggio di rinviarsi tra un po':

 on MessaggioRipetuto
   answer "Va tutto bene"
   send MessaggioRipetuto to me in 30 seconds
 end MessaggioRipetuto

State attenti che in quest'ultimo caso, se non mettete qualcosa che interrompa il ciclo rischiate di entrate in un ciclo infinito. Esiste anche un'altra possibilita' per evitare i cicli infiniti, cancellare il messaggio, ma è piu' complicato e se mettete intervalli di tempo troppo brevi diventa quasi impossibile.

Vediamo come cancellare un messaggio temporizzato: ogni volta che un messaggio e' nella lista da inviare ha un identificativo unico che viene copiato nella variabile di sistema result. La variabile result contiene sempre il risultato dell'ultima operazione effettuata. Quindi per cancellare un messaggio basta memorizzare da qualche parte l'ID del messaggio e poi indicare al comando cancel l'ID del messaggio da cancellare, esempio:

  on EventoRipetuto
     answer "Messaggio ripetuto"
     send EventoRipetuto to me in 10 seconds
     set the idmessaggio of me to the result
  end EventoRipetuto

 on cancellamessaggio
   put the idmessaggio of me to IDmex
   cancel IDmex
 end cancellamessaggio

E' anche possibile visualizzare la lista di tutti i messaggi che sono stati temporizzati e che verranno lanciati nel futuro con la funzione 'thependingMessages, esempio:

 put the pendingMessages into messaggiCheVerrannoLanciati

ogni linea e' un messaggio che verra' lanciato, contenente varie informazioni tipo:

 69,1387277697.442,MouseUp,stack "C:/Programmi/RunRev/LiveCode Community 6.5/Toolset/revmessagebox.rev"

Il primo numero (69) e' l'ID per cancellarlo, il secondo e' la data nel formato UNIX date che (1387277697.442) che in questo questo caso rappresenta Tue, 17 Dec 2013 11:00:33 GMT; per finire abbiamo il messaggio da mandare e a quale stack.

Potete visualizzarli facilmente dalla message box , premendo il quinto pulsante (quello con la busta e il numero):

Manipolazione del testo

Un capitolo a parte merita la manipolazione del testo, Livecode puo' eseguire facilmente i compiti piu' impegnativi in questo campo.

Prima di tutto chiariamo quello che in Livecode si chiamano chunk expression, ovvero "pezzi di espressione". Nonostante possiate usare le espressioni regolari (regular expression o regex), Livecode vi permette di estrapolare o cercare dei testi utilizzando una sintassi molto semplice. I tipi di pezzi sono i seguenti:

  • char (lettera)
  • word (parola)
  • line (linea)
  • item (oggetto)
  • token (gettone)

Per esempio se volete la prima lettera di una frase, potete scrivere cosi':

 put the first char of  "Una frase di esempio"

oppure

 put char 1 of  "Una frase di esempio"

Lo stesso vale per le parole (word) e le linee (line).

Le lettere sono tutti i caratteri, sia stampabili che non stampabili.

Le parole sono identificati da insiemi di lettere separate da spazi, tabulazioni, o interruzioni di linea.

le linee sono identificati da interruzioni di linea, potete impostare diversamente la proprieta' lineDelimiter per secegliere un altro carattere che identifichi la separazioni tra le linee, ma io ve lo sconsiglio.

Gli item sono parole separate da virgola o da un altro carattere che potete specificare, ad esempio:

 put item 2 of "pane,casa,mela"

da come risultato "casa"; mentre specificando un altro carattere grazie alla proprieta' itemdel :

 set itemdel to "-"
 put item 2 of "pane-casa,mela"

da come risultato "casa,mela".

Cambiare itemDel e' molto comode per estrarre parti di testo.

Potete anche mischiare parole e numeri, ad esempio:

 put "Siamo in 133" into temp
 add 1 to word 3 of temp
 answer temp

da come risultato "Siamo in 134".

Il token o gettone e' un gruppo di lettere o uno dei seguenti simboli: =, +, -, *, /, [, ], (, ), {, }, <, >, e la virgola. In realta' e' poco utile per il programmatore, serve al linguaggio Livecode stesso per analizzare gli script, comunque la compagnia RunRev la lasciato disponibile anche agli altri programmatori. Ecco un esempio:

 put token 1 of "someFunction(a+b)" 
 # da someFunction
 put token 2 of "someFunction(a+b)" 
 # esce  (
 put token 3 of "someFunction(a+b)" 
 # esce a
 put token 3 of "a+b" 
 #esce  b

Potete usare anche parole come first (primo), last (ultimo) e middle, ad esempio:

 put last char of  "Ciao a tutti"
 # esce i
 put middle char of  "Ciao"
 #esce a
 put middle char of  "ABCDE"
 #esce C

Se usate numeri negativi, si comincia a contare dalla fine, ad esempio:

 put char -2 of  "ABCDE"
 # esce D

si possono anche mescolare le espressioni, ad esempio:

 put char 2 of word 3 of  "Ciao a tutti"
 # esce u

Se avete in mente espressioni molto complesse, potete usare le parentesi tonde per indicare come raggruppare e leggere correttamente il tutto: ad esempio se non usate le parentesi non potete scrivere:

 put item 2 of (word 3 of "A,B,C   I,J,K   X,Y,Z") 
 #esce Y

Potete anche indicare un inizio e una fine del testo da estrarre, ad esempio:

 put char 1 to 3 of "ABCDEF"
 # esce ABC
 put char 3 to -2 of "ABCDEFGH"
 #esce CDEFG

Un'altra parola che potete usare e' number, esempio:

 put the number of char of "ABCDEFG"
 # esce 7

Cercare

Potete cercare con le chunk expression, per esempio

 if "A" is in "ABC"  then
   answer "C'e' A"
 end if

mentre la seguente espressione e' falsa

 if "13" is in "123" then ...

la ricerca con le chunck expression non distingue fra maiuscole e minuscole, se volete invece distinguere basta impostare la prorieta' caseSensitive su verso (true), cosi':

 set the caseSensitive to true

Formato

Tutti i dati sono stringhe in qualche modo, quindi potete sempre fare dei test per vedere se sono anche:

  • True (vero)
  • False (falso)
  • a Number (numero)
  • an Integer (intero)
  • a Point (punto, quindi due coordinate separate da una virgola, tipo "10,15")
  • aRectangle (rettangolo, quindi 4 coordinate separate da virgole, tipo "10,15,24,5")
  • a Date (una data, esistono moti formati, tipo "5/12/13")
  • a Color (un colore, quindi 3 coordinate separate da virgole, tipo "10,15,240")

il codice per i test e' come il seguente:

 if "12" is a number then
   answer "12 e' un numero!!!"
 end if

Inizio e fine

Potete anche verificare se un testo comincia (begins) o finisce (ends) con una seri di caratteri, ad esempio

 if  "Mario dorme spesso" begins with "Mar" then ...
 if  "Mario dorme spesso" ends with "esso" then ...

Sostituzione del testo

Per la sostituzioni del testo esistono varie funzioni o comandi, cominciamo col piu' semplice '''replace. Questo comando sostituisce tutto le occorrenze indicate, ad esempio:

 put "Manda" into temp
 replace "A" with "O" in  temp
 put temp

notate che temp adesso contiene MOndO. Fate attenzione alla eventuale distinzione fra maiuscole e minuscole. Potete anche indicare espressioni parole piu' lunghe:

 put "Manda" into temp
 replace "nd" with "rsi" in  temp
 put temp
 #temp adeso contiene Marsia

certe volte per fare una sostituzione molto complicata conviene sapere dove si trova una determinata lettera, riga, parola o item; per questo esistono le seguenti funzioni:

  • offset() (lettere)
  • wordOffest() (parole)
  • lineOffset() (linee)
  • itemOffset() (item)

ad esempio:

 put offset("C","ABC")
 #esce 3

Espressioni regolari

Se la vostra ricerca e' molto complicata, potreste utilizzare le espressioni regolari, le espressioni regolari di LiveCode sono compatibili con quelle in PCRE (Perl), potete trovare una guida alle espressioni regolari su http://www.pcre.org/ e piu' in generale la mia guida su EspressioneRegolareRE.

La funzione matchText accetta espressioni regolari e puo' salvare i risultati, ad esempio

 matchText("06-54321","([0-9]+)-([0-9]+)",prefisso,numeroDiTelefono) 

memorizza ilprefisso e il numero di telefono in maniera separata dal numero. Chiaramente si ferma alla prima occorrenza trovata.

Potete anche sostituire il testo con la funzione replaceText utilizzando espressioni regolari.

Filtraggio

La funzione filter e' molto utile e molto rara in altri linguaggi di programmazione, permette di eliminare da un testo le righe che non vogliamo e prendere solo quelle che vogliamo. Ad esempio per eliminare le linee vuote di un testo basta:

 filter miotesto without empty lines

Se al contrario vogliamo solo le seguenti parole: rosa, rose; bastera':

 filter miotesto with "ros[ae]"

altri simboli accettati sono l'asterisco (*) e il punto di domanda (?).

L'asterisco sostituisce un qualunque numero di caratteri, quindi il seguente comando:

 filter miotesto with "AB*DE"

accetta sia "ABCDE", sia "ABCCCCDE", sia "ABzhjkDE".

Il punto di domanda sostituisce solo un carattere:

 filter miotesto with "AB?DE"

accetta sia "ABCDE", sia "ABZDE", ma non "ABzhjkDE".

Cancellare del testo

Usate ala parola 'delete per cancellare una parte del testo, ad esempio:

 put "Ciao a tutti" into esempio
 delete last char of esempio  # adesso e' "Ciao a tutt"
 delete word 2 of esempio # adesso e' "Ciao tutt"

Stile del testo

Potete cambiare lo stile del testo si applicando uno stile HTML che uno RTF. Facciamo un esempio:

 set the HTMLtext of field esempio to "<h1>Titolo</h1>testo normale<br>testo in <b>grassetto</b>"

Ecco il risultato:

Usate la proprieta' HtmlText se volete servirvi del codice HTML, mente utilizzate la proprieta' RTFtext se volete usare il codice RTF.

Potete inoltre cambiare gli stiliutilizzando gli stili livecode (proprieta textStyle), ad esempio il seguente codice funziona:

 set the textStyle of line 2 of field esempio to "bold" 

Ordinare i dati

Ordinare dati , righe, testi e' un'operazione importante ma anche semplice utilizzando il comando sort. Con sort potete operare su righe o items o entrambi, ma per semplicita' visiva cerchero' sempre di utilizzare le righe.Vediamo qualche esempio considerando il testo esempio cosi' composto:

 1 
 3
 5
 4
 2

poi proviamo ad ordinarle:

 sort lines of esempio

adesso esempio contiene

 1
 2
 3
 4
 5

possiamo invertire l'ordinamento

 sort  lines of  esempio descending

cosi' esempio contiene:

 5
 4
 3
 2
 1

NOTA: se si ha a che fare con i numeri, bisogna specificarlo. L'ordinamento di solito avviene secondo la modalità "testo". Il comando sort supporta le seguenti modalita':

  • text
  • numeric
  • dateTime

Esempi:

 sort  lines of  esempio descending
 5
 4
 3
 2
 10 

 sort  lines of  esempio descending numeric
 10
 5
 4
 3
 2

L'opzione piu' interessante e' che e' possibile specificare di ordinare le righe solo secondo elementi di ogni riga, utilizzando l'opzione by ... of each. Ad esempio prendiamo un testo fatto cosi':

 10, mario, 15/5/2010
 23, luigi, 10/2/2009
 30, andrea, 27/7/2013

ora proviamo ad ordinarlo secondo i nomi:

 sort lines of esempio by item 2 of each
 30, andrea, 27/7/2013
 23, luigi, 10/2/2009
 10, mario, 15/5/2010

si possono scrivere espressioni molto complesse:

 sort lines of fld 1 numeric by char 2 to -1 of the first item of each 

E' possibile anche ordinare in sequenza casuale, ecco un esempio:

 put the number of lines of esempio into numerorighe
 sort lines of esempio by random(numerorighe) 

L'esempio appena mostrato indica come sia possibili indicare una funzione per ordinare. In questo modo non avete limite alle possibilita' di ordinamento.

E' possibile anche mettere in ordine le carte (card) di una finestra (stack). Questa opzione è fondamentale quando volete creare delle stampe o dei PDF, ogni carta sara' una pagina, quindi e' estremamente importante che siano tutte nell'ordine giusto.

 sort cards of this stack

e' possibile ordinarle anche indicando un elemento della carta:

 sort cards by field "Cognome" 

Interfaccia grafica

In questo capitolo studieremo meglio gli aspetti riguardanti gli elementi grafici, come modificarli e piegarli al nostro volere con poche righe di codice:

Creare o cancellare oggetti

Potete creare oggetti con la parola create, ad esempio:

 create button "Esempio"

potete anche specificare dove usando la parola in.

Potete cancellare un oggetto con la parola delete:

 delete button "Esempio"

delete puo' essere usato anche per cancellare lettere, parole, item, ecc., dai testi.

Riferirsi agli oggetti

Ogni oggetto puo' essere indicato in diversi modi:

  • me (me)
  • this ... (questo ...)
  • the target (l'obbiettivo del messaggio corrente)
  • nome (ogni oggetto ha un nome)
  • ID (Livecode assegna un ID unico ad ogni elemento di una carta, ma l'ID si puo' ripetere in un'altra carta)
  • numero (Livecode assegna un numero progressivo ad ogni elemento, ma capire questo numero non e' molto semplice o affidabile. Potete usare anche parole che specificano un numero come first or last.)

vediamo praticamente:

 set the text of me to "Ciao a tutti"
 set the text of title of this stack to "Esempio"
 set the text of the target to "Ciao a tutti"
 set the text of field "CampoNome" to "Ciao a tutti"
 set the text of field ID 1062 to "Ciao a tutti"
 set the text of field 2 to "Ciao a tutti"

e' possibile, ma fortemente sconsigliata, usare la parola control invece che della parola che identifica il vostro oggetto (field, button, ecc.). Io lo sconsiglio perche' risulta poi impossibile capire eventuali errori di programmazione. Comunque ecco un esempio:

 set the text of control ID 1062 to "Ciao a tutti"

Chiaramente certe volte e' meglio specificare bene a quale oggetto facciamo riferimetno, altrimenti Livecode pensara' che stiamo parlando della carta corrente dello stack corrente; esempio:

 set the text of field "CampoCognome" of card "InserimentoDati" to "Ciao a tutti"
 set the text of field "CampoCognome" of card "InserimentoDati" of stack "FinestraPrincipale" to "Ciao a tutti"

Altri programmatori, ma io lo socnsiglio, prefriscono impostarre la variabile DefaultStack per indicare a che stack si riferiscono, ma anche qui io credo che crei non pochi problemi, se sfugge la riga con defaultstack,capire perche' un programma non funziona.

Quando un oggetto fa parte di un gruppo, potete specificarlo per evitare confusioni con eventuali omonimie:

 button "Guido" of group "Stereotipi"

Proprieta'

Come gia' accennato e' possibile accedere alle proprieta' piu' importanti dalla finestra Property Inspector, comunque ce ne sono molte di piu' per ogni oggetto. Ogni proprieta' puo' essere letta o impostata anche con un comando. Per leggere basta scrivere:

 put the text of field "esempio" into miaVariabile

Per impostare una proprieta' basta usare il comando set:

 set the text of field "esempio" to "Ciao a tutti"

Se impostate una proprieta' che prima non esisteva, creerete una Custom property che ritroverete nella lista delle custom property nel Property Inspector.

Alcune (rare) proprieta' molto critiche possono essere solo lette.

Le proprieta' possono contenere qualsiasi cosa: testi, numeri, dati, immaggini, file binari, array, qualsiasi cosa.

Certe proprieta' sono vuote (empty) nel senso che non si discostano dal comportamento standard. Ad esempio se creo un testo, la proprieta' testFont è vuota, nel senso che usa il font standard di Livecode (qualunque esso sia sul computer in uso, sulla versione di Livecode in uso), ma se per la mia applicazione ho la necessita' di sapere esattamente il font utilizzato, devo usare la parola effective. La parola effective ricerca esattamente il valore della proprieta', quidi:

 put the textFont of label "testo" into esempio  # cosi'  esempio non contiene nulla
 put the effective textFont of label "testo"  into esempio # cosi' esempio contiene "Helvetica"

Questo vale per tutte le proprieta'.

Proprieta' del testo

Al contrario di tutte le altre proprieta' il testo e' piu' versatile. E' possibile impostare le proprieta' dei testi, come ad esempio il font o la grandezza, sia a tutto il testo, sia separatamente ad ogni singolo caratte, parola, item o linea. Quindi tutti i seguenti comandi sono validi:

 set the textFont of word 3 of field "My Field" to "Courier"
 set the foregroundColor of line 1 of field 2 to "green"
 if the textStyle of the clickChunk is "bold" then beep 

chiaramente di un testo con diversi stili, grandezze dei font, ecc., chiedendo la proprieta' complessiva, otterremo come risposta: "mixed".

Modificare i template

Ogni novo oggetto che viene creato parte da tutta una serie di impostazione da un modello chiamato template. Alcuni programmatori sostengono che sia meglio cambiare il template e poi creare gli oggetti. La mia personale opinione e' che a meno di progetti molto grandi dove bisogna persoanlizzare tutto, il template e' meglio lasciarlo cosi' come e'.

Comunqe se siete interessati a cambiare il template, basta aggiungere la prefisso template all'oggetto della proprieta' che intendete modificare per modificarne il template. Ad esempio

 set the text of templateField to "prova testo"

Per fortuna se fate pasticci la parola reset vi viene in aiuto, ripristinando il template allo stato originario:

 reset the templateField

Salvare le proprieta'

Puo' essee comodo salvare tutte le proprieta di un oggetto (comprese le custom) in un singolo array (matrice), per farlo basta scrivere:

 put the properties of  field "esempio" into backupProprieta

Come vedete con la parola properties prendete tutte le proprieta' in una volta sola. E potete anche impostare tutte le proprieta' di un oggetto in questa maniera.

Profili delle proprieta'

I profili servono per memorizzare tutta una serie di proprieta' di un oggetto e cambiarle tutte insieme. Tipicamente sono utilizzate per cambiare lalingua del programma o per personalizzare l'interfaccia come le "skin" dei programmi. Il profilo Master e' quello di partenza. Il profilo e' sempre memorizzato nella proprieta' revProfile. Se abbiamo un profilo per un pulsante chiamato Profilo1 bastera' scrivere:

 set the revProfile of button "esempio" to "Profilo1"

La cosa interessante per i profili, che e' possibili applicarli a tutti gli oggetti della carta corrente di una finestra. In questo modo e' molto piu' semplice cambiare le proprieta di tutti gli oggetti in un attimo. Per fare questo e' necessario usare il comando revSetCardProfile cosi':

 revSetCardProfile "Profilo1","StackdellaFinestra"  #bisogna indicare lo stack, non la carta

ma attenzione, gli oggetti devono gia' avere quel profilo dentro di loro su cui cambiare, altrimenti rimarrano come sono.

Per cambiare tutti gli oggetti di uno stack su un profilo si usa il comando revSetStackProfile , cosi':

 revSetStackProfile "Profilo1","MioStack"

ma attenzione, gli oggetti devono gia' avere quel profilo dentro di loro su cui cambiare, altrimenti rimarrano come sono.

Per creare un profilo, oltre a farlo graficamente con il Properties Inspector (e' molto istruttivo farlo, provateci almeno una volta graficamente), potete farlo con il codice revProfile. Ma solo se avete attivato la voce Create profiles automatically nel pannello delle preferenze:

Questo perche' il comando per creare un nuovo profilo non c'e' e quindi bisogna utilizzare quello per impostare il profilo. Per evitare confusioni o problemi, di solito, quando si imposta un profilo che non esiste, non succede nulla, mentre con questa opzione attiva si crea un nuovo profilo:

 set the revProfile of button "bottoneEsempio" to "NuovoProfilo"

tutto qua.

La stessa opzione sipuo' configurare con il seguente codice (impostare true o false a seconda dell'esigenza):

 global gRevProfileReadOnlyput true into gRevProfileReadOnly 

Muovere le finestre

Un metodo per muovere le finestre e' impostare la proprieta' loc (location), che rappresenta il centro della finestra. Per esempio per mettere al centro dello schermo una finserta, basta scrivere:

 set the location of stack "esempio" to the screenLoc 

perche' screenLoc e' il centro dello schermo.

Ridimensionare le finestre

Un modo veloce per impostare le dimensioni di una finestra e' dire la posizione dei sue angoli estremi della finestra si usa la proprieta' rectangle, per esempio per metterli al punto (100,100) e (600,200) bastera':

 set the rectangle of this stack to "100,100,600,200" 

Pulsanti del titolo

Potete anche indicare i pulsanti che debbono apparire nella finestra, basta indicarli con una serie di valori divisi dalla virgola, esempio:

 set the decorations of stack "Gamma" to "title,minimize" 

Finestre ridimensionabili

Per impedire o permettere di ridimensionare una finestra, basta impostare la proprieta' resizable su true o false:

 set the resizable of this stack to false

Finestre irregolari o semitrasparenti

E' possibile dare qualsiasi forma alle finestre, anche con buchi, per esempio un ovale:

Basta creare un'immagine con delle parti trasparenti (con il formato PNG), poi caricarla nel programma con il comando File->Import as Control->Image file, e infine vedere l'ID assegnato da Livecode all'immagine importata. Fatto cio' basta impostare la proprieta' windowshape' all'ID dell'imagine, esempio:

 set the windowshape of this stack to ID 1008

Spostare gli oggetti col mouse (drag)

Per attivare la funzione che permetta ad un oggetto di essere spostato o trascinato, basta aggiungere all'oggetto il seguente codice:

 on mouseDown
   grab me
 end mouseDown

Database

Livecode puo' lavorare con qualunque database. Livecode ha integrato SQLite, ma potete interfacciarci con qualunque database cha abbia una interfaccia ODBC (quasi tutti ce l'hanno), ecco i piu' popolari:

  • SQLite
  • MySQL
  • Oracle
  • PostgreSQL
  • Valentina

I database sono, di solito, dei file esterni al nostro programma che possono essere sullo stesso pc su cui gira il nostro programma o su un server remoto. I database contengono tantissime informazioni catalogate. Grazie ai database noi possiamo ricercare informazioni, inserire o cancellare dei dati, tutto secondo particolari criteri che impostiamo noi.

Il linguaggio utilizzato da quasi tutti i database è il SQL. Generalmente i comandi validi per un database, valgono anche per tutti gli altri.

Riassumendo in poche parole un database, si può affermare che si tratta di una raccolta di tabelle, dentro ogni tabella i dati sono organizzati per righe e per colonne.

I database hanno dei vantaggi:

  • veloci a trovare i dati che si servono tra migliaia di dati
  • occupano poco spazio
  • sono ottimizzati per fare il loro lavoro
  • sono velocissimi
  • si riescono ad incrociare i dati di piu' tabelle facilmente

Potreste fare le stesse cose di un database con una matrice, ma trattando molti dati, vi consiglio di imparare ad utilizzare i database.

Connessione

Per utilizzare un database bisogna prima connettersi ad un database, utilizzando la funzione revOpenDatabase() e memorizzare l'identificato della connessione. Per esempio con SQLite si scrivera':

 put revOpenDatabase("sqlite", "./mioDB.sqlite", , , , ) into connID

in questo esempio la variabile connID contiene l'identificativo della connessione (e' un semplice numero). Potete stabilire piu' connessioni contemporaneamente.

Interrogare

Per recuperare delle informazioni dal database, in gergo si dice interrogare, basta usare il comando la funzione revDataFromQuery, specificando come separare righe e colonne:

 put "SELECT * from utenti ; " into tSQL
 put revDataFromQuery(tab,return,connID,tSQL) into tRecords

in questo caso abbiamo che tRecords contiene tutti i dati dove ogni colonna e' separata dall'altro dal carattere TAB e ogni riga da un accapo. Questa forma potete cambiarla, ma e' molto comoda perchè permette di visualizzare i dati un un campo di testo come una vera tabella (field, label).

Eseguire

Per eseguire dei comandi che modificano in database, basta usare il comando revExecuteSQL, ad esempio:

 put "INSERT into users (name,surname) VALUES ('Jack','Sparrow')" into tSQL
 revExecuteSQL connID,tSQL

Stampare e PDF

Stampare e' semplicissimo, di solito si crea una o piu' carte (card) e si mandano in stampa. La semplicita' di Livecode vi permettera' di creare anche dei report complicatissimi. Stampare significa che potete anche creare dei PDF. L'unica differenza tra la stampa normale e creare un PDF e' nel dispositivo di stampa che sara' il programma per i PDF incluso in Livecode invece di una stampante.

Livecode vi permette di impostare parecchi aspetti della stampante o anche di stampare solo quello dentro ad un determinato rettangolo o solo il contenuto di un campo di testo (field).

Impostare la stampante

Innanzitutto potete scegliere la stampante da utilizzare. Per avere una lista delle stampanti basta usare la proprieta' availablePrinters:

 put the availablePrinters into field "lista stampanti" 

e dovreste ottenere una lista tipo:

 \\RMCSERVER01\PRT_A4V
 PDFill PDF Writer
 Microsoft XPS Document Writer
 Microsoft Office Live Meeting Document Writer
 Microsoft Office Live Meeting 2007 Document Writer
 Microsoft Office Document Image Writer
 Lexmark T640 XL
 ImagePrinter
 Automatico Lexmark T640 su PC22
 Automatico HP LaserJet 2200 Series PCL 6 su RMCSERVER01
 Automatico HP Color LaserJet 3550 su RMCSERVER01
 Adobe PDF

Per impostare una stampante basta impostare la proprieta' printerName:

 set the printerName to "Lexmark T640 XL"

Poi potete scoprire che opzioni ha la vostra stampante con la proprieta' printerFeatures:

 put the printerFeatures

nel mio caso e' uscito:

 collate,copies

Cosi' sapete cosa potete attivare della stampante. Nel mio caso e' possibile dire quante copie fare di una stampa (in modo da non dover mandare in stampa tante volte lo stesso documento) e nel caso di copie e' possibile scegliere se stampa prima tutte le prime pagine, poi tutte le seconde, poi tutte le terze, oppure stampa dalla prima all'ultima e ricomincia per ogni copia (opzione collate).

Altre opzioni potrebbero essere "color" (a colori), "duplex" (fronte retro), ogni stampante ha le sue.

Se volete far scegliere all'utente, Livecode ha gia' tutto pronto, basta usare:

 answer printer

e apparira':

Piu' semplice di cosi' non e' possibile.

Nel medesimo modo per far impostare all'utente di impostare le opzioni di pagina:

 answer page setup 

e apparira':

Salvare tutte le impostazioni

Tutte le impostazione di stampa sono memorizzate nella proprieta' globale printerSettings. Questa variabile contiene tutti i dati possibili sulla stampa, ma e' scritto in codice macchina, quindi non pensate che si possa modificare facilmente. Di contro e' comoda per salvare tutte le impostazioni e recuperarle in un secondo momento. Se cambiate pc o sistema operativo, questa proprieta' cambia.

Impostazioni avanzate

Potete recuperare l'effettiva area di stampa sul foglio dalla proprieta': printRectangle. Non confondetelo con la proprieta' printPaperRectangle, quest'ultima indica solo le dimensioni del foglio di stampa, ma non l'area effettivamente stampabile. Molte stampanti, infatti, non riescono a stampare su tutto il foglio.

L'orientamento di stampa si imposta con: printPaperOrientation. Potete solo scegliere tra portrait (verticale), landscape (orizzontale), reverse portrait (verticale dall'altro lato), reverse landscape (orizzontale dall'altro lato). Esempio:

 set the printPaperOrientation to "landscape" 

Il fattore di scala si imposta con: printPaperScale. Potete impostare un valore usando un numero decimale (1, 0.5, 3, 0.21, ecc.)

Il numero di copie si imposta con: printCopies . Ricordatevi di impostare printCollate opportunamente (true o false).

Per scegliere se stampare a colori o in bianco e nero impostare: printColors (true o false).

Quando si stampa con un PC, il sistema applica un titolo di riconoscimento al lavoro di stampa (job), potete impostare questo titolo con la proprieta': printTitle

Stampare

Per stampare basta usare il comando print. Ecco alcuni esempi:

 print this card
 print card 12
 print this stack

Come vedete potete stampare o solo una carta o tutte le carte di una finestra (stack). Quando stampate le carte di una finestra, andate sempre alla prima card che volete che sia stampata, le altre seguiranno l'ordine numerico:

 go to card 1
 print this stack

Prima di stampare impostate formatForPrinting su true, in questo modo tutti i font saranno quelli per la stampa, poi rimetteteli su false.

Creare PDF

Per creare i PDF basta lanciare i seguenti comandi, ad esempio:

 open printing to pdf "./esempio.pdf"
 print this stack
 close printing

Stampare solo il testo un campo

Certe volte vi potrebbe servire di stampare solo il contenuto di un campo, basta usare revPrintField

 revPrintField the long id of field "text document" 

C'e' anche revPrintText che ha piu' opzioni.

Creare un eseguibile

Gli script Livecode di solto girano solo se avete installato Livecode sul vostro PC. Livecode vi permetto comunque di creare dei programmi eseguibili per ogni tipo di PC senza che ci sia installato Livecode. Andate su File->StandAlone Application settings e decidete per quali sistemi operativi volete creare l'eseguibile ed eventuali opzioni. Una volta fatto cio' andate su File->Save as standalone e il vostro programma sara' creato all'istante.

Scrivere o leggere un file

Quandi indicate un file o una directory, potete utilizzare sia un percorso relativo,che un percorso assoluto. Quando usate un percorso relativo, esso parte dalla cartella DefaultFolder; quindi se non sapete qual è questa cartella sul sistema operativo corrente, vi conviene impostarlo come la cartella del vostro eseguibile con il seguente codice:

 On OpenStack
   set itemDel to "/"   
   set the defaultFolder to item 1 to -2 of (the effective fileName of this stack)
 end OpenStack

per savare basta usare put e URL insieme:

 put  "testo di esempio" into URL "binfile:esempio.txt"

potete usare put sia per testi che per file binari, ricordate sempre scrivere binfile: prima del nome del file.

Allo stesso modo potete leggere i file:

 put  URL "binfile:esempio.txt" into esempio

NOTA: per chi usa il Mac c'e' e ci sara sempre un problema con i nomi, perche' il Mac permette di usare il simbolo "/" (slash) per i nomi dei files, ma questo crea sempre molta ambiguita' sui percorsi. Livecode cerca di superarla sostituendo automaticamente il carattere "/" con i due punti ":". Siccome il due punti sono vietati su Mac, l'ambiguita' e' risolta. Comunque evitate di usare il carattere slash (/)con i nomi, crea solo confusione.

Rinominare

Per rinominare, basta utilizzare il comando rename:

 rename "esempio.txt" to "esempio2.txt"
 rename folder "/Volumes/Disk/Applications/MyApp/" to "/Volumes/Disk/Applications/OtherApp/" 

Cancellare

Per cancellare basta usare il comando delete:

 delete URL "binfile:../mytext.txt" 

Cartelle speciali

Livecode utilizza delle scorciatoie per delle cartelle predefinite, esempi:

 put specialFolderPath("Desktop") into myPath 
 put specialFolderPath("Start") into myPath 
 put the DefaultFolder into myPath

Internet

Utilizzando la parola URL potete interagire su internet, per esempio se volete leggere il contenuto di una pagina potete scrivere:

 put URL "https://www.maxvessi.net/pmwiki/pmwiki.php" into miaVar

potete anche utilizzare il protocollo ftp:

 put URL "ftp://www.maxvessi.net/esempio.pdf" into miaVar

potete anche inviare file sia con protocollo http (la maggior parte dei server non lo permette), sia con protocollo ftp:

 put "Testo di esempio" into URL "https://www.maxvessi.net/esempio.txt" 
 put "Testo di esempio" into URL "ftp://user:password@ftp.maxvessi.net/esempio.txt" 

Se inviate un file in una directory che non esiste, la directory verra' creata automaticamente. Il metodo migliore per creare una directory e' inviandogli empty come file:

 put  empty into URL "ftp://user:password@ftp.maxvessi.net/nuovacartella/" 

NOTA: Se volete usare nomi con caratteri speciali o spazi in un URL, potete passare attraverso la funzione URLEncode:

 put URLEncode("ftp://user:password@ftp.maxvessi.net/nuovacartella/Nuova cartella/") into miourl
 put  empty into URL miourl

Trasferimenti in background e copia cache

Potete mettere a scaricare uno o piu' file senza bloccare il programma in attesa di aver scaricato tutti i file. Un altro vantaggio e' la possibilita' di poter vedere lo stato di avanzamento di uno scaricamento.

Il comando per scaricare e' load:

 load URL "http://www.example.com/index.html"
 load URL "http://www.example.com/test.html" with message "myUrlDownloadFinished"
 on myUrlDownloadFinished
   answer "Scaricamento finito" with "OK"
 end myUrlDownloadFinished

Notate come potete impostare un messaggio che si attivi alla fine dello scaricamento; questo messaggio potrebbe far apparire una finestra o attivare altre funzioni del programma. Il comando load non salva l file in una variabile effettiva, ma copia la pagine o il file in una memoria comune (cache) in modo che non sia piu' necessario scaricarla, quindi per utilizzarla bisogna scrivere put come al solito:

  load URL "http://www.example.com/index.html"
  put URL "http://www.example.com/index.html" into var1

come vedete apparentemente il codice sembra che carichi la pagina dentro la variabile var1 come al solito, in realta' la pagina e' stata prima copiata in na memoria interna, in gergo copia cache, e poi non ogni volta che viene richiamata viene presa la copia cache. Il vantaggio e' duplice: potete richiamare la pagina anche cento volte senza doverla leggere dal sito ogni volta, potete inoltre mettere in cache tante pagine senza bloccare l'esecuzione del programma.

Usando il comando load potete anche sapere se ci sono stati problemi con lo scaricamento grazie alla proprieta' URLStatus:

 load URL "http://www.example.com/index.html"
 put the URLStatus of  "http://www.example.com/index.html" into esempioStatus

la proprieta' URLStatus puo' assumere i seguenti valori:

  • queued - e' ancora nella lista delle pagine da scaricare
  • contacted - il sito esiste, ma ancora non la scaricato
  • requested - il link e' stato richiesto
  • loading, bytes, Totalbytes - sta ricevendo un file grosso , indica quanti byte ha ricevuto e quanto e' il totale di byte del file
  • uploading, bytes, bytesTotal -sta inviano un file, indica quanti byte ha inviato e quanto e' il totale di byte del file
  • cached - la pagina e' nella cache e completo
  • uploaded - il file e' stato caricato
  • error - c'e' stato un errore e non e' stato trasferito
  • timeout - errore di time out, puo' essere dovuto a tanti fattori, anche ad una connessione troppo lenta
  • empty - e' stato elimanto dalla cache o non c'e'

Chiaramente non ha senso tenere impegnata la memoria cache se non avete piu' intenzione di leggere una determinata pagina o risorsa, per questo motivo potete cancellarla dalla cache o interrompere il suo scaricamento con il comando unload:

  unload URL "http://www.example.com/index.html"

Aprire il browser

Per aprire il browser del vostro sistema operativo basta usare il comando launch:

 launch URL "https://www.maxvessi.net"

Inviare email

Per inviare email il metodo migliore e' utilizzare il comando launch, ad esempio il seguente comando scrive ad una serie di persone sia direttamente, che in copia e copia nascosta:

 launch url "someone@example.com,anotherone@example.com?cc=someoneelse@example.com&bcc=andsomeoneelse@example.com&subject=Summer%20Party&body=You%20are%20invited%20to%20a%20big%20summer%20party!"

E apparira':

TO: someone@example.com,anotherone@example.com
CC: someoneelse@example.com
BCC: andsomeoneelse@example.com
Subject: Summer Party
You are invited to a big summer party!

Riempire i dati di un form web e altro ancora

Tutti i comandi che cominciano per libURL vi permetto di fare cose incredibili via internet, cercateli sul dizionario. Potrete interagire con i siti e creare applicazioni distribuite e per cloud. Potete utilizzare anche i socket, ecco alcuni esempi:

 open socket (tIPAddress & ":" & tPort) with message "chatConnected" 
 on chatConnected pSocket
    read from socket pSocket with message chatReceived
 end chatConnected 
 on chatReceived pSocket, pData
   put pData after field "chat output"
   read from socket pSocket with message "chatReceived"
 end chatReceived 
 write field "chat text" to socket tSocket 
 close socket (tIDAddress & ":" & tPort) 

Uso da linea di comando

Livecode e' un linguaggio di programmazione grandioso per programmi grafici, comunque puo' essere utilizzato anche da linea di comando. Se per esempio scrivete un programma e lo chiamate "esempio.livecode" potete lanciarlo da line dicomando cosi':

 livecode  esempio.livecode

se poi il vostro programma ha bisogno di parametri, potete metterli dopo, esempio:

 livecode  esempio.livecode param1 -h 52 --parametro-4

ogni parametro e' memorizzato in una variabile globale sempre accessibile numerata, nell'esempio precedente abbiamo:

  • $0 = esempio.livecode (il nome del programma)
  • $1 = "param1" (primo parametro)
  • $2 = "-h" (secondo parametro)
  • $3 = "52" (terzo parametro)
  • $4 = "--parametro-4" (quarto parametro)

Potete anche utilizzare il terminale da dentro il vostro programma, sfruttando la funzione shell(); ecco un esempio su Linux:

 put shell("ls -a") into listafiles

l'unico inconveniente di shell() e' che il programma si blocca finche' non ha finito di eseguire il comando.

Un altro modo per poter interagire con il sistema operativo e' il comando launch. Potete lanciare altri programmi, esempio:

 launch "/home/max/esempio.txt" with "/usr/bin/gedit" 

se il sistema operativo ha associato un programma predefinito a certi tipi di file, potete semplicemente lanciare il file con la parola document; esempio:

 launch document "C:/documento.pdf" 

per avviare il browser predefinito basta usare la parola URL:

 launch URL "http://www.livecode.com/" 

Plugin

Potete scrivere plug in (componenti aggiuntivi) per il vostro Livecode IDE semplicemente copiando il file del vostro programma nella cartella Plugins di Livecode.

Una volta fatto cio' troverete il vostro plugin nella lista del menu Development -> Plugins. Nel menu Development -> Plugins-> Plugin Settings potete decidere quali plugin avviare automaticamente insieme a Livecode.

Lavorare con le immagini

Livecode supporta tantissimi tipi di immagini, chiaramente il formato migliore e' il PNG che ha anche le trasparenze. Ecco i principali:

  • PNG
  • JPEG
  • GIF
  • BMP
  • PBM
  • PGM
  • PPM
  • XBM
  • XPM
  • XWD
  • PICT

Importare immagini

Per importare immagini dentro il vostro programma, basta andare su File -> Import As Control -> Image File. L'immagine sara' caricata dentro Livecode e apparira' nella finestra corrente. All'immagine sara' anche assegnato un ID che potrete usare come riferimento ogni volta che vorrete usarla.

Si puo' importare un'immagine anche solo come riferimento, ma non viene salvata dentro al programma, viene memorizzato solo il percorso relativo della sua posizione. Io sconsiglio questo modo, perche' se spostate la cartella del programma, non ritroverete piu' le immagini. Importarle per riferimento ha senso solo se avete migliaia di immagini e non volete appesantire troppo il programma.

Potete importare anche un'istantanea dello schermo (screenshot), basta andare su File -> Import AsControl -> Snapshot, oppure con il comando:

 import snapshot from 100,100,200,200 

Creare immagini

Se inserite nella finestra un'immagine (vuota o piena), potete modificarla con gli strumenti per disegnare della Tool palette.

Se volete potete anche crearla con il codice vostro del programma, ad esempio:

 set the rect of the templateImage to 100,100,400,400
 create image "esempio"
 choose brush tool 
 set the brush to 8 
 set the brushColor to red 
 set the dragSpeed to 20 
 drag from "120,120" to "300,300"

Potete anche tagliare le immagini con crop e ruotarle con rotate.

Quando manipolatele immagini, cambiate il valore della proprieta' resizeQuality opportunamente.

Potete anche creare le immagini da estraendole da una porzione della finestra di un vostro programma, ad esempio:

 import snapshot from 100,100,200,200 of stack "Layout" 

oppure da un elemento:

 import snapshot from button 5 of stack "objects" 

Esportare immagini

Potete salvare le immagini in un file con la sintassi per scrivere i file:

 put image "miaimmagine" into URL "binfile:esempio.jpg" 

oppure esportare l'immagine di una finestra direttamente in un file con il comando export:

 export snapshot from the selectedObject to file "snap.jpg" as JPEG 

il comando export vi permette di decidere il formato dell'immagine.

Copia e incolla con le immagini

E' valido scrivere il seguente comando:

 put image 1 into image 2 

GIF animate

Le immagini GIF animate vi permetto di creare brevi animazioni. Potete utilizzarle come tutte le altre immagini, la proprieta' repeatCount vi permette di decidere quante volte ripeterel'animazione; il valore 0 blocca l'animazione, il valore -1 vi permette di ripetere l'animazione all'infinito.

Immagini vettoriali

Potete creare immagini vettoriali (quelle che non sgranano ingrandendole) sia con gli strumenti presenti nella Tool palette che il codice di programmazione.

Lavorare con Video e Audio

Per i video Livecode si appoggia a:

  • QuickTime, su Windows e Mac
  • Mplayer su Linux

in questo modo potete sfruttare ogni tipo di file riconosciuto da questi lettori (MP£, MP4, AVI, ...). Per sfruttare questa capacità basta creare un lettore, e' l'icona vicino a quella delle immagini nella Tool Palette', in questo modo vi ritroverete un player; oppure da codice:

 create player "esempio"
 set the filename of player "esempio" to "miofile.avi"
 set the currentTime of player "esempio" to zero
 start player "esempio"

per fermare un lettore basta usare il comando stop:

 stop player "esempio"

I comandi e le proprieta' dei lettori multimediali sono tantissime.

Audio

Per l'audio potete importare il file come le immagini: File -> Import as Control -> Audio File. Quindi basta usare il comando play senza dover scomodare un lettore apposito:

 play audioClip "esempio" 

per fermare l'audio basta aggiungere stop:

 play stop 

per impostare il volume basta usale la proprieta' playLoudness (si considera sempre un numero tra 0 e 100):

 set the playLoudness of audioclip "esempio" to 50  

Schermo intero

Per mettere un'applicazione a schermo intero, basta impostare la proprieta' fullScreen:

 set the fullScreen of this stack to true 

Librerie incluse

Livecode comprende comandi anche per:

  • compressione file
  • cifratura
  • checksum
  • XML
  • SSL
  • https
  • lettura testi, (text to speech)

Nel dizionario troverete tutte le spiegazioni.

comments powered by Disqus