GIUBBE SOFTWARE
 

Guida psMenu

libro
Menu
AttivoDocumenti e FAQ
(guida a psMenu)
possibile scelta link

 


Sezione sheet, i Comandi

Eccoci arrivati al fulcro del programma, fino ad ora è stato facile, ora comincia la parte complicata... ma non troppo.

Eravamo rimasti qui

[SHEET 1]
TitlePage=Menu principale
Item01="Avvia il filmato"|Action=00
Item02="Opzioni"|Action=01
Item03="Chiudi menu"|Action=02

e allora andiamo con ordine. La prima azione da considerare è la 00 relativa all'item01. Per indicare a psMenu che stiamo lavorando sull'azione 00 basta usare la direttiva ActionXX, dove XX è il numero dell'azione.

Action00=

Questa direttiva è scritta subito sotto l'ultimo Item e a destra del simbolo "uguale" ha una lista di comandi.

Una cosa che ancora non ho detto è come inserire i commenti nello script, questa operazione si fa aggiungendo un punto e virgola ; all'inizio della riga. Lo stesso simbolo (;) serve anche per separare i comandi gli uni dagli altri nella lista.

Una parentesi, come creare un file .bsi (.mkv, .ogm) corretto per psMenu

Come già sapete psMenu usa bsPlayer e quest'ultimo usa i file .bsi per la configurazione dei filmati. PsMenu ha bisogno di leggere alcuni parti del file .bsi per un corretto funzionamento di alcune funzioni. L'unica parte in cui bisogna prestare la massima attenzione è dove si descrivono i capitoli.
Questi vanno scritti nella forma

[ChaptersX]
1=hh:mm:ss titolo
StartTime=

dove X è il numero del CD, hh:mm:ss è il classico formato in ore, minuti, secondi e startime è opzionale, ma deve essere presente dal secondo cd in poi. Il suo formato può essere anche in frame (cosa proibita per i capitoli).
Un'altra cosa importantissima per i capitoli è che all'inizio di ogni cd deve esserci un capitolo, anche se non espressamente richiesto dal filmato, inoltre la numerazione deve ricominciare ad ogni cd (bsplayer e psmenu useranno comunque la consueta numerazione progressiva), esempio:

[Chapters1]
1=00:00:00 Primo capitolo
2=00:08:59 Secondo capitolo
3=00:18:00 Terzo capitolo (prima parte)
[Chapters2]
1=00:20:00 Terzo capitolo (seconda parte)
2=00:55:14 Quarto capitolo
3=01:04:38 Quinto capitolo
StartTime=30000

Il terzo capitolo comincia al minuto 18:00 e termina al minuto 55:14, ma dato che il secondo CD comincia al minuto 20:00 occorre dividere il capitolo terzo in due parti, la seconda parte deve cominciare nello stesso minuto di inizio del secondo CD, cioè 20:00
Se non rispettate questa semplice regola psMenu e bsplayer non si capiscono e vedrete un capitolo diverso da quello richiesto. La stessa regola vale per i capitoli dentro i file ogm o mkv.

I comandi

Per la sintassi dei singoli comandi e per la lista completa vi rimando al manuale, qui vedremo "solo" come metterli insieme per ottenere ciò che desideriamo.

La prima cosa che richiede il menù è avviare il filmato con la lingua di base e i sottotitoli "forced", abbiamo anche deciso che dopo che il filmato è stato avviato non ci serve più il menù. Se il file è un ogm o mkv suppongo che il primo sottotitolo sia quello "forced", il secondo sia quello "presa diretta", il terzo "commento suo", lo stesso ordine è supposto nel file .bsi, dove per default è caricato il sottotitolo "forced".

Per semplicità di esposizione anche i due flussi audio sono nell'ordine appena descritto (1: "presa diretta", 2: "commento suo").

Per avviare il filmato useremo il comando openbsi (o openogm per i file .ogm e .mkv), quindi la nostra riga sarà:

Action00=openbsi("..\filmato.bsi",1,0,0,0)

supponendo che il file filmato.bsi sia nella cartella superiore rispetto al menu (in genere è consigliabile mettere il menu e i suoi file in una cartella separata).

L'altra azione che volevamo compiere è la chiusura del menu:

Action00=openbsi("..\filmato.bsi",1,0,0,0);close

Ed eccoli qua, gli unici due comandi che vengono eseguiti in parallelo da psMenu. Se il comando close è preceduto immediatamente (nella sintassi, non nella logica) da un comando di apertura file allora viene avviato il programma in grado di leggere il file (chi ha detto bsplayer?) e contemporaneamente chiuso lo script e quindi psMenu.
Tutti gli altri comandi sono eseguiti in sequenza, senza altra eccezione

Avevo detto che si poteva scegliere la lingua e quant'altro, ma nel comando appena visto questa possibilità non c'è. Manca perché non ho ancora introdotto due comandi fondamentali: Memory e action. Da un'altra parte ho dichiarato che si può scrivere uno script per psMenu senza mai utilizzare quei due comandi, è vero, ma in questa guida voglio essere un po' più completo. Una altra osservazione è per action. L'abbiamo vista come indice (Action=, nella direttiva Item), come direttiva (ActionXX) e ora la vediamo come comando (Action), in ogni modo non dovrebbe creare confusione.

Il comando action, come già sapete (il manuale...) non è altro che un comando di salto, che unito al comando per aprire le pagine (opensheet), è il responsabile della presenza di istruzioni in sospeso (fra poco sarà più chiaro).

Il comando Memory è uno dei comandi poliedrici di psMenu, nel senso che ha comportamenti diversi dipendentemente dalla sintassi usata, in particolare se è presente un solo parametro questo sarà considerato come indice della cella di memoria e il comando sarà di lettura della cella, se i parametri sono due allora il primo è ciò che va scritto nella cella di memoria indicata dal secondo parametro.

Ammettendo che la cella 0 contenga il numero del sottotitolo e la cella 1 contenga il numero della lingua, la direttiva Action00 (da ora la chiamerò lista di comandi o riga XX) la possiamo scrivere così:

Action00=openbsi("..\filmato.bsi",1,Memory(0),Memory(1),0);close

Se qualcuno si sta domandando quali siano i valori iniziali delle due celle di memoria, deve rileggere la prima parte di questa guida. Gli altri ricorderanno che in DefaultMemory si è deciso di assegnare i valori 0 ad entrambe le celle.

Per ora non è cambiato nulla nel programma, ma l'uso della memoria rende quella riga molto più flsessibile, basta cambiare il valore delle celle per ottenere un comportamento diverso.

Due note importati. La prima riguarda il fatto che non si può andare a capo (cioè premere "invio" prima della fine della riga stessa) durante la scrittura di una riga, e la seconda è che viene eseguita solo la riga indicata, le altre sono ignorate. Se si desidera continuare i comandi nella riga successiva occorre usare il comando action.

Ora bisogna scrivere la parte di script che fa scegliere i valori da inserire nelle due celle di memoria, ma prima occorre scrivere la pagina due.

Chiudere due discorsi lasciati in sospeso.

Vorrei chiudere due discorsi che avevo rimandato. Il primo riguarda la sequenzialità sintattica e logica del comando close, la seconda riguarda DefaultAction. Le seguenti righe:

Action00=Openfile("miofile.avi",1);close

e

Action01=Openfile("miofile.avi",1);Action(02)
Action02=close

hanno la stessa logica (o quasi), cioè avviano il filmato e chiudono il programma, ma la riga 00 lo fa in un unica operazione, mentre la riga 01 aspetta prima che sia finita l'esecuzione di OpenFile e quindi del filmato e poi esegue il salto ed infine chiude il programma

Resta da vedere un esempio di limitazione nell'uso di cache e di DefaultAction con memory. Poniamo che nelle celle 7 e 8 siano memorizzati rispettivamente i valori 3 e 0.

[SHEET 1]
DefaultAction=Memory(7),Memory(8)
Item01="Avvia il filmato"|Action=00
Item02="Opzioni"|Action=01
Item03="Esci"|Action=02
Action00=Memory("3",7);Memory("0",8);Openfile("filmato.avi");OpenSheet(1)
Action01=
Action02=
Action03=Memory(Memory(3),3);Memory("0",7);Memory("5",8);Opensheet(1)

Senza considerare l' inutilità (o quasi!) di questo esempio e sapendo che OpenSheet(X) apre la pagina X, cosa fa questo piccolo script? (tenete presente che la sezione Main e le altre sono quelle scritte in precedenza)

Va in loop? (cioè continua a girare dentro se stesso dando l'impressione che il programma sia bloccato?)

Ai più distratti ricordo che tutte le direttive hanno un valore di default (vedi manuale), cioè sono presenti anche se non esplicitamente scritte. Il valore di default per cache è 1.

Per rispondere alle due domande vediamo passo-passo il comportamento.
Appena si entra nella pagina viene eseguita la direttiva DefaultAction=3,0 e quindi sarà valutata la riga 03. Il numero di pagina non è inserito nella memoria interna perché DefaultAction non rientra nel caso 1.
La riga 03 mostra la scritta "Nessun sottotitolo Commento in presa diretta", modifica la memoria come indicato e riapre la pagina. Questa volta la direttiva iniziale è DefaultAction=0,5 e quindi partirà un conto alla rovescia di 5 secondi per scegliere "Avvia filmato". Questa volta cache vale 1 (come prima) e DefaultAction rientra nel caso 1 e quindi il numero di pagina sarà memorizzato da psMenu.
Ammettiamo che il conteggio termini (o l'utente scelga la voce "Avvia il filmato"), allora nella memoria torneranno i valori iniziali e ci si aspetta che il ciclo ricominci. Invece non accade.
Il motivo è semplice, all'apertura della pagine si dovrebbe seguire la direttiva DefaultAction=3,0, ma il numero di pagina è nella memoria interna di psMenu e quindi la direttiva non sarà eseguita

E' questa la limitazione di cui parlavo, se la direttiva DefaultAction permette l'inserimento del numero di pagina nella memoria, poi qualsiasi valore dei parametri di defaultaction sarà ignorato.

Se invece avessimo voluto che ad ogni apertura della prima pagina venisse mostrata la lingua e il sottotitolo scelto e poi avviato il filmato allora bisogna fare in modo che il numero di pagina non sia mai inserito in memoria, per far questo occorre impostare a zero la direttiva cache. In questo caso per terminare il ciclo occorre mettere a -1 uno dei due parametri di DefaultAction.

In verità in questo caso il ciclo termina non appena si sposta il mouse, non occorre mettere a -1 uno dei due parametri di DefaultAction.

La risposta alla seconda domanda (se va in loop) è ovviamente no anche nel caso di cache=0 (nel senso che si può uscire spostando il mouse e premendo il tasto esci), ma ciò non toglie che alcuni script scritti male possono mandare in loop il programma psMenu.

Vi state chiedendo come mai la riga 03 mostra la frase che ho scritto prima? Il merito va alla direttiva VisMemory nella sezione Main (diceva di mostrare il contenuto della memoria 3 e 4) e alla sezione Format. Il comando Memory(Memory(3),3) dà il via a VisMemory, nel senso che scrive nella cella 3 (secondo parametro di Memory più sinistra) il contenuto della cella 3 (il primo parametro di Memory più a sinistra è Memory(3), cioè prendo il contenuto della cella 3). Il comando non modifica il contenuto nella cella, dato che ci scrive lo stesso valore presente, ma tanto basta a VisMemory per entrare in funzione.

Per vedere un esempio di operazione in sospeso vi rimando alla descrizione del comando Action nel manuale.

La creazione della seconda pagina

Ormai è chiaro (o quasi, alcune cose non le ho ancora spiegate) come sarà la pagina numero 2, eccola:

[SHEET 2]
TitlePage=Opzioni
Item00="Lingue"|Action=00
Item01="Sottotitoli"|Action=01
Item02="selezione capitoli"|Action=02
Item03="Capitolo singolo: disattivato"|Action=10
Item04="Extra"|Action=04
Item05="Ritorna al menu principale"|Action=05
Action00=OpenSheet(3)
Action01=OpenSheet(4)
Action02=OpenSheet(5)
Action04=OpenSheet(4)
Action05=OpenSheet(1)
Action10=Action(Memory(5))
Action11=Items.Rename("Capitolo singolo: attivato",3);Memory("07",6);Memory("12",5)
Action12=Items.Rename("Capitolo singolo: disattivato",3);Memory("06",6);Memory("11",5)

Tutto ciò che è in corsivo dovrebbe essere chiaro, le righe da 00 a 05 non fanno altro che aprire le pagine indicate dall'argomento del comando OpenSheet

Le righe da 10 a 12 non sono complicate, ma necessitano di una spiegazione in più. Ad ogni pressione del terzo pulsante si cambia la sua intestazione, in pratica si alternano le scritte attivato e disattivato.

Il comando contenuto nella riga 10 è detto anche salto incondizionato indiretto, nel senso che ci sarà comunque un salto da qualche parte, ma a priori non è dato sapere dove perchè dipende dal contenuto della memoria. All'inizio dello script abbiamo messo il valore 11 all'interno della cella 5 (si è fatto con la direttiva DefaultMemory in Main) e quindi la riga 10 è come se fosse action(11), cioè salta alla riga 11.
Nella riga 11 si cambia il testo del terzo pulsante, si memorizza la scelta effettuata nella cella 6 e si imposta il nuovo salto a 12. In questo modo quando si ripreme il tasto (che punta sempre alla riga 10) si farà eseguire la riga 12 che riporta nelle condizioni iniziali il testo del pulsante e la memoria.

Siamo sicuri che quanto esposto funziona? Stai pensando che se te lo chiedo la risposta non può che essere negativa? Hai indovinato.
Se lo provate noterete che c'è un problema, nella pagina tutto funziona correttamente, ma appena la si abbandona per poi ritornarci si vede che la scritta è tornata quella di default, mentre la cella 6 contiene ancora il valore modificato.

A questo problema ci sono due soluzioni, una facile per noi, ma antiintuitiva per chi usa il menu (che poi potremmo essere sempre noi), e l'altra un po' più complicata, ma perfettamente coerente con l'intuizione. Cominciamo dalla prima.

A questo punto dovrebbe essere chiaro quello che si deve fare, bisogna fare qualcosa quando si entra nella pagina e prima che l'utente possa effettuare le sue scelte. Esiste un meccanismo che consente di fare ciò? Chi ha risposto no deve rileggere tutto! (quanto sono cattivo!). Gli altri hanno capito che bisogna utilizzare la direttiva DefaultAction con i parametri del caso 2, cioè:

[SHEET 2]
DefaultAction=20,0
...

In questo modo all'apertura della pagina si eseguiranno le azioni indicate nella riga 20. L'idea più semplice che può venire in mente per questa riga è il ripristino delle condizioni iniziali:

Action20=Memory("06",6);Memory("11",5)

Come si diceva questa riga rende il menu antiintutivo perchè il pulsante viene riportato alla condizione iniziale anche se l'utente aveva solo l'intezione di controllarne lo stato. Questo può portare anche incertezza nell'uso del menu, perchè si potrebbe pensare che il tasto non funziona (esco e rientro e trovo sempre il valore originale). D'accordo che lo abbiamo scritto noi e quindi sapiamo come funziona, ma se lo volessimo riusare tra qualche mese?

Quello che vogliamo è che lo stato indicato dal terzo pulsante sia sempre coerente con il contenuto nella memoria, cioè la pagina si ricordi quale impostazioni abbiamo scelto. Ecco come si fa:

Action20=ifjump(Memory(6),07,"=",21);Items.Rename("Capitolo singolo: disattivato",3)
Action21=Items.Rename("Capitolo singolo: attivato",3)

Non è difficile, si deve solo usare un salto condizionato. In queste due righe non si cambia lo stato della memoria, si cambia solo la scritta che appare nel menu in modo da risultare coerente con lo stato della memoria.

Se il contenuto della cella 6 vale 07 allora avevamo scelto di attivare la possibilità di vedere un capitolo alla volta (capitolo singolo: attivato) e di conseguenza lo si deve scrivere, cosa che fa la riga 21. Se invece il contenuto della cella 6 vale 06 si prosegue con il comando successivo che guarda caso scrive il testo di default per il terzo pulsante. In verità si poteva anche omettere il comando Item.rename nella riga 20 perchè il menu è stato già scritto in modo corretto dalla direttiva Item03. Il motivo per cui ho usato valori come 07 e 06 al posto dei più classici 0 e 1 sarà chiaro più avanti.

Una nota importante riguarda il comando ifjump, questo è un esempio di quanto esposto all'inizio circa al tipo di dato contenuto nella cella. In questo caso abbiamo "07" nella cella numero 6 e lo confrontiamo con 07 (senza virgolette) nel comando ifjump. Come ho scritto in precedenza i numeri "n", "0n" e n, con n numero intero sono tutti considerati uguali e in particolare sono numeri o parole a seconda dell'uso che se ne fa. C'è solo un'eccezione che si presenta con l'istruzione add (che vedremo in seguito) perchè deve avere comportamenti diversi a seconda di cosa gli si chiede di sommare.

Anche nell'istruzione ifjump è possibile utilizzare una cella di memoria al posto dell'indirizzo di salto, in questo caso si parla si salto condizionato indiretto che ha usi analoghi al salto incodiziona indiretto.

Si è visto come creare un pulsante con stato con un menu testuale, ma in menu DVD like come si fa? Occorre preparare due immagini identiche tranne nello stato del pulsante e poi caricare di volta in volta l'immagine corretta. Vedremo una cosa analoga quando arriveremo alla pagina degli extra, in verità si farà qualcosa di diverso, ma una volta imparato è facile fare qualche cambiamento.

Uno sguardo veloce alle pagine della lingua e dei sottotitoli.

In queste non ci sarà nulla di nuovo e quindi vedremo solo poche righe dato che le altre sono identiche.

Potremmo anche pensare di creare qualcosa di più sosfisticato. Se per esempio avessimo più filmati con caratteristiche (lingua e sottotitoli) diverse, si potrebbe costruire più pagine per ogni filmato e una sola pagina per le lingue e i sottotitoli, ma con entrate diverse, una per ogni tipo di filmato. Supponiamo di avere un filmato con due lingue e uno con una lingua sola, nel caso si scelga una lingua non presente si deve essere avvertiti dell'errore.

[SHEET 3]
TitlePage=Filmato bilingua
Item01="seleziona lingua"|action=02
....
Action02=OpenSheet(5);Action(10)

[SHEET 4]
TitlePage=Filmano monolingua
Item01="seleziona sottotitolo"|Action=01
...
Action01=Opensheet(5);Action(11)

[SHEET 5]
TitlePage=Selezione lingua e sottotitoli
Item00="Selezione prima lingua"|Action=01
Item01="Seleziona seconda lingua"|Action=02
...
Action02=ifjump(Memory(3), 2,"<",05);
Cambia la lingua
Action05=Message("Il filmato non ha la seconda lingua")
Action10=Memory("2",3);
Action11=Memory("1",3);

A questo punto non dovrebbe essere complicato capire il codice appena scritto. Nella pagina 3 si apre la pagina 5 e si esegue la riga 10. Ricordo ai più distratti (o che non hanno letto il manuale) che Action lavora sulla pagina corrente e OpenSheet rende corrente la nuova pagina aperta, quindi la riga 02 della sezione Sheet 3 fa eseguire il codice contenuto nella riga 10 della pagina 5. Lo stesso vale per la riga 01 di pagina 4, ovviamente eseguirà la riga 11.

Nella pagina 5 quando l'utente preme il tasto per la seconda lingua dovremmo prima controllare che il filmato abbia due lingue (informazione contenuta nella cella 3) e i caso che ciò non fosse viene eseguita la riga 05, altrimenti si cambia la lingua.

Riprendiamo il nostro esempio e vediamo come cambaire la lingua

[SHEET 3]
TitlePage=Selezione lingua
Item00="Audio in presa diretta"|Action=01
Item01="Audio con commento suo"|Action=02
Action01=Memory(1,1);Memory("_LPD",4)
Action02=Memory(2,1);Memory("_LSUO",4)

Il primo comando della riga 01 chiederà alla riga 00 della pagina 1 di caricare la prima lingua del filmato, il secondo comando chiederà a VisMemory di scrivere in alto a sinistra la frase "Commento in presa diretta", analogamente la seconda riga.

Capitoli singoli e continui

Anche qui potremmo essere molto veloci in quanto ormai abbiamo abbastanza dimestichezza con i comandi. Sostanzialmente abbiamo un elenco di capitoli che faremo partire in base alle scelte dell'utente. Contrariamente agli esempi forniti con psMenu faremo partire i capitoli scelti direttamente da questa pagina.

[SHEET 5]
TitlePage=Selezione capitoli
Item01="Primo capitolo"|Action=01
Item02="Secondo capitolo"|Action=02
Item03="Terzo captolo"|Action=03
Item04="Quarto capitolo"|Action=04
Item05="Quinto capitolo"|Action=05
Action01=Memory("1",2);Memory("2",9);Action(Memory(6))
Action02=Memory("2",2);Memory("3",9);Action(Memory(6))
Action03=Memory("3",2);Memory("5",9);Action(Memory(6))
Action04=Memory("5",2);Memory("6",9);Action(Memory(6))
Action05=Memory("6",2);Memory("7",9);Action(Memory(6))
Action06=Openbsi("miofilm.bsi",1,Memory(0),Memory(1),Memory(2))
Action07=Openbsi.stop("miofilm.bsi",1,Memory(0),Memory(1),Memory(2),Memory(9))

Quello che succede ora dovrebbe essere chiaro, nella cella 6 è memorizzata la riga a cui si salta (ecco perchè ho usato quesi valori "strani", se avessi usato 0 e 1 ora sarei costretto ad eseguire un salto condizionato). Le celle 0 e 1 contengono la lingua e il sottotitoli, mentre la cella 2 contiene il capitolo da cui iniziare la visione, infine la cella 9 contiene il capitolo in cui terminare la visione ed è usata solo dall'istruzione Openbsi.stop.
Il file .bsi al quale si fa riferimento è quello illustrato all'inizio, si capisce quindi perchè manca il capitolo quattro nella cella 2. Se avessimo messo Memory("4",2) sarebbe partito la seconda parte del capitolo tre che non è quello che si desiderava. L'altra nota riguarda il capitolo 7 indicato come fine nella cella 9, tale capitolo non è presente, ma serve ad indicare a Openbsi.stop di proseguire fino alla fine.

Da notare che il numero che indica su quale cd cercare il capitolo è sempre 1 anche se in verità il capitolo stesso si trova sul secondo cd. E' solo una scelta, si dice a psMenu di cercare il file miofilm.bsi sul primo cd e sarà poi bsplayer che chiederà di inserire il secondo cd, nel secondo cd lo script sarà lievemente diverso in quanto sarà indicato sempre il cd numero 2. Si poteva anche scrivere il cd corretto, in questo modo è psMenu che chiede di inserire il cd giusto prima di proseguire. Se usi il bsPlayer 1.x leggi la nota allegata al programma.

Extra (in formato grafico)

Ed eccoci all'ultima parte del menu che presenterà una serie di fotografie. Su ognuna di esse si sono aggiunti tre selettori (e volendo anche una cornice) con un editor grafico. Il primo selettore (non presente nella prima foto) mostra la foto precedente, il secondo esce, e il terzo selettore (non presente nell'ultima foto) mostra la foto successiva.
Dopo aver preparato le foto per gli hotspot come indicato nella prima parte di questa guida possiamo scrivere quest'ultima sezione.

[SHEET 4]
HotSpotImg=Memory(10)
HotSpotMask=Memory(11)
HotSpotDef=Memory(12)
Item01="1"|Action=01
Item02="2"|Action=05
Item03="3"|Action=10
Action01=ifjump(Memory(13),1,">",02)
Action02=add(13,0,Memory(13),-1);Action(20)
Action05=OpenSheet(1)
Action10=ifjump(Memory(13),20,"<",11)
Action11=add(13,0,Memory(13),1);Action(20);
Action20=Add(10,0,"foto_",Memory(13));action(21)
Action21=Add(11,0,"foto_hot_",Memory(13));Add(12,0,"sel_hot_",Memory(13))
;
Action(22)
Action22=Add(10,0,Memory(10),".jpg");Add(11,0,Memory(11),".jpg");action(23)
Action23=Add(12,0,Memory(12),".hmt");Opensheet(4)

A questo punto dovrebbe essere tutto chiaro, le prime tre direttive caricano le immagini e gli hotspot, poi a seconda di quale hotspot si prema saranno eseguite le relative istruzioni. Le righe 01 e 10 non sono necessarie perchè nella prima e ultima foto manca l'hotspot corrispondente, ma così mi sembrava più completo.
Il comando add nella riga 02 sottrae al contenuto della cella 13 (inizialmente è 1, valore che grazie all'assenza dell'hotspot nella prima foto e alla riga 01 non sarà mai decrementato), mentre nella riga 11 il contenuto della cella 13 sarà aumentato se questo è infriore a 20.
Come si vede dalla riga 20 il comando add è in grado di sommare anche le parole, in particolare se la cella 13 contiene il numero 2, la riga 20 scriverà nella cella 10 la parola foto_2, saranno poi le righe 22 e 23 ad aggiungere l'estensione appropriata. Infine la riga 23 riapre la pagina quattro, ma questa volta ci sarà la nuova immagine.

E' possibile ottenere la stessa cosa (o quasi) senza usare il menu grafico? Si, si deve aver installato sul pc un visualizzatore di immagini jpg e si deve usare nello script il comando openfile.memory, in questo caso non ci si deve preoccupare dell'estensione perchè ci pensa il comando a mettere le cose a posto, ma in compenso ci si deve preoccupare di costruire un ciclo (nel caso visto il ciclo è effettuato gratis dall'utilizzatore). Ovviamente con openfile.memory non si potrà andare avanti e indietro e per proseguire nella visione si deve chiudere il programma di visualizzazione, inoltre non è possibile interrompere la sequenza. Per sapere come utilizzare il comando si rimanda al manuale, mentre per conoscere un esempio di ciclo si rimanda al file demo.psmu contenuto negli esempi forniti con psMenu (il ciclo è desritto nella prima voce del menu).

Per come è stato scritta la pagina quattro ogni volta che si rientra sarà mostrata l'ultima foto vista, se si desidera ricominciare sempre dall'inizio occore modificare la pagina 2 in modo da caricare i dati per visualizzare la prima immagine prima di passare alla pagina quattro.

Conclusioni.

Siete arrivati fin qui? Avete avuto una pazienza infnita, grazie. Se avete un qualsiasi problema con questa guida o avete un qualsiasi commento (positivo è meglio ^_^) , o ancora avete un problema con psMenu non dovete far altro che contattarmi. L'indirizzo è segnato in contatti.

 


Licenza Creative Commons
Alcuni diritti riservati. Questa guida è pubblicato sotto una Licenza Creative Commons.
Per un uso diverso da quello indicato nella licenza si prega di contatatre l'autore.