martedì 27 giugno 2017

Ridimensionare

Modificato
Quando una finestra si ridimensiona, se abbiamo impostato il geometry manager, tutti gli elementi scalano e si riposizionano automaticamente.
Se passate da una card ad un'altra, la nuova card non recepisce automaticamente la nuova impostazione delle dimensioni quando avete ridimensionato. Per aggirare questo fenomeno potete utlizzare questo trucco:


on OpenCard
   revUpdateGeometry
end OpenCard


Ne conoscete altri?

lunedì 26 giugno 2017

Ricerca binaria

La ricerca binaria o logaritmica è un modo di trovare un elemento in una lista molto velocemente, a patto che la lista sia ordinata.
Ecco un raffronto tra la velocità di ricerca normale e quella binaria:
Come potete vedere la velocità della ricerca binaria rimane stabile con il numero di elementi di una lista, mentre una ricerca eseguita in senso classico ha un tempo di ricerca che cresce linearmente col crescere della lista.
Il problema della ricerca di tipo binario è che ha bisogno di una lista ordinata (per valore, alfabeticamente, o qualsiasi altro ordinamento).
Per questo la ricerca di tipo binario porta grandi benefici quando la lista viene modificata raramente, mentre la ricerche sono molto più frequenti; altrimenti il tempo necessario ogni volta a riordinare la lista vanifica ogni vantaggio.
Se per esempio la lista è un array di livecode, per ordinarla è necessaria questa funzione:

function sortedArray @pArray   
   # fetch the keys and sort them using the array entry values   
   get the keys of pArray   
   sort lines of it by pArray[each]   
   split it by return   
   # create a new sorted array using the mapped keys   
   put 1 into tNextIndex
   repeat for each element tIndex in it      
      put pArray[tIndex] into tSortedArray[tNextIndex]      
      add 1 to tNextIndex      
   end repeat   
   return tSortedArray   
end sortedArray

Una volta ordinata la ricerca binaria può avvenire con questa funzione:

function logarithmicSearch @pArray, pItem, pLeft, pRight
   local tIndex
   local tResult
   # create a new range pointer that points to the item that lies
   # right between the left and right range pointers
   put round ((pLeft + pRight) / 2) into tIndex
   # if we have found the matching item then stop processing and return it
   if pArray[tIndex] = pItem then
      put tIndex into tResult
      # if any of the range pointers have the same value
      # then the item we are looking for does not exist in the array and we return 0
   else if (pLeft = pRight or pLeft = tIndex or pRight = tIndex) then
      put 0 into tResult
      # if we have not yet found a match and none of the range pointers have the same
      # value then call logarithmicSearch again with a smaller search range
      # we are effectively halving the search area, each time we call logarithmicSearch
   else if pArray[tIndex] > pItem then
      put logarithmicSearch (pArray, pItem, pLeft, tIndex) into tResult
   else
      put logarithmicSearch (pArray, pItem, tIndex, pRight) into tResult
   end if
   return tResult
end logarithmicSearch

Per chiamare la funzione bisogna indicare l'array, il valore cercato, zero e il numero di elementi dell'array, ad esempio:

put sortedArray(tArr) into tArr
put the number of lines of the keys of tArr into tnkeys
put logarithmicSearch (tArr, "testo da cercare", 0, tnkeys )


In alternativa a tutto ciò, vi ricordo che SQLite è integrato in livecode e permette delle ricerche molto veloci.

venerdì 16 giugno 2017

Proposta di lavoro

Keith J. Duggan è alla ricerca di un programmatore livecode per la seguente richiesta:

We are looking for a Rasperry PI specialist to develop firmware on a per project basis. The requirements of the firmware we need are basic power management and visual display. Since we are a funded start up, we will require an NDA for further information.
We are looking for a smart, go-getter type that is willing to grow with the company. This is a paid position, contract basis, based in Los Angeles.

Se siete interessati, potete scrivergli a: keithjduggan@mac.com

giovedì 15 giugno 2017

Lavorare con le matrici

La società EkkoTek ha sviluppato delle librerie aggiuntive per lavorare con le matrici, le potete rrovare qui: http://www.ekkotek.com/index.php?option=com_content&view=article&id=132&Itemid=1360

Questa libreria vi permette di:
  • creare matrici identità (tutti 1 sulla diagonale principale)
  • creare matrici Zero (tutti zero)
  • creare matrici casuali
  • creare matrici binarie casuali
  • fare la trasposta
  • aggiungere righe o colonne
  • rimuovere righe o colonne
  • add edge
  • addizione e sottrazione tra matrici
  • moltiplicazione e divisione per un scalare
  • divisione fra matrici
  • moltiplicazione  fra matrici
  • divisioni fra matrici sia da destra che da sinistra
  • addizione binarie
  • traslare
  • scalare
  • ruotare
Inoltre è disponibile anche un mini dizionario di riferimento.

La libreria è disponibile a pagamento solo per chi possiede un licenza commerciale di livecode.

martedì 13 giugno 2017

Clarify

Oggi vediamo il programma Clarify, serve per creare della documentazione in pochi minuti.
Il programma è stato scritto in livecode, ed è disponibile per Widnows e Mac.
In pratica potete creare delle pagine con testi, immagini, evidenziazioni e numeri in maniera molto veloce e intuitiva:
Potete scaricare Clarify per provarlo da qui: http://www.clarify-it.com

mercoledì 7 giugno 2017

Power tools

Oggi vi presento il PowerTool, si tratta di un pannello alternativo per livecode, più colorato e compatto, ma al tempo stesso semplice da usare, ecco alcune immagini:




Se volete lo potete scaricare da qui: http://www.ahsoftware.net/PowerTools/PowerTools.lc

martedì 30 maggio 2017

PowerDebug

Oggi vi presento un tool alternativo per fare il debug:
Si chiama PowerDebug e potete trovarlo qui: http://powerdebug.ahsoftware.net
Ha una serie di funzioni aggiuntive rispetto al debug dell'IDE di livecode, tra cui bloccare l'esecuzione quando una variabile cambia valore.

lunedì 29 maggio 2017

TinyDict

Esiste un dizionario per livecode compatto e veloce da usare:

Potete scaricarlo da qui: http://livecodeshare.runrev.com/stack/825/TinyDictionary
ve lo consiglio, è più veloce del dizionario standard.

giovedì 25 maggio 2017

DBLib e DB

Per chi è interessato ai database Andre Garzia ha sviluppato la libreria aggintiva DBLib che funziona anche su dispositivi mobili.
Mentre per chi è interessato ai database NoSQL c'è la libreria datastorage lib
Per più informazione potete leggere la seguente pagina: http://andregarzia.com/en/projects/dblib
oppure i sorgente su gitHub: https://github.com/soapdog/livecode-dblib

martedì 23 maggio 2017

CouchDB

Livecode è compatibile con il database CouchDB, qui potete trovare una guida: http://livecode.wikia.com/wiki/CouchDB
CouchDB è un database a documenti stile NoSQL, quindi non ha tabelle, ma solo documenti con dati.
Ogni documento può conentere un numero infinito di dati e sotto documenti.
Il vantaggio del NoSQL è quando non si sa con cosa si avrà a che fare. Ad esempio un negozio che aggiunge oggetti con proprietà sempre diverse: colore, grandezza, peso, luminosità, velocità, ecc. Grazie a NoSQL, quando arriva una nuova proprietà da inserire, non bisogna modificare le tabelle.

lunedì 22 maggio 2017

Installer linux

Ho appena creato i pacchetti DEB e RPM per installare livecode su linux a 64bit, si possono scaricare da qui: http://www.maxvessi.net/livecode/linux/
Rispetto all'installatore classico sono più semplici da installare e risolvono qualche bug.
Se vi servono per qualche altro formato fatemi sapere.

giovedì 18 maggio 2017

SVG widget a colori

La Ah Software ha creato un widget SVG che riprende il modello in bianco e nero di livecode, ma si può usare a colori!
Ecco un esempio:
Vi ricordo che la grafica SVG è vettoriale, e non perde definizione nè ingrandendola, nè rimpicciolendola.
Per fare una grafica in SVG ci sono tantissimi programmi, anche InkScape, che convertono quello che fate in SVG e poi vi basterà impostare la proprietà iconPathsTagData alla stringa SVG.
I file SVG sono solo una stringa di testo del tipo: <rect x="360" y="47.6" width="80" height="152"...
Potete scaricare il widget da qui 
Una volta scaricato, vi basterà scompattare il file ed utilizzare il Tools -> Extension builder per installare il widget.
Potete contattare l'inventore a: ahsoftware@ahsoftware.net

venerdì 12 maggio 2017

Gli array, una precisazione

Ho sempre usato gli array di livecode, monodimensionale e pluridimensionali, ma ancora non mi ero accorto di alcune peculiarità.
Se inserite un valore in un array tipo arr[Rossi] e poi inserite un secondo valore in arr[Rossi][Mario], ciò che è contenuto in arr[Rossi] si cancella perchè arr[Rossi] diventa un contenitore di un altro array: il suo secondo livello, con chiavi e valori.

Esempio

put "cognome" into arr["Rossi"]
put "nome marito" into arr["Rossi"]["Mario"]
put "nome moglie" into arr["Rossi"]["Anna"]

il valore di arr["Rossi"] non è più la stringa "cognome", ma un array con le chiavi "Mario" e "Anna".
Questo modalità può tornare utile quando dobbiamo lavorare solo una parte di un array, perchè così possiamo inviarne solo una parte, ad esempio:

put "nome marito" into arr["Rossi"]["Mario"]
put "nome moglie" into arr["Rossi"]["Anna"]
elencaArr arr["Rossi"]

on elencaArray tArr
   put the keys of tarr
end elencaArray

mostrerà solo Mario e Anna, perchè il messaggio elencaArray vede solo:
  • tArr["Mario"]
  • tArr["Anna"]
Se avete ulteriori dubbi, chiedeteli nei commenti.

mercoledì 10 maggio 2017

Tree view widget

Oggi vediamo come funziona il misterioso controllo tree view. Si tratta di un controllo per fare le liste ad albero.
Queste liste possono avere tutte le nidificazioni che volete. Vediamo nel dettaglio come fare. Trascinate nel vostro programma il tree view:
Ci basta settare la proprietà ArrayData per creare il nostro albero. Mandiamo questi comandi:


set the readOnly of widget "tree View" to true
put empty into temp[Rossi][Mario]
put empty into temp[Rossi][Lisa]
put empty into temp[Rossi][Mario]["Gatto di Mario"]
put empty into temp[Rossi][Lisa]["Cane di Lisa"]   
put empty into temp[Verdi][Luigi]
put empty into temp[Verdi][Anna]
put empty into temp[Verdi][Luigi]["Gatto di Luigi"]
put empty into temp[Verdi][anna]["Cane di Anna"]
set the arrayData of widget "Tree View" to temp
e otterrete questo:


abbiamo impostato anche la proprietà readOnly su true così non possiamo modificare le scritte o aggiungerci elementi cliccandoci sopra.
Volendo è possibile aggiungere anche un valore, si può fare solo all'ultima voce si un ramo, se il valore di una voce è diverso da empty, allora diventa l'ultima voce di quel ramo.
Ad esempio il codice:

put the arraydata of widget "tree view" into temp
put "Lampo" into temp[Verdi][Anna]["Cane di Anna"]
put "(marito)" into temp[Rossi][Mario]
set the arrayData of widget "Tree view" to temp

il risultato è questo:
Come vedete la voce finale del ramo il "Cane di Anna" ha una seconda voce "lampo", mentre avendo messo un valore a "Mario" la sotto voce "gatto di Mario" è sparita, perchè le voci che hanno un valore diventano la fine di un ramo.
Il mio consiglio è di non dare mai un valore alle voci, usate la voce stessa, che può contenere anche degli spazi, se usate le virgolette, per mettere più informazioni su una sola riga.
Vi ricordo che potete scegliere anche il tipo di ordinamento con SortType and SortOrder.

martedì 9 maggio 2017

Intercettare i pulsanti speciali (Ins, Home, PgSU, PgUp, ecc...)

In livecode per intercettare un pulsante di solito usiamo il messaggio keyUp, ma questo messaggio non gestisce tutto.
Ecco una lista di messaggi utili:
  • ArrowKey  per le frecce della tastiera
  • ControlKey  per il tasto Control ed eventuali combinazioni
  • FunctionKey per i tasti F1, F2, F3 e così via...
  • enterKey  per il tasto invio grosso della tastiera
  • returnKey per il tasto invio piccolo del tastierino numerico
  • deleteKey per il tasto Canc
  • backspaceKey  per il tasto backspace sopra l'invio grosso
  • CutKey  il taglia, cioè CTRL+X o qualunque cosa sia in quel momento
  • copyKey  il copia, cioè CTRL+C o qualunque cosa sia in quel momento
  • PasteKey  l'incolla, cioè CTRL+P o qualunque cosa sia in quel momento
  • TabKey  il tasto TAB
  • OptionKey  il tasto ALT  (o META su Mac)
  • rawKeyDown / rawkeyUp  la versione down o up differiscono se allo schiacciare del pulsante o al rilascio dopo averlo schiacciato. Questi messaggi ricevono il segnale da qualsiasi pulsante e vi restituisce il numero. Ecco alcuni numeri utili:
    • Ins: 65379
    • Home: 65360
    • Canc: 65535
    • Fine: 65367
    • Pag Up: 65365
    • Pag down: 65366 
Se vi servono ulteriori informazioni, chiedete pure nei commenti.

lunedì 8 maggio 2017

Migliorata barra della ricerca

Finalmente la barra della ricerca nella colonna qui a destra dovrebbe funzionare correttamente.
Provatela anche voi e ditemi nei commenti che vi sembra.

venerdì 7 aprile 2017

Mostrare e far scomparire la tastiera Android

Se volete nascondere la tastiera virtuale di Android, vi basta creare un campo di testo con la proprietà lockText impostata su true, e invisibile (proprietà visible su false).
A questo punto vi basta usare il codice:



focus on field "invisibile"


Ecco un video dimostrativo:

martedì 4 aprile 2017

HexThello

Oggi vediamo una app per iOS creata con livecode in una settimana: HexThello.
Si tratta di una specie di Othello, ma con le tessere esagonali. Rispetto ad Othello che ha le tessere quadrate, le combinazione e strategie possibili sono molte di più.
Qui di seguito vedete una schermata:
Potete giocare contro il computer o contro un amico.
Complimenti a David Probert per il programma.

venerdì 31 marzo 2017

Immagini PNG e iOS

Il sistema di sviluppo per creare app per iOS, chiamato da Apple XCode, quando incontra un'immagine PNG, la compatta rendendola illegibile per molti programmi.
Per farle tornare normali bisogna usare il comando:
xcrun -sdk iphoneos pngcrush -revert-iphone-optimizations -q compresso.png nonCompresso.png

Ma come farlo dentro la APP?
Ecco il codice:
on mouseUp
   -- CHECK FOR EXISTENCE OF PNGCRUSH UTILITY
   put "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush" into crushPath
   if there is not a file crushPath then
      answer error "Unable to locate pngcrush tool. Check location of xCode."
      exit mouseUp
   end if
   -- APPEND THE SHELL COMMAND PARAMETERSTO THE PNGCRUSH PATH
   put crushPath && "-revert-iphone-optimizations -q source.png destination.png" into theCommand
   -- ESTABLISH SOURCE AND DESTINATION FOLDERS
   put directory into D -- store the current directory
   answer folder "Locate folder containing PNG files:"
   if the result is "Cancel" then exit mouseUp
   put it into theSourceFolder
   set directory to theSourceFolder
   put the files into theList
   set directory to D -- restore the directory
   answer folder "Choose output folder:"
   if the result is "Cancel" then exit mouseUp
   put it into theDestinationFolder
   -- PROCESS FILES
   put 0 into theCount
   repeat for each line theFile in theList
      put theCommand into newCommand
      if char -4 to -1 of theFile is not ".png" then next repeat -- ignore non-PNG files
      put q(theSourceFolder & "/" & theFile) into theSourceFile
      put q(theDestinationFolder & "/" & theFile) into theDestinationFile
      replace "source.png" with theSourceFile in newCommand
      replace "destination.png" with theDestinationFile in newCommand
      get shell(newCommand)
      wait 20 millisecs with messages
      add 1 to theCount
      put theCount -- show processed file count in message box
   end repeat
   answer "PNGs have been fixed!"
end mouseUp

function q pString
   return quote & pString & quote
end q

lunedì 27 marzo 2017

Markdown

Oggi vediamo cosa fa la funzione mergMarkdownToXHTML(). In pratica prende un testo formattato MarkDown e lo converte in HTML.
Ad esempio il testo MarkDown:

An h1 header
============

Paragraphs are separated by a blank line.

2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists
look like:

 * this one
 * that one
 * the other one


diventa:

<h1>An h1 header</h1>
 
 <p>Paragraphs are separated by a blank line.</p>
 
 <p>2nd paragraph. <em>Italic</em>, <strong>bold</strong>, and <code>monospace</code>. Itemized lists
 look like:</p>
 
 <ul>
 <li>this one</li>
 <li>that one</li>
 <li>the other one</li>
 </ul>

venerdì 24 marzo 2017

blur

Un nuovo comando è disponibile in livecode: blur.
Questo comando può sfocare un'immagine, ad esempio il seguente codice:

put the imageData of image 1 into theOriginalImageData
blur 5,"theOriginalImageData",the width of image 1,the height of image 1,"theNewImageData"
set the imageData of image 2 to theNewImageData


potete sfocare un'immagine così:

martedì 21 marzo 2017

Creare un lettore di codice QR (QR reader)

Il sito http://goqr.me/api/doc/read-qr-code/ vi permette di leggere o generare codici QR, basta inviare i dati al loro sito e lor si occupano dell'elaborazione della risposta.
Allora ho creato il seguente programma per vedere se funziona:
postimage
confermo che funziona. Potete scaricarlo da qui.
Il codice sorgente è questo:
on mouseUp
   put empty into tForm
   put "http://api.qrserver.com/v1/read-qr-code/" into tUrl
   put the filename of image 1 into tFile   
   put "<file>" & tFile into tFile
   if libURLMultipartFormData(tForm, "name","file","type","file", "file", tFile) is not empty then
      answer it ##error
   else
      set the httpHeaders to line 1 of tForm
      post line 2 to -1 of tForm to url tUrl
      put it into field "rawdata"
      ## check the result, etc., here
      set the httpHeaders to empty
      put jsonimport(the text of field "rawdata") into temp
      put temp[1]["symbol"][1]["data"] into field "text1"
   end if
end mouseUp

Vediamo come funziona: l'immagine deve essere spedita ad una pagina web. Il creatore della pagina web vuole ricevere via POST:
  • una variabile chiamata name, che contenga la parola file
  • una variabile chiamata type, che contenga la parola file
  • il file dell'immagine
Per fare questo dobbiamo usale il comando  libURLMultipartFormData, fatto ciò la risposta è un testo in formato JSON che trasformiamo in un array e prendiamo solo il testo.

mercoledì 15 marzo 2017

Tabelle

Scott Rossi ha creato un esempio di come sia possibile usare le normali tabelle invece dei datagrid. Questo esempio lo potete usare o digitando:

go url "http://tactilemedia.com/blog/tablelab1"

oppure scaricarlo da questo link  https://mega.nz/#!BJpRWLRB!jBdMghOOf2QeEFpGHXaOYGyEGG4Ew6tcZk1_e3xTjsc

venerdì 10 marzo 2017

Livecode 9 dp6

E' uscita una nuova versione di livecode la 9 dp6.
La novità più importante è che ora potete importare funzioni o classi Java dentro livecode, in questo modo se c'è qualcosa scritto in Java che vorreste usare in livecode, ora potete. Il sistema per sfruttarle è creare un widget che le integri al suo interno. Vi consiglio di leggere:

mercoledì 8 marzo 2017

Safe boating app

Oggi presentiamo un'app realizzata in pochi mesi: Safe boating disponibule per iOS e Android.
Potete scaricarla da qui per Android:
https://play.google.com/store/apps/details?id=com.rcmsar.safeboating&hl=en
Si tratta di un programma per pianificare in sicurezza viaggin in nave vicino alle coste del Canada, con link, previsione del tempo e condizioni per la pesca.
E' stata realizzata da Adam Hyde membro della Royal Canadian Marine Search and Rescue.
Il Sig. Hyde non era un programmatore prima di conoscere liveocde, ma in pochi mesi.
Ecco alcune immagini:








domenica 26 febbraio 2017

Trasformare un0immagine SVG in PNG

Il programmatore Cappellan ha creato un programma per convertire le immagini SVG (quelle vettoriali) in PNG:

Il programma permette di scrivere il codice SVG e vedere il risultato.
Potete scaricarlo da qui:

Potete vedere degli aggiornamenti da qui: http://forums.livecode.com/viewtopic.php?f=11&t=28384#unread

sabato 25 febbraio 2017

Nuova versione livecode

E' uscito livecode 9 dp5, vediamo le novità:
  • E' possibile leggere i dati delle trasmissioni NCF su Android con la funzioni:
    • mobilesNFCAvailable()
    • mobilesNFCEnabled()
    • mobileEnableNFCDispatch
    • mobileDisableNFCDispatch
    • nfcTagReceived
  •  revVideograbber è disponibile solo so Windows. 
  • Si può usare localhost negli indirizzi dei socket, con la seguente sintassi:
    opensocket from ":8080" to "10.2.1.1:8080"
  • cambiamenti ai messaggii nterni del messeage box
Come al solito le versioni sono tutte scaricabili su: http://downloads.livecode.com/livecode/

martedì 21 febbraio 2017

Apimac

La società italiana Apimac realizza app per Mac e iOS con livecode, potete vedere il sito a questa pagina: http://www.apimac.com
Tra le app prodotto ecco alcune delle più famose:
  • Timer/orologio
  • Criptazione file
  • iNotepad
  • iDatabase
  • cartelle segrete per Mac
  • Compressore file per MAx
  • Clean text
  • slideshow
  • Cripta email
  • Self timer

domenica 19 febbraio 2017

Tree view widget

Il widget tree view permette di creare una vista ad albero, vediamo come funziona.
La proprietà principale è l'arraydata, questa proprietà è un vero array dove ogni chiave rappresenta la voce stessa. Prima di cominciare vi consiglio di settare la proprietà readOnly su true. Ad esempio con questo codice:


   put empty into temp["Lunedì"]["Carlo"]
   put empty into temp["Lunedì"]["Mario"]
   put empty into temp["Martedì"]["Giovanna"]
   put empty into temp["Martedì"]["Laura"]
   set the sortType of widget 1 to "text"
   set the sortOrder of widget 1 to "ascending"
   set the arraydata of widget 1 to temp

otterrete questo:
Non c'è limite al numero di nodi e sotto nodi che potete fare.
Inoltre se una voce non è un nodo per altre voci, potete anche assegnargli un valore. Esempio:
   put "$ 10" into temp["Lunedì"]["Carlo"]
   put "$ 20" into temp["Lunedì"]["Mario"]
   put "ristorante" into temp["Martedì"]["Giovanna"]
   put "parco" into temp["Martedì"]["Laura"]
   set the sortType of widget 1 to "text"
   set the showseparator of widget 1 to true
   set the sortOrder of widget 1 to "ascending"
   set the arraydata of widget 1 to temp


Risultato:

mercoledì 15 febbraio 2017

giovedì 2 febbraio 2017

ControlAtLoc e ControlAtScreenLoc

Oggi vediamo due funzioni che ci dicono cosa c'è in un punto della finestra del nostro programma ControlAtLoc() e ControlAtScreenLoc().
Entrambi vi dicono cosa c'è in una posizione, ad esempio:

if controlAtLoc("10,10") is not empty then
   put the name of controlAtLoc("10,10") into temp
   answer "In posizione 10,10 c'è " & temp
end if

controlla cosa c'è alla posizione 10,10 della finestra corrente e se c'è qualcosa vi avverte.
La funzione ControlAtScreenLoc() è simile ma misura partendo dall'angolo in alto a sinistra dello schermo.
Possiamo sfruttare questa funzione per creare un gioco del puzzle, perchè basta controllare che i pezzi siamo in determinati punti. Se prendiamo ad esempio il baricentro della posizione corretta di un pezzo come punto di controllo, abbiamo un controllo preciso, ma non eccessivamente, giusto per capire se l'untente ha messo in ordine i pezzi.
Ad esempio per fare questo programma:


Basta creare 6 immagini vuote, un gruppo che le contenga, una cornice "qq" attorno al gruppo, un pulsante per caricare una nuova immagine e un pulsante come behavior per tutte e 6 le immagini.
Codice pulsante per caricare:
on mouseUp
   posizionacartella
   lock screen
   resetta
   answer file "scegli immagine"
   put it into temp
   create image
   set the filename of the last image to temp
   set the rect of the last image to the rect of group 1
   put "imm1,imm2,imm3,imm4,imm5,imm6" into lista      
   repeat for each item tItem in lista      
      export snapshot from rect ( the rect of image titem ) of this card to file tItem AS JPEG
      set the filename of image tItem to empty
      set the filename of image tItem to tItem
      set the loc of image titem to (random(383), random(257))
   end repeat   
   set the rect of group 1 to the rect of graphic "qq"
   delete the last image   
   unlock screen
end mouseUp

on resetta
   repeat with i=1 to 6
      set the rect of image i to the inizio of image i
   end repeat
end resetta

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


Codice del behavior per tutte le immagini:

on MouseDown
   grab me   
end MouseDown

On MouseUp
   controlla
end MouseUp

on controlla
   put "imm1,imm2,imm3,imm4,imm5,imm6," into lista   
   if controlatloc("79,73") is not empty then    put the short name of controlatloc("79,73") & comma after posizione
   if controlatloc("199,73") is not empty then put the short name of controlatloc("199,73") & comma after posizione
   if controlatloc("319,73") is not empty then put the short name of controlatloc("319,73") & comma after posizione
   if controlatloc("79,193") is not empty then put the short name of controlatloc("79,193") & comma after posizione
   if controlatloc("199,193") is not empty then put the short name of controlatloc("199,193") & comma after posizione
   if controlatloc("319,193")is not empty then put the short name of controlatloc("319,193") & comma after posizione
   if lista = posizione then
      answer "Vinto"
   end if
end controlla


Fine, non serve altro.