giovedì 25 febbraio 2016

Proprietà flaggedRanges e flagged

Ho appena scoperto una proprietà interessante: flaggedRanges.
Questa proprietà permette di sottolineare tratteggiato in rosso parti di un testo senza andare ad intaccare la formattazione. Si tratta come di un velo sopra il testo, utilissimo per esempio per indicare le parole da correggere o altre funzioni con il testo, senza mettere mano ad esso.
La proprietà flaggedRanges, è composta da righe, ogni riga contiene due numeri che indicano il carattere iniziale e quello finale in cui mettere la sottolineatura.
Ad esempio il seguente codice:


set the flaggedranges of field 1 to ("28,32" & return & "58,62")


produce questo:
In alternativa si può usare la proprietà flagged, che produce gli stessi effetti:


set the flagged of word 7 of field 1 to true
set the flagged of word -1 of field 1 to true



mercoledì 24 febbraio 2016

Air Lauch

Provare le nostre app su iOS può essere frustrante: crea la app, collega il cavo, attiva un software per il trasferimento. Per fortuna esiste Air launch, che ci permette di inviare e testare le nostre app via WiFI, senza dover lasciare livecode.
Potete acquistare l'estensione per livecode Air Launch a $ 49 sul sito: http://www.hyperactivesw.com/airlaunch/index.html

lunedì 22 febbraio 2016

Novità

La società Livecode ha appena annunciato delle grosse novità. Ha assunto lo sviluppatore delle estensioni mergExt (http://mergext.com/) e quindi d'ora in poi saranno tutte incluse nelle versioni a pagamento (non nella versione gratuita open source).
Questo ha avuto anche delle ricadute sulla licenza a pagamento più economica, la indy: nei prossimi mesi il prezzo salirà da $ 499 l'anno prima a $ 599 e poi a $ 999.
Se siete interessati a scrivere programmi dove il codice è chiuso, forse vi conviene approfittare del prezzo basso, finchè rimane a $ 499.

giovedì 18 febbraio 2016

Ricerca file in windows

Le ultime versioni di Windows hanno reso praticamente impossibile trovare i file con gli strumenti di ricerca di Windows. Non funzionano, forse perchè si basano sull'indicizzazione, comunque è assicurato che non troverete mai più i vostri file facendo una semplice ricerca.
Per questo motivo ho deciso di scrivere un programma di ricerca files, per di più la ricerca del testo sarà sulle espressioni regolari, che sono molto più potenti delle semplice carattere jolly *.
Il programma ha questo aspetto:
Durante la ricerca le ultime due righe ci diranno quanti file sono stati analizzati e in che directory sta cercando; in questo modo ci rendiamo conto di cosa fa il programma.
Ho messo un campo dove indicare la directory di partenza (startingFolder) e un campo dove mettere il nome o l'espressione regolare del nome da cercare (nomeFile). Ad esempio per cercare tutte le immagine JPG basta indicare .*jpg.
Poi abbiamo un campo con i risultati (listaFiles) in cui facendo doppio clic su una riga si apre la cartella relativa. Per poter cliccare sulle righe il ListBehavoir della è impostato su vero. Il codice di questo campo è:

on MouseDoubleUp
   put the hilitedtext of me into temp
   replace "/" with "\" in temp
   set itemdel to "\"
   put item 1 to -2 of temp into temp
   put shell( "explorer " & quote & temp & quote) into temp
end MouseDoubleUp


Siccome lo uso su Windows lancio il programma di windows explorer per vedere la cartella, in Windows is fa così.
Se avessimo problemi con la ricerca, del tipo che non smette più di cercare, dobbiamo provvedere a mettere un pulsante per bloccare tutto, questo pulsante cambierà una proprietà che il programma continuerà a controllare per vedere se continuare o meno. Questa proprietà sarà avvio del pulsante find. Il codice del pulsante di stop sarà semplicemente:

on mouseUp
   if the avvio of button "Find" then
      answer warning "Search stopped"
      set the avvio of button "Find" to false
   end if
end mouseUp


Ora manca il codice per cercare il file, che metteremo dentro il pulsante find. Ecco il codice:

on mouseUp
   set the avvio of me to true
   put empty into field "listaFiles"
   put 0 into field "numFiles"
   cercafiles (field "startingFolder")
end mouseUp

on CercaFiles curFolder   
   put curFolder into field "curFolder"
   set the defaultFolder to curFolder
   put the files into temp
   put the text of field "nomeFile" into nomeFile
   if the hilite of button "Case sensitive" then
      put "(?i)" before nomeFile
   end if
   repeat for each line tLine in temp
      if the avvio of me is false then exit to top
      add 1 to field "NumFiles"
      if matchText(item 1 of tLine, nomeFile ) then
         put Curfolder & "/"& item 1 of tLine & return after field "listaFiles"
      end if      
   end repeat
   wait 0 with messages
   put the folders into temp2
   repeat for each line tLine2 in temp2
      if tLine2 is not "." and tLine2 is not ".." then
         cercaFiles   (curFolder & "/" & tLine2)
      end if
   end repeat
end CercaFiles


Notiamo i seguenti accorgimenti:

  • il messaggio cercaFiles è il messaggio che effettivamente ricerca i files
  • cercaFiles è un messaggio che richiama se stesso. Ogni volta farà la ricerca in una delle sotto cartelle della cartella di partenza
  • usiamo la funzione matchText() per fare il controllo con l'espressione regolare
  • se nella ricerca non vogliamo fare distinzioni fra lettere minuscole e maiuscole, anteponiamo la stringa (?i)
  • evitiamo di controllare le directory "." e ".." che sono la rappresentazione della directory corrente e di quella superiore, altrimenti creeremmo dei cicli infiniti. Queste directory sono sempre fornite dai sistemi operativi quando si chiede una lista di directory.
  • il codice wait 0 with messages è essenziale per poter interrompere il programma, altrimenti non controllerà abbastanza celermente altri messaggi, come quello del click sul pulsante stop per fermare i messaggi.
Il sorgente in livecode potete scaricarlo da qui: http://tinyurl.com/zogz64v
mentre l'eseguibile per windows da qui: http://tinyurl.com/jmqalpq

mercoledì 10 febbraio 2016

Lettore codice a barre e QR su iOS

Oggi presentiamo mergZXing, un'estensione per leggere codici a barre e codici QR con livecode su iOS.
La potete acquistare qui: http://mergext.com/home/mergzxing/ al costo di $49.
Una volta installata avete tutta una serie di funzioni e messaggi da poter sfruttare per leggere i codici a barre e i codici QR, tra cui:
  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 128
  • QR Code
  • ITF
  • Data Matrix
I comandi sono molto semplici, ad esempio:

put mergZXingGetBarcode() into tBarcode


vi crea un sistema per prendere il code e mette il risultato nella variabile tBarcode.

lunedì 8 febbraio 2016

Movimenti asincroni e sincroni

Alcuni programmi, come ad esempio i videogiochi, debbono muovere molti oggetti contemporaneamente. Se questi movimenti debbono essere sincronizzati, livecode permette di bloccare i movimenti con i comandi lock moves e unlock moves.
In pratica si bloccano tutti i movimenti (lock moves), si danno a tutti gli oggetti il comando di muoveri (move) e poi si lancia unlock moves. In questo modo i comandi di movimento verranno eseguiti contemporaneamente.
Esempio:

Se poi noi vogliamo mandare dei comandi asincroni, la questione è più complicata.
Ad esempio per ottenere il seguente programma:

bisogna considerare questo:
  • solo un movimento per messaggio
  • utilizzare l'opzione without waiting
  • calcolare il tempo del movimento
  • alla fine del messaggio, se servono altri movimenti, utilizzare send in xx sec per lanciare un altro messaggio contenente il nuovo movimento. La variabile xx deve essere il tempo per eseguire il movimento del messaggio corrente.
Il codice del programma asincrono è:

on mouseUp
   put the number of me into temp
   if the label of me is not "stop" then
      set the label of me to "STOP"
      set the backgroundColor of me to "red"
      set the muovi of me to true   
      movimento temp
   else
      stop moving graphic temp
      repeat for each line tLine in the dafare of me
         cancel tLine         
      end repeat
      set the dafare of me to empty
      set the label of me to "START"
      set the backgroundColor of me to "green"
      set the muovi of me to false
   end if   
end mouseUp

on movimento ogg
   #put ogg, temp
   put the loc of me into temp
   if the direzione of graphic ogg is "+" then
      set the direzione of graphic ogg to "-"
      add -70 to item 2 of temp
      move graphic ogg to temp   without waiting
   else
      set the direzione of graphic ogg to "+"
      add -156 to item 2 of temp
      move graphic ogg to temp   without waiting
   end if
   if the muovi of me then
      put the dafare of me into temp2
      send ("movimento " & ogg ) to me in 0.5 sec
      put the result & return after temp2
      set the dafare of me to temp2   
   end if
   #put temp
end movimento


mentre il codice del programma sincrono è:

on mouseUp
   lock moves
   repeat with i=1 to 8      
      send "movimento " & i to button i
   end repeat
   unlock moves
end mouseUp

venerdì 5 febbraio 2016

Stack utili

Voglio segnalarvi questa pagina: https://github.com/trozware/rev_stacks
è piena di programmi di esempio, tra cui i protocolli POP e SMTP per la posta elettronica.


Provare ad utilizzare i programmi proposti è estremamente utile!

martedì 2 febbraio 2016

Il suono sui dispositivi mobili

Oggi vediamo come fare del suono sui dispositivi mobili (Android e iOS).
Facciamo un pulsante e mettiamoci questo codice:

on mouseUp
   put (specialFolderPath("engine") & "/noise1.wav") into tPath
   put "noise1" into tChannelName
   put "now" into tType
   mobilePlaySoundOnChannel tPath, tChannelName, tType
end mouseUp

Il nostro programma suonerà il file noise1.wav.
Adesso facciamo altri pulsanti con altri suoni e uno con una musica di sottofondo, così vediamo come poter suonare più file contemporaneamente:
chiaramente dovremo cambiare il nome del file da suonare e il nome del canale da utilizzare. Ad esempio per la musica di sottofondo possiamo scrivere:

on mouseUp
   put (specialFolderPath("engine") & "/background.wav") into tPath
   put "background" into tChannelName
   put "now" into tType
   mobilePlaySoundOnChannel tPath, tChannelName, tType
end mouseUp

Se lo proviamo, vedremo che funziona tutto a meraviglia, perchè indicando un nome per un canale possiamo fare più suoni contemporaneamente. Ogni canale è come una voce, in modo che se mettiamo in fila su un canale tutta una serie di suoni, finchè non finisce un suono non partirà il successivo, mente le altre possono parlare.
Il caso tipico sono i videogiochi, dove alcuni personaggi fanno delle operazioni e relativi suoni in un certo ordine, mentre altri personaggi devono potersi sovrapporre o susseguire senza problemi.
Possiamo anche mettere in pausa, far proseguire o fermare del tutto un canale.
Ad esempio aggiungendo i seguenti pulsanti

e mettendo i seguenti codici:
pausa:

on mouseUp
   mobilePausePlayingOnChannel "background"
end mouseUp

resume:

on mouseUp
   mobileResumePlayingOnChannel "background"
end mouseUp

Mentre il pulsant della musica in sottofondo (background) lo possoamo trasformare così:


on mouseUp
   if (mobileSoundOnChannel("background") is empty) or (mobileSoundOnChannel("background") is "could not find channel") then
      put (specialFolderPath("engine") & "/background.wav") into tPath
      put "background" into tChannelName
      put "now" into tType
      mobilePlaySoundOnChannel tPath, tChannelName, tType
   else
      mobileStopPlayingOnChannel "background"
   end if
end mouseUp

Se usiamo il comando mobilePlaySoundOnChannel, possiamo utilizzare le opzioni:

  • now: per avviare immediatamente il suono 
  • next: per metterlo in code al canale scelto
  • looping: per metterlo in ciclo continuo, quando finisce ricomincia.

lunedì 1 febbraio 2016

Localizzatore Babbo Natale

Oggi vediamo come semplicemente utilizzando i gradiente sia possibile fare degli effetti tipo radar.
Ad esempio prendiamo il seguente programma: http://tinyurl.com/h62v7wm
Si tratta di un localizzatore di babbo Natale,  cioè un un finto radar, che comunque sfrutta i gradienti per degli ottimi effetti: