Nokioteca [Nokia] Forum: [m-shell] Listbox Grafica - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[m-shell] Listbox Grafica

#1 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 13 luglio 2009 - 10:26

posto un mini script che forse potrà essere utile a chi sviluppa applicazioni in mshell
use graph as g;
use ui;

/* ======== COSTANTI ======== */
ui.keys(ui.strokes); // return keystrokes
fontSize=17 // Grandezza font
constX=50 // Costante asse X
spazioVerticale=5 // Spazio tra due righe
constY=fontSize+spazioVerticale // Costante asse Y
postesto=constY // Posizione testo in pixel
bordoX=25 // Distanza dal bordo sinistro
bordoY=20 // Distanza dal bordo in alto
padding=1 // Spazio tra il testo e il bordo
differenzaAlt=2 // Differenza di altezza

/* ======== VARIABILI ======== */
lista=["Home","Info","Prova","Altro Elemento","Esci"] // Elementi nel menu
indice=0; // E' il cursore della selezione
posizione=constY // Posizione da cui partire la stampa a video degli elementi

/* ======== GRAFICA ======== */
g.bg(0xcccccc); // Sfondo Grigio
g.full(false); // Grandezza normale
g.size(g.screen()); // Riempio tutto lo schermo
ui.mfont(["SwissA", fontSize, true, false]) // Imposto il carattere
g.font(["SwissA", fontSize, true, false]) // Imposto il carattere grafico

/* ======== FUNZIONI ======== */

// Semplice funzione che stampa a schermo
function stampa(x,y,text);
	g.pen(g.black);
	g.brush(g.white);
	g.text(x, y, text);
	g.show();
end;

// Funzione che stampa il contenuto dell'array in stile listbox
function stampaLista(listaarray);
	for i=0 to (len(listaarray)-1) do
		.stampa(.bordoX,.bordoY+(.postesto+(i*.constY)),listaarray[i]);
		.posizione=.posizione+.constY;
	end;
end;

// Disegna il rettangolo intorno alla selezione
function creaRect(idx);
	g.clear();
	g.pen(g.black);
	g.brush(g.green);
	g.rect(.bordoX-1-.padding,(.bordoY+(idx*.constY)+.differenzaAlt)-.padding,g.size()[0]-.constX+(.padding*2),(.constY+(.differenzaAlt/2))+(.padding*2));
end;

// Sposta la selezione su
function funzioneSu();
	.indice--;
	if .indice<0 then .indice=len(.lista)-1; end;
	creaRect(.indice);
	stampaLista(.lista);
end;

// Sposta la selezione giu
function funzioneGiu();
	.indice++;
	if .indice=len(.lista) then .indice=0; end;
	creaRect(.indice);
	stampaLista(.lista);
end;

// Funzione-tipo per la pressione del tasto OK
function funzioneOk();
	ui.error("Hai selezionato " + .indice);
	// Qui è da personalizzare
	// Bisogna sostituire primafunzione, secondafunzione, terzafunzione e quartafunzione con le funzioni adatte
	/*
	if .indice=0 then primafunzione(); end;
	if .indice=1 then secondafunzione(); end;
	if .indice=2 then terzafunzione(); end;
	if .indice=3 then quartafunzione(); end;
	*/
	// ATTENZIONE: Il numero degli if dev'essere UGUALE alla LUNGHEZZA dell'array all'inizio
end;

// Questa funzione tiene in vita il programma leggendo i tasti premuti
function idle();
	do
		tasto=ui.cmd(-1);
		if tasto=ui.upkey then funzioneSu(); end; // su
		if tasto=ui.leftkey then funzioneSu(); end; // sinistra-su
		if tasto=ui.downkey then funzioneGiu(); end; // giu
		if tasto=ui.rightkey then funzioneGiu(); end; // destra-giu
		if tasto=ui.gokey then funzioneOk(); end; // ok
	until false;
end;

/* ======== INIZIO ======== */
creaRect(indice); // Creo il rettangolo di selezione
stampaLista(lista); // Stampo la lista
idle(); // Tengo in vita il programma


se ci sono miglioramenti da fare segnalatelo pure, anche perchè l'ho buttato giù in poche ore, il che può far si che ci siano degli errori nel codice.

Download file


Messaggio modificato da madhacker il 14 luglio 2009 - 12:26

0

#2 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 13 luglio 2009 - 17:40

Visualizza Messaggimadhacker, il 13/07/2009 - 11:26, ha scritto:

posto un mini script che forse potrà essere utile a chi sviluppa applicazioni in mshell


/* ======== GRAFICA ======== */
g.bg(0xcccccc); // Sfondo Grigio
g.full(false); // Grandezza normale
g.size(g.screen()); // Riempio tutto lo schermo
ui.mfont(["SwissA", fontSize, true, false]) // Imposto il carattere
g.font(["SwissA", fontSize, true, false]) // Imposto il carattere grafica

Quote

se ci sono miglioramenti da fare segnalatelo pure, anche perchè l'ho buttato giù in poche ore, il che può far si che ci siano degli errori nel codice.

EDIT: Ho effettuato alcune modifiche, tra cui alcune ai commenti. Ho riscontrato che provandolo da mshell il carattere al primo avvio non cambia, ma bisogna fare Opzioni -> Stop e poi Opzioni -> Go per vedere correttamente il carattere :(

Ti sei dimenticato di impostare il font grafico..... prova con la riga de mè aggiunta e dimmi se ti funziona.

Veramente un bel programma! ben impostato e commentato complimenti...se non ti dispiace ne approfitto per imparare qualcosina anchio...

Mi spiegheresti questa riga:ui.keys(ui.strokes); // return keystrokes
Un grazie e meno male che qualcuno posta del codice....(Appena mi sbroglio col lavoro partecipo anchio.)

Messaggio modificato da lento il 14 luglio 2009 - 08:00

0

#3 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 14 luglio 2009 - 12:24

ok, ora il font funziona bene. avrò fatto confusione, perchè questo script l'ho fatto con il manuale accanto :unsure:
ui.keys(ui.strokes); // return keystrokes

l'ho copiato "paro paro" a come era presente sul "library.pdf" a pagina 102 (io ho ancora la versione 3.02) ma, la butto lì, penso serva ad abilitare la ricezione dei tasti ?!?

spero scenderai presto in campo magari migliorando un po' questo script :rolleyes:

Messaggio modificato da madhacker il 14 luglio 2009 - 12:27

0

#4 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 15 luglio 2009 - 19:46

Visualizza Messaggimadhacker, il 14/07/2009 - 13:24, ha scritto:

ui.keys(ui.strokes); // return keystrokes

l'ho copiato "paro paro" a come era presente sul "library.pdf" a pagina 102 (io ho ancora la versione 3.02) ma, la butto lì, penso serva ad abilitare la ricezione dei tasti ?!?
spero scenderai presto in campo magari migliorando un po' questo script :D

Ciao.. concordo con quanto hai scritto ui.keys() serve a impostare la lettura degli eventi da tastiera.....
Ma come avrai notato a seconda di cosa piazzi tra le sue parentesi legge e gestisce gli eventi in modo diverso.....
ui.strokes è una costante che ha valore 2.
Mentre stai leggendo la versione 3.02 io sono ancora fermo alla lettura della versione 3.01!!! (L'avevo detto che mi serviva un paio di annetti per leggerla in inglese!!)
Da quel che capisco di versione in versione sta diventando sempre più ampia la possibilità di impostazione di ui.keys() e sarebbe bello
se qualcuno più addentro ci facesse un piccolo riassunto.

Per quanto riguarda il tuo codice :thumbs: ......non saprei proprio come migliorarlo! personalmente lo ritengo benfatto!.
0

#5 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 18 luglio 2009 - 20:17

Visualizza Messaggimadhacker, il 14/07/2009 - 13:24, ha scritto:


Come ti dicevo migliorarlo non saprei....ma???? potresti trasformarlo in un modulo!!
la funzione idle()
potresti chiamarla che sò..... gmenu(titolo,(array elementi menu),(colore fondo),(colore testo)) e questa funzione restituirebbe un numero corrispondente alla voce della lista che si è scelto oppure null se non si vuol scegliere.
Non è semplice....perchè dovresti tener conto del numero di voci possibili da visualizzare...magari fare lo scroll se sono troppe!.
Dovresti anche contenere la lunghezza delle sigole scritte in modo che non escano dallo schermo oppure quando è evidenziata potresti far scrorrere la scritta rendendola leggibile.

L'uso dei moduli semplifica enormemente lo sviluppo di programmi rendendo la programmazione quasi banale.

Pensa che bello per un neofita:
Use madhackermenu as md;

titolo="Scaletta giornaliera"
lista=["Studio","Ginnastica","Letture","Riviste da comperare","Ricordati di.."]
while true do
  risposta=md.gmenu(titolo,lista,"giallo","blu")
  if risposta=null then break; end;
  if risposta=1 then ....
  elsif risposta=2 then......
  else 
  end;
end; //-do

O meglio ancora:
use madhackermenu as md;
use madhackerremind as rm;

titolo="Scaletta giornaliera"
lista=["Studio","Ginnastica","Letture","Riviste da comperare","Ricordati di.."]
rm.ripeti
  risposta= md.gmenu(titolo,lista,"giallo","blu");
  mr.edivedi(rispsota);
rm.finese risposta=null

mr.edivedi(risposta) attiva una funzione che mostra e permette di editare il file collegato al numero contenuto in risposta

E' solo un idea e a dir il vero....per agosto volevo scrivere dei moduli come questo per facilitare l'uso di mShell.....
ma Forza maggiore mi obbliga a dedicare parte di Agosto a java e relativo j2me.....vedrò cosa posso fare.
.
Però....sarebbe già un bel programmino...che chiunque potrebbe comporlo come gli pare (gioco di parole) non ti pare?
0

#6 L   madhacker 

  • Senior Member
  • PuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 527
  • Iscritto: 16 settembre 2006
  • Cellulare:N95-2,5800

Inviato 19 luglio 2009 - 12:02

Visualizza Messaggilento, il 18/07/2009 - 21:17, ha scritto:

Come ti dicevo migliorarlo non saprei....ma???? potresti trasformarlo in un modulo!!
...

scusa l'ignoranza, ma per modulo intendi quelli in formato .mm?? in quel caso dovrei studiarmeli (sono ancora novizio su mshell)
intanto potrei provare a modificare questo codice per le liste più grandi che potrebbero uscire dallo schermo e, se ci riesco ( :D ) , poi passare alla lunghezza del testo. ah, esiste già qualche funzione preparata per "splittare" il testo o devo partire da 0?
0

#7 L   lento 

  • Senior Member
  • PuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 637
  • Iscritto: 03 settembre 2008
  • Cellulare:E72

Inviato 19 luglio 2009 - 14:41

Visualizza Messaggimadhacker, il 19/07/2009 - 13:02, ha scritto:

scusa l'ignoranza, ma per modulo intendi quelli in formato .mm?? in quel caso dovrei studiarmeli (sono ancora novizio su mshell)

Premessa: non sentirti in dovere di farlo! mi sentirei un vermone! a spingerti in quella direzione mentre io stò schiacciando l'occhiolino a j2me!.
Comunque SI! i moduli sono quelli con desinenza (xxx.mm) la loro realizzazione è di una banalità disarmante:

ESEMPIO:
Prendi il tuo programma e commenta queste ultime righe

/* ======== INIZIO ======== */
// creaRect(indice); // Creo il rettangolo di selezione
// stampaLista(lista); // Stampo la lista
// idle(); // Tengo in vita il programma

salvalo con nome madhackermenu.mm ed ecco fatto! :) hai già creato il modulo che da un altro programma puoi usare così:
use madhackermenu as md;
/* ======== INIZIO ======== */
md.creaRect(0); // Creo il rettangolo di selezione
md.stampaLista(["Home","Info","Prova","Altro Elemento","Esci"]); // Stampo la lista
md.idle(); // Tengo in vita il programma

(Ovviamente le funzioni vanno sistemate per poter essere sfruttate meglio....)
Se vuoi usare la variabile globale lista che è nel modulo la devi richiamare così:
print md.lista
->["Home","Info","Prova","Altro Elemento","Esci"]
print md.lista[1]
->Info

Semplice non ti pare??
Il modulo aiuta a isolare le variabili ed a nascondere tutta la complessità necessaria a far apparire il tuo menu grafico.

Quote

esiste già qualche funzione preparata per "splittare" il testo o devo partire da 0?

Che io sappia no.

Messaggio modificato da lento il 19 luglio 2009 - 18:38

0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione