Capitolo 6 Men`u, moduli, finestre di dialogo e di messaggio

Transcript

Capitolo 6 Men`u, moduli, finestre di dialogo e di messaggio
Capitolo 6
Menù, moduli, finestre di dialogo
e di messaggio
Quasi tutti i programmi basati sulle GUI, utilizzano una combinazione di menù, finestre di messaggio e finestre di dialogo standard per comunicare con l’utente. Gambas non è diverso dagli
altri. Dato che non esiste un linguaggio di programmazione in grado di garantire ad un programmatore qualunque utilizzo, in termini di componenti precompilati, vengono utilizzati i moduli per
scrivere quello che Gambas non prevede nel suo linguaggio. Ad esempio, se abbiamo bisogno di
una funzione che restituisca il nome di un colore, a partire da una scelta effettuata con una finestra di dialogo standard, dovremmo scrivercela; questo è quello che faremo nel prossimo esempio.
In questo capitolo impareremo ad utilizzare questo genere di controlli. La figura 1 mostra uno
screenshot del nostro prossimo progetto.
Costruiamo quattro menu. Ognuno di essi viene utilizzato per imparare a conoscere i controlli e
le finestre di dialogo standard in questo capitolo. Iniziamo con la barra dei menù, come si vede
nella figura 1, poi vediamo come utilizzare la finestra di dialogo standar del colore, le finestre
Messaggio, ed infine i moduli. Iniziamo il nostro progetto aprendo Gambas e creiamo una nuova
interfaccia grafica utente. Chiamiamo il progetto MenuProject e impostiamo tutti i controlli in
traducibili e pubblici. Una volta all’interno dell’IDE, creiamo un form, Form1, impostandolo come
classe di avvio. Aggiungiamo sul form un pulsante Quit, come indicato in figura 1 e inseriamo il
codice seguente relativo all’evento clic di quest’ultimo:
PUBLIC SUB QuitBtn_Click()
Form1.Close
END
Adesso facciamo doppio clic su un punto qualsiasi del form al di fuori dei bordi del pulsante e
collochiamoci nella subroutine PUBLIC SUB Form Open().
Inseriamo il seguente codice:
Figura 1: Risultato finale del progetto menù.
1
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
2
A Beginner’s Guide to Gambas
Figura 2: L’editor dei menù al primo avvio.
ME.Caption = " Working with Menus "
Aggiungiamo una TextLabel, di nome textLabel1, come mostrato in figura 1. A questo punto
vediamo come costruire il menù e utilizzare le finestre di dialogo standard fornite con Gambas.
0.1
L’editor dei menù
Gambas possiede un sistema incorporato per la costruzione dei menù, il MenuEditor. È possibile
accedervi dal form, premendo CTRL-E, o facendo clic destro selezionando l’opzione Editor Menu
nella finestra popup. In entrambi i casi, viene visualizzato il MenuEditor con un aspetto simile
alla figura 2.
Al primo avvio del MenuEditor, la finestra è ovviamente vuota. Dato che il suo utilizzo non
è molto evidente, impieghiamo un po’ di tempo per imparare ad usarlo. Incominciamo con la
terminologia. Il testo che è visualizzato orizzontalmente, nella parte superiore di un form, viene
chiamato barra dei menù. Essa può contenere uno o più MenuItems; sono gli elementi dei menù
elencati verticalmente. I MenuItems possono contenere a loro volta sottomenù; sono altri MenuItems nidificati che possono a loro volta visualizzare altri MenuItems. In pratica i menù possono
contenere diversi strati di sottomenù nidificati.
Per inserire un menù si utilizza il pulsante Insert (Inserisci). Il pulsante Next (Successivo)
sposta il cursore sul menù successivo verso il basso. Quando si giunge alla fine della lista lo
spostamento si arresta, consentendo soltanto la selezione su una voce di menù o la possibilità di
aggiungerne uno nuovo. Il pulsante Delete (Elimina) rimuove la voce di menù selezionata.
I pulsanti freccia ↑ e ↓ (su e giù), a destra del pulsante Delete, spostano il menù selezionato
in alto o in basso rispetto all’elenco delle voci del menù. Se si scelgono le frecce ← e → (rientrotabulazione e tabulazione)1 , effettueremo un rientro in funzione dello schema di raggrupamento
che abbiamo scelto per il nostro menù. Applicando un rientro su una voce del menù, collocheremo
1 Il senso è la non indentazione e l’indentazione del gergo informatico. Simile all’operazione di rientro del testo
nei comuni wordprocessors o editors di codice sorgente.
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
3
Figura 3: Campi dell’editor dei menù.
quest’ultimo ad un livello d’indentazione più basso. L’indentazione di un MenuItem è indicata
dalla presenza di tre punti . . . davanti ad un MenuItem che è diventato subMenuItem. Più di
tre punti (in multipli di tre), indicano che si tratta di un subMenuItem indentato a livello di
subsubMenuItem rispetto al MenuItem capolista di riferimento. Dopo aver implementato un paio
di menù, sarà molto facile comprendere il meccanismo di funzionamento della costruzione dei
menù. Ad ogni clic sul pulsante Insert, si vedono nuovi campi visualizzati nella parte inferiore del
MenuEditor (figura 3). Essi vengono presentati di seguito.
Il campo Name (Nome), meglio chiamarlo variabile Name, in quanto si comporta come tale,
è il nome della variabile a cui si riferisce il file class del codice sorgente quando incontra questo
particolare oggetto.
Il campo Group (Gruppo) si riferisce al Control Group (Gruppo di controllo). Il Control
Group è utilizzato nell’IDE Gambas per creare e gestire gruppi di controlli come entità uniche.
Quando si seleziona un qualsiasi controllo su un form, nella finestra di dialogo proprietà, si dovrebbe
notare una proprietà Group che non corrisponde ad alcuna proprietà documentata per tale controllo. Questa speciale pseudo-proprietà permette di assegnare gruppi di controllo. In pratica,
quando il controllo viene creato in fase di runtime, sarà trattato come se fosse creato in modalità
codice in questo modo:
myControl = NEW ColumnView(ME) AS "myGroup"
e i suoi gestori di evento devono essere chiamati in questo modo:
PUBLIC SUB myGroup_Click()
È possibile fare riferimento al controllo con la parola chiave LAST, oppure è possibile assegnare
un Tag ad ogni controllo per differenziarli tra loro, utilizzando un valore etichetta.
Caption è il testo che gli utenti vedono quando viene eseguito il programma. Tag è riservato
ai programmatori per memorizzare i dati ed è una proprietà comune per quasi tutti i controlli.
Vedremo come utilizzare la proprietà Tag più avanti. Per ora, è sufficiente sapere che essa può
contenere qualsiasi tipo di dati Variant.
Lo Shortcut CheckBoxes consente di definire un tasto di scelta rapida per invocare automaticamente l’evento clic di un certo menù. Ricordiamo che anche voci dei menù rispondono agli eventi
clic e alle scorciatoie da tastiera. Il campo Picture (Immagine) consente di specificare il nome
del file icona visualizzato accanto ad un MenuItem. L’anteprima dell’immagine scelta appare alla
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
4
A Beginner’s Guide to Gambas
Figura 4: Costruzione del menù.
destra del campo immagine.
I campi CheckBoxes sulla destra, Visible (visibile), Enabled (Abilitato) e Checked (Spuntato), si riferiscono allo stato della voce di menù. Per impostazione predefinita, tutte le voci dei
menù sono attive e visibili. In particolare, è possibile specificare se l’ItemMenu è spuntato oppure
no. Si può vedere se la voce è selezionata oppure no, guardando la proprietà Checked del menù.
Essa restituisce il valore TRUE (VERO) o FALSE (FALSO) indicante lo stato dell’oggetto. Ecco
un esempio di come assegnare un segno di spunta da on ad off, quando viene scelta una voce di
menù:
IF Menu2Item1.Checked THEN
Menu2Item1.Checked = FALSE
ELSE
Menu2Item1.Checked = TRUE
ENDIF
Il costrutto IF, controlla la proprietà Checked dell’oggetto Menu2Item1 e se il valore booleano
è TRUE viene impostata su FALSE. Se l’operatore booleano è NOT TRUE, viene eseguita la
clausola ELSE, impostando il Checked value su TRUE. Questo approccio può essere utilizzato per
attivare o disattivare qualsiasi menù o sottomenù.
NOTA: Usare questa logica con cautela in funzione di GUI semplici; molti utenti si sentono
sopraffatti quando l’interfaccia grafica si presenta ricca di opzioni.
0.2
Costruire i menù
Adesso creiamo il nostro menù. Quando avremo finito, vedremo qualcosa di simile alla figura 4.
Per iniziare, facciamo clic sul pulsante Inserisci. Inseriamo i menu ColorDialog, MessageBoxes,
FileDialogs ed Help a livello toplevel. Utilizziamo la figura 5 come riferimento.
Inseriamo le voci di menù nel primo menù. Queste voci apparterranno al menù ColorDialog della
figura 6.
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
5
A Beginner’s Guide to Gambas
Figura 5: Menù Toplevel.
Figura 6: Menù Colordialog.
Adesso posizioniamoci al livello toplevel successivo. Inseriamo le voci del menù MessageBoxes
come si vede in figura 7.
Assicuriamoci che l’Error, il Warning e il Delete, siano rientrati di due livelli sotto la voce di
menù Alert Messages. Adesso aggiungiamo l’ultima voce di menù, Help, facendo riferimento alla
figura 8.
Questo è tutto quello che serve! Facciamo clic sul pulsante OK per chiudere l’editor dei menù e
tornare sul form. Vedremo comparire i menù. Se non dovessero corrispondere a quelli dell’esempio,
torniamo al MenuEditor e impostiamo le voci fino a quando non soddisfino i criteri dell’esempio.
Il prossimo passo è scrivere il codice per gli eventi di ciascun menù. Prima di fare questo, abbiamo bisogno d’imparare ad utilizzare le finestre di dialogo standard e le finestre MessageBoxes
disponibili in Gambas.
0.3
La classe Dialog
La classe Dialog viene utilizzata per implementare tutte le finestre di dialogo standard di Gambas.
La classe fa uso di metodi statici per richiamarle. Questa classe è statica. I metodi supportati (per
le finestre di dialogo standard) sono i seguenti: OpenFile, Savefile, SelectColor, SelectDirectory e
SelectFont. Le proprietà supportate da questa classe sono: Color, Filter, Font, Path e Title.
Color è un valore intero che la finestra di dialogo SelectColor restituisce; esso rappresenta il
nome del colore selezionato. È interessante notare che Gambas dispone di 32 colori predefiniti,
ma la finestra di dialogo standard SelectColor ne contiene 48. Questo significa che non è possibile
utilizzare le costanti predefinite come Red, Black, ecc . . . , in un costrutto CASE o altrove. Ma allora, quando si è scelto un colore, come facciamo a determinare se si tratta di un colore predefinito
Figura 7: Menù Messagebox.
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
6
A Beginner’s Guide to Gambas
Figura 8: Menù Help.
o di un colore fuori dalla gamma dei 32 predefiniti in Gambas? È sufficiente scrivere un modulo
per stabilirlo! Torneremo su questo argomento dopo aver spiegato come utilizzare la finestra di
dialogo SelectColor.
Quando si utilizzano le finestre relative ai files, vengono restituite le proprietà Filter e Path.
Filter è definita come STATIC PROPERTY Filter AS String[] e restituisce o imposta i filtri
(vale a dire, classificare i files in base all’estensione, per esempio, tutti i files .doc o .png) utilizzati
nelle finestre di dialogo standard. Questa proprietà restituisce o riceve un array stringa. Ogni
elemento della matrice rappresenta un filtro che viene utilizzato ad ogni chiamata della finestra di
dialogo. Ogni filtro stringa deve rispettare la seguente sintassi:
• Nome del filtro.
• Uno spazio.
• Una parentesi aperta.
• Uno o più percorsi, separati da un punto e virgola.
• Una parentesi chiusa.
Di seguito, un esempio che dimostra l’utilizzo della proprietà Title della finestra di dialogo:
Dialog.Title = "Choose a file"
Dialog.Filter = ["Pictures (*.png;*.jpg;*.jpeg)","All files (*.*)"]
Dialog.OpenFile
La finestra di dialogo dei files (SelectDirectory, OpenFile e Savefile) restituisce la proprietà Path,
una stringa contenente il percorso del file selezionato. Nel caso della finestra di dialogo SelectDirectory, la stringa viene troncata al livello della directory. Ora, proviamo a codificare la nostra prima
voce del menu, Foreground Color (il colore di primo piano). Dalla finestra del form, scegliamo la
voce di Foreground Color sotto il menù ColorDialog ed inseriamo questo codice nella subroutine
PUBLIC SUB Menu1Item1 Click():
PUBLIC SUB Menu1Item1_Click()
Dialog.Title = "Choose a foreground color"
Dialog.SelectColor
TextLabel1.ForeColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
Per prima cosa, impostiamo il titolo della finestra di dialogo in “Choose a foreground color” in
modo che l’utente abbia un’idea di ciò che fà la finestra di dialogo. Chiamiamo la finestra di dialogo
con Dialog.SelectColor. Una volta che l’utente ha scelto o cancellato un colore dalla finestra di
dialogo, viene assegnato il nome del colore nella variabile TextLabel1.Text che abbiamo creato
all’inizio del nostro progetto. Scegliamo la TextLabel perché ci permette di formattare il nostro
output in questo modo:
TextLabel1.Text = "<b>Color selected was</b> "&Str(Dialog.Color) & " ."
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
7
Figura 9: Etichetta di testo formattata che visualizza il valore del colore.
La riga di codice di cui sopra, imposta in grassetto la parte “Color selected was” della stringa,
concatena alla stringa il valore Color, previa conversione del valore intero in stringa utilizzando la
funzione di conversione Str$, ed infine concatena una stringa finale di punteggiatura. Si dovrebbe
vedere qualcosa di simile alla figura 9.
Bhé, 21760 non è un’informazione molto utile. Questa è la rappresentazione interna del colore che
abbiamo selezionato. In effetti, abbiamo bisogno di sviluppare alcuni metodi per conoscere il tipo
di colore, rosso, blu, verde, cioé il nome della costante colore. Questo è quanto si stava alludendo
nella sezione precedente, a proposito del problema che si verifica con i colori. Ecco quindi che
entrano in gioco i moduli.
0.4
I moduli
Creiamo un modulo che restituisce il nome di un colore se si tratta di una costante predefinita. In
caso contrario, impostiamo una stringa che ci comunichi che non si tratta di una costante colore
predefinita. Definito il modulo, modifichiamo il codice per utilizzarlo. Dalla finestra del progetto,
trovare la voce Modules nel TreeView e selezionare un nuovo modulo, di nome Module1. Quando
appare la finestra di dialogo, lasciamo in bianco la CheckBoxes ed assumiamo il nome predefinito
facendo clic su OK. Una nuova finestra di codice, chiamata Module1.module, compare nell’IDE.
Essa dovrebbe presentare un commento simile a questo:
’ Gambas module file
Ora, scriviamo tutto il codice per la nostra funzione, che chiameremo SetColorName. In primo
luogo, dobbiamo dichiarare la funzione e individuare i parametri d’input ed output che saranno
processati. Ecco come fare:
PUBLIC FUNCTION SetColorName ( iVal AS Integer) AS String
Dichiariamo una funzione pubblica, che prende un parametro intero e restituisce una stringa.
Questo modulo necessita di un valore intero, acquisito dalla finestra di dialogo SelectColor, per
verificare se si tratta di uno dei 32 colori predefiniti utilizzati in Gambas. Se trova una corrispondenza con una costante colore, viene assegnato il nome ad una stringa temporanea. In caso
contario, impostiamo una stringa che comunichi che non si tratta di una costante colore. Per
creare una variabile stringa temporanea aggiungiamo questa variabile dichiarandola nella prima
riga di codice all’interno della funzione:
DIM rval AS String
Aggiungiamo un costrutto CASE SELECT. Esso utilizza il parametro intero iVal che viene passato
alla funzione. Ecco il codice da inserire:
’ Gambas module file
PUBLIC FUNCTION SetColorName ( iVal AS Integer) AS String
DIM rval AS String
SELECT iVal
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
8
A Beginner’s Guide to Gambas
CASE Color.Black
rval = "Black"
CASE Color.Blue
rval = "Blue"
CASE Color.Cyan
rval = "Cyan"
CASE Color.DarkBlue
rval = "DarkBlue"
CASE Color.DarkCyan
rval = "DarkCyan"
CASE Color.DarkGray
rval = "DarkGray"
CASE Color.DarkGreen
rval = "DarkGreen"
CASE Color.DarkMagenta
rval = "DarkMagenta"
CASE Color.DarkRed
rval = "DarkRed"
CASE Color.DarkYellow
rval = "DarkYellow"
CASE Color.Gray
rval = "Gray"
CASE Color.Green
rval = "Green"
CASE Color.LightGray
rval = "LightGray"
CASE Color.Magenta
rval = "Magenta"
CASE Color.Orange
rval = "Orange"
CASE Color.Pink
rval = "Pink"
CASE Color.Red
rval = "Red"
CASE Color.Transparent
rval = "Transparent"
CASE Color.Violet
rval = "Violet"
CASE Color.White
rval = "White"
CASE Color.Yellow
rval = "Yellow"
DEFAULT
rval = Str$(ival) & "
END SELECT
RETURN rval
END
and it is not a predefined color constant"
Dopo aver compilato questo codice, salviamo il file del modulo e torniamo alla finestra del codice
sul Form1. Dobbiamo modificare il codice della subroutine Menu1Item1 Click per utilizzare il
modulo. Di seguito il codice della nuova subroutine:
PUBLIC SUB Menu1Item1_Click()
Dialog.Title = "Choose a foreground color"
Dialog.SelectColor
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
9
ColorName = Module1.SetColorName(Dialog.Color)
TextLabel1.ForeColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
Abbiamo aggiunto la linea di codice ColorName = . . . ma non abbiamo ancora dichiarato la
variabile ColorName. Questa variabile deve essere globale, perché noi invochiamo un modulo che
restituisce il valore ColorName. Quindi, all’inizio del codice di Form1.class, aggiungiamo questo
codice prima della subroutine PUBLIC SUB Form Open ():
’ Gambas class file
’ declare a global variable to be used with our SetColorName module
ColorName AS String
Adesso, quando il programma viene eseguito, la variabile sarà nota. Nel codice di seguito, la
chiamata a:
ColorName = Module1.SetColorName(Dialog.Color)
restituisce la stringa alla nostra nostra variabile ColorName. La riga di codice seguente
TextLabel1.Forecolor = Dialog.Color
imposta il colore del testo di primo piano (ForeColor). Ora, prendiamo la stringa e visualizziamola
(formattata) assegnandola alla proprietà TextLabel1.Text:
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
La versione finale della routine Menu1Item1 Click dovrebbe essere cosı̀:
PUBLIC SUB Menu1Item1_Click()
Dialog.Title = "Choose a foreground color"
Dialog.SelectColor
ColorName = Module1.SetColorName(Dialog.Color)
TextLabel1.ForeColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
Adesso vogliamo fare la stessa cosa per il colore dello sfondo. La seconda voce di menù, del menu
ColorDialog, è proprio il colore di sfondo. Scriviamo nell’IDE il codice seguente:
PUBLIC SUB Menu1Item2_Click()
Dialog.Title = "Choose a background color"
Dialog.SelectColor
ColorName = Module1.SetColorName(Dialog.Color)
TextLabel1.BackColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
L’ultima opzione nel nostro primo menù è quella di cambiare il tipo di carattere. Per far questo,
utilizziamo la finestra di dialogo SelectFont. Ancora una volta, andiamo nel form dei menù e
scegliamo l’opzione Font del menù ColorDialog. I Fonts vengono gestiti in Gambas attraverso la
classe Font. Questa classe rappresenta un tipo di carattere impiegato per disegnare o visualizzare
del testo nei controlli. Questa classe si può creare. Per dichiarare una variabile font, si utilizza il
seguente formato:
DIM hFont AS Font
hFont = NEW Font ( [ Font AS String ] )
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
10
A Beginner’s Guide to Gambas
Il codice di cui sopra crea un nuovo oggetto font da un descrittore font. Questa classe si comporta
come una matrice in sola lettura. Il codice seguente crea e restituisce un nuovo oggetto font da
un descrittore font:
DIM hFont AS Font
hFont = Font [ Font AS String ]
Le proprietà che si possono utilizzare con Font includono:
• Ascent
• Bold
• Descent
• Fixed
• Italic
• Name
• Resolution
• Size
• StrikeOut
• Styles
• Underline
Di seguito un esempio di come utilizzare le proprietà Font:
Form1.Font.Name = "Utopia"
Form1.Font.Bold = TRUE
Form1.Font.Italic = TRUE
Form1.Font.Size = "14"
Form1.Font.StrikeOut = FALSE
Form1.Font.Underline = TRUE
La classe Font ha tre metodi che si possono invocare: Height, ToString e Width. Height è una
funzione che restituisce l’altezza del testo visualizzato con il font. Si dichiara come:
FUNCTION Height ( Text AS String ) AS Integer
ToString restituisce il nome completo di un font come descrittore stringa. Questa stringa è una
concatenazione di tutte le proprietà font separate da virgole. Si dichiara cosı̀:
FUNCTION ToString ( ) AS String
Un esempio di chiamata a ToString è:
PRINT Application.Font.ToString()
Width è una funzione che, al pari di Height, restituisce la larghezza del testo visualizzato con il
font:
FUNCTION Width ( Text AS String ) AS Integer
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
11
Ora continuiamo ad inserire il nostro codice per il programma MenuProject nella routine PUBLIC SUB Menu1Item3 Click(). In primo luogo, si dichiarano due variabili locali, fontdata e
oldfontdata. Vogliamo ottenere il nuovo font dalla chiamata della finestra di dialogo SelectFont, ma
vogliamo anche mantenere il vecchio dato font, nel caso in cui ce ne fosse bisogno. Successivamente,
dichiariamo due variabili stringa, attr e sel (attributo e selezione) per impostare il tipo di carattere
stringa assegnato; selezione è una stringa dinamica; essa cambia in base alle varie selezioni da parte
dell’utente.
PUBLIC SUB Menu1Item3_Click()
DIM fontdata AS font
DIM oldfontdata AS Font
DIM attr AS String
DIM sel AS String
A questo punto, è possibile che venga chiesto se non si può semplicemente utilizzare la proprietà
ToString per farlo. La risposta è Sı̀, ma in questo modo non s’impara molto. La riga di codice
seguente imposta semplicemente in bianco gli spazi vuoti della stringa attr:
attr = ""
Adesso, si assegna la proprietà TextLabel1.font alla variabile oldfontdata:
oldfontdata = TextLabel1.Font
Impostiamo il titolo della finestra di dialogo SelectFont e invochiamola con queste due righe:
Dialog.Title = " Pick a font... "
Dialog.SelectFont
Quando l’utente seleziona un font dalla finestra di dialogo SelectFont, vogliamo assegnare il il font
scelto alla variabile fontdata:
fontdata = Dialog.Font
A questo punto, verifichiamo l’attributo scelto dall’utente e la stringa dinamica di output che è
stata costruita. Avremmo potuto utilizzare un costrutto IF THEN ELSE per controllare ogni
proprietà supportata dalla classe Font, ma non è di nostro interesse in questo esercizio.
IF fontdata.Italic THEN
sel = " Italic"
attr = attr & sel
ENDIF
IF fontdata.Bold THEN
sel = " Bold"
attr = attr & sel
ENDIF
IF fontdata.Strikeout THEN
sel = " Strikeout"
attr = attr & sel
ENDIF
IF fontdata.Underline THEN
sel = " Underline"
attr = attr & sel
ENDIF
Adesso, impostiamo il font nel controllo textLabel1 in base alla scelta dell’utente e visualizziamo
dinamicamente la stringa di caratteri composta:
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
12
A Beginner’s Guide to Gambas
Figura 10: Colore e font selezionati.
Figura 11: Nuovo default per il font del controllo TextLabel1.
TextLabel1.Font = fontdata
TextLabel1.Text = "Font: "&fontdata.Name&", "&Str(Round(fontdata.Size)) & attr
Diamo l’opportunità o meno di mantenere le impostazioni correnti o ripristinare quelle precedenti,
impostando una pausa di cinque secondi:
WAIT 5.0
SELECT Message.Question("Keep the new font?", "Yes","No","Don’t know")
CASE 1
TextLabel1.Text = "This is now the default font."
CASE 2
TextLabel1.Font = oldfontdata
TextLabel1.Text = "Reverted to previous font setting."
CASE 3
TextLabel1.Font = oldfontdata
TextLabel1.Text = "No change was made to default font."
END SELECT
END
Si noti che abbiamo introdotto l’uso della MessageBoxes senza dare spiegazioni a riguardo. Questo
è il nostro prossimo compito. Salvare il progetto ed eseguirlo. I risultati dovrebbero essere simili
a quelli riportati in figura 10, a seconda dei colori e del font selezionato.
Se decidiamo di mantenere il default, dovremmo vedere qualcosa di simile alla figura 11.
A questo punto del nostro percorso di apprendimento, sappiamo abbastanza cose su Gambas.
Proseguiamo con la gestione dell’input e dell’output. Le MessageBoxes sono un altro prezioso
strumento di Gambas. Conosciamole più da vicino.
0.5
MessageBoxes (finestre di messaggio)
I controlli MessageBox sono uno strumento molto pratico per comunicare informazioni all’utente
e per ottenere risposte del tipo TRUE/FALSE. In generale, le MessageBoxes rientrano in una
delle quattro grandi categorie: domanda del tipo and/or, informazione, avvertimento, notifica di
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
13
Figura 12: Un’informazione in un MessageBox.
Figura 13: Il menù Info Message spuntato.
errore/allarme. Per visualizzare queste MessageBoxes viene utilizzata la classe Message. Questa
classe è statica e può essere utilizzata come una funzione. Si dichiara cosı̀:
STATIC FUNCTION Messagge (Message As String [, Button As String]) As Integer
I metodi supportati dalla classe Message sono Info, Question, Delete, Error e Warning. Si è già
visto il metodo Message.Question. Ogni metodo serve per uno scopo specifico e deve essere pensato
con attenzione. Iniziamo con il metodo più semplice del MessageBox, il metodo Information.
0.5.1
Messaggi Information
Questo metodo viene dichiarato come:
STATIC FUNCTION Info (Message As String [, Button As String]) As Integer
ed è utilizzato per visualizzare informazioni in un MessageBox con un solo pulsante. L’utente
non è tenuto a prendere nessuna decisione; egli deve prendere atto esclusivamente del messaggio
d’informazione. Per questo è necessario un solo pulsante. Ecco ciò che il nostro codice produce
(figura 12).
Per continuare a costruire il nostro programma, sul Form1 andiamo al menù MessageBoxes e facciamo clic sulla voce Info Message. Nell’editor del codice inseriamo quanto segue nella subroutine
Menu2Item1 Clicked():
PUBLIC SUB Menu2Item1_Click()
Message.Info("Here is some information to consider.")
END
Semplice, vero? Come fare invece se vogliamo passare dal valore TRUE a FALSE e viceversa, ogni
volta che selezioniamo la voce del menù (figura 13)?
Modifichiamo il codice di cui sopra come segue:
PUBLIC SUB Menu2Item1_Click()
IF Menu2Item1.Checked THEN
Menu2Item1.Checked = FALSE
ELSE
Menu2Item1.Checked = TRUE
ENDIF
Message.Info("Here is some information to consider.")
END
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
14
A Beginner’s Guide to Gambas
La figura 13 mostra il menù item spuntato. Selezioniamo e deselezioniamo un paio di volte. Non
è stato troppo difficile, vero? Ora passiamo alla prossima MessageBox.
0.5.2
Messaggi conferma
Di questa categoria fanno parte Question e Delete. Question è definita come:
STATIC FUNCTION Question ( Message AS String [ , Button1 AS String,
Button2 AS String, Button3 AS String ] ) AS Integer
Invochiamo una MessageBox tipo question con tre pulsanti. Viene restituito l’indice del pulsante
in base al clic dell’utente. Torniamo al odice precedente ed esaminiamolo in dettaglio:
SELECT Message.Question("Keep the new font?", "Yes","No","Don’t know")
CASE 1
TextLabel1.Text = "This is now the default font."
CASE 2
TextLabel1.Font = oldfontdata
TextLabel1.Text = "Reverted to previous font setting."
CASE 3
TextLabel1.Font = oldfontdata
TextLabel1.Text = "No change was made to default font."
END SELECT
Dato che viene restituito l’indice del pulsante cliccato dall’utente, è più facile incorporare la chiamata alla Message.Question in un costrutto SELECT/CASE. SELECT restituisce un valore intero;
poiché sappiamo che possono essere restituiti solo i CASE 1, 2 o 3, non ci serve una sezione di
default. Si potrebbe tuttavia implementarla, ma non è necessario. A seconda del valore restituito,
si esegue un’azione Yes, un’azione No, o un’azione Don’t know perché questo è ciò che è specificato nella nostra chiamata alla finestra di dialogo (nel costrutto SELECT). Adesso scriviamo il
nuovo codice per la voce Question Message del menù MessageBoxes. Selezioniamola dal Form1 e
inseriamo il codice seguente:
PUBLIC SUB Menu2Item3_Click()
SELECT Message.Question("Did you like this?", "Yes","No","Don’t know")
CASE 1
TextLabel1.Text = "Liked it."
CASE 2
TextLabel1.Text = "Did not like it."
CASE 3
TextLabel1.Text = "Did not know."
END SELECT
END
Quando si esegue il programma vedremo qualcosa di simile alla figura 14.
0.5.3
Messaggi Error
La funzione Error mostra un MessageBox error con tre pulsanti. Viene restituito l’indice del
pulsante selezionato dall’utente. Error è definita come:
STATIC FUNCTION Error (Message AS String[,Btn1 AS String, Btn2 AS String, Btn3
AS String]) AS Integer
Torniamo indietro al Form1 e facciamo clic sul subMenuItem Error Message. Digitiamo il seguente
codice:
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
15
Figura 14: MessageBox tipo Question.
Figura 15: MessageBox tipo Error.
PUBLIC SUB subMenuItem1_Click()
Message.Error("Wow! This was a mistake.")
END
La figura 15 mostra quello che dovrebbe vedersi quando eseguiamo il programma.
0.5.4
Messaggi Warning a Alert
La finestra di messaggio Warning contiene tre pulsanti. Viene restituito l’indice del pulsante
selezionato dall’utente. La finestra Warning si dichiara cosı̀:
STATIC FUNCTION Warning (Message AS String[,Btn1 AS String, Btn2 AS
String, Btn3 AS String ] ) AS Integer
Nel nostro programma di esempio, i messaggi error, warning e delete fanno parte di un sottomenù
che abbiamo creato per farli comparire sotto la voce Alert Message. Per codificare il messaggio
di warning, abbiamo bisogno di cliccare sulla voce Warning Message di Alert Message. Scriviamo
questo codice:
PUBLIC SUB subMenuItem2_Click()
Message.Warning("You have been warned about this!")
END
Quando eseguiamo il programma vedremo qualcosa di simile alla figura 16.
0.5.5
Messaggi Delete
La funzione Delete mostra la MessageBox di cancellazione con tre pulsanti. Viene restituito l’indice
del pulsante selezionato dall’utente. Delete si dichiara cosı̀:
STATIC FUNCTION Delete (Message AS String [, Btn1 AS String, Btn2 AS
String, Btn3 AS String ] ) AS Integer
Selezioniamo l’evento clic per Delete Message e scriviamo il seguente codice:
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
16
A Beginner’s Guide to Gambas
Figura 16: MessageBox tipo Error.
Figura 17: MessageBox Deleet con tre pulsanti.
PUBLIC SUB subMenuItem3_Click()
SELECT Message.Delete("Delete?", "Yes","No","Cancel")
CASE 1
TextLabel1.Text = "Deleted it."
CASE 2
TextLabel1.Text = "Not Deleted."
CASE 3
TextLabel1.Text = "Canceled!"
END SELECT
END
Quando eseguiamo il programma vedremo qualcosa di simile alla figura 17.
0.6
Funzioni Dialog Class per i Files
Le finestre di dialogo standard fornite con Gambas supportano anche l’apertura di un file, il
salvataggio di un file e la scelta di un percorso di una directory. Esse sono piuttosto standard ma
il grande vantaggio consiste nel non doverle costruire all’occorrenza. Questa sezione mostra come
è facile usarle nelle operazioni sui files.
0.6.1
Funzione dialogo OpenFile
La funzione dialogo OpenFile invoca la finestra di dialogo standard per i files con acquisizione
del nome di un file da aprire. Questa funzione restituisce TRUE se l’utente clicca sul pulsante
CANCEL e FALSE se l’utente clicca sul pulsante OK. Essa si dichiara cosı̀:
STATIC FUNCTION OpenFile ( ) AS Boolean
Dalla finestra del form del nostro programma, fare clic sul menù FileDialogs e selezionare la voce
di menù File open . . . Questo avvierà l’eventop clic che conterrà il seguente codice:
PUBLIC SUB Menu3Item1_Click()
Dialog.Title = " Open file... "
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
17
Figura 18: La finestra di dialogo Open File.
Dialog.OpenFile
TextLabel1.Text = " OPEN: " & Dialog.Path
END
Il codice di cui sopra definisce semplicemente il titolo e chiama la finestra di dialogo standard.
Quando l’utente termina la selezione, la stringa restituita dalla finestra Dialog OpenFile, viene
assegnata alla variabile TextLabel1.Text. Ecco ciò che dovrebbe vedersi quando eseguiamo il
programma (figura 18):
0.6.2
Funzione dialogo SaveFile
La funzione dialogo SaveFile invoca la finestra di dialogo standard per i files acquisendo il nome
di un file da salvare. Questa funzione restituisce TRUE se l’utente clicca sul pulsante CANCEL e
FALSE se l’utente clicca sul pulsante OK. Essa si dichiara cosı̀:
STATIC FUNCTION SaveFile ( ) AS Boolean
Creiamo l’evento clic per File Save . . . nel menù FileDialogs inserendo il seguente codice:
PUBLIC SUB Menu3Item2_Click()
Dialog.Title = " Save file to... "
Dialog.SaveFile
TextLabel1.Text = "SAVE: " & Dialog.Path
END
La figura 19 mostra il risultato.
0.6.3
Funzione dialogo SelectDirectory
La funzione dialogo SelectDirectory invoca la finestra di dialogo standard per acquisire il nome
della directory corrente. Questa funzione restituisce TRUE se l’utente clicca sul pulsante CANCEL
e FALSE se l’utente clicca sul pulsante OK. Essa si dichiara cosı̀:
STATIC FUNCTION SelectDirectory ( ) AS Boolean
Questo è l’ultimo evento clic che dobbiamo codificare. Scegliamo nel menù FileDialogs la voce
SelectDir e scriviamo il seguente codice:
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
18
A Beginner’s Guide to Gambas
Figura 19: La finestra di dialogo Save File.
Figura 20: La finestra di dialogo Select Directory.
PUBLIC SUB Menu3Item3_Click()
Dialog.Title = " Pick a dir... "
Dialog.SelectDirectory
TextLabel1.Text = "SAVE to DIR: " & Dialog.Path
END
Salviamo il nostro progetto ed eseguiamo il programma. La figura 20 mostra quello che dovremmo
vedere.
A questo punto abbiamo scritto tutto il codice necessario per completare il nostro programma
MenuProject. Salviamo ed eseguiamo il programma. La sezione successiva presenta il codice
sorgente completo del programma . Nel prossimo capitolo, impareremo a gestire l’input e l’output
da parte degli utenti utilizzando stringhe e files.
0.7
Codice sorgente completo del programma
’ Gambas class file
’ declare a global variable to be used with our SetColorName module
ColorName AS String
PUBLIC SUB Form_Open()
ME.Caption = " Working with Menus "
END
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
19
PUBLIC SUB QuitBtn_Click()
Form1.Close
END
PUBLIC SUB Menu1Item1_Click()
Dialog.Title = "Choose a foreground color"
Dialog.SelectColor
ColorName = Module1.SetColorName(Dialog.Color)
TextLabel1.ForeColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
PUBLIC SUB Menu1Item2_Click()
Dialog.Title = "Choose a background color"
Dialog.SelectColor
ColorName = Module1.SetColorName(Dialog.Color)
TextLabel1.BackColor = Dialog.Color
TextLabel1.Text = "<b>Color selected was</b> " & ColorName & "."
END
PUBLIC SUB Menu1Item3_Click()
DIM fontdata AS font
DIM oldfontdata AS Font
DIM attr AS String
DIM sel AS String
attr = ""
oldfontdata = TextLabel1.Font
Dialog.Title = " Pick a font... "
Dialog.SelectFont
fontdata = Dialog.Font
IF fontdata.Italic THEN
sel = " Italic"
attr = attr & sel
ENDIF
IF fontdata.Bold THEN
sel = " Bold"
attr = attr & sel
ENDIF
IF fontdata.Strikeout THEN
sel = " Strikeout"
attr = attr & sel
ENDIF
IF fontdata.Underline THEN
sel = " Underline"
attr = attr & sel
ENDIF
TextLabel1.Font = fontdata
TextLabel1.Text = "Font: " & fontdata.Name & ", " & Str(Round
(fontdata.Size)) & attr
WAIT 5.0
SELECT Message.Question("Keep new font?", "Yes","No","Don’t know")
CASE 1
TextLabel1.Text = "This is now the default font."
CASE 2
TextLabel1.Font = oldfontdata
TextLabel1.Text = "Reverted to previous font setting."
CASE 3
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
20
A Beginner’s Guide to Gambas
TextLabel1.Font = oldfontdata
TextLabel1.Text = "No change was made to default font."
END SELECT
END
PUBLIC SUB Menu2Item1_Click()
IF Menu2Item1.Checked THEN
Menu2Item1.Checked = FALSE
ELSE
Menu2Item1.Checked = TRUE
ENDIF
Message.Info("Here is some information to consider.")
END
PUBLIC SUB subMenuItem1_Click()
Message.Error("Wow! This was a mistake.")
END
PUBLIC SUB subMenuItem2_Click()
Message.Warning("You have been warned about this!")
END
PUBLIC SUB subMenuItem3_Click()
SELECT Message.Delete("Delete?", "Yes","No","Cancel")
CASE 1
TextLabel1.Text = "Deleted it"
CASE 2
TextLabel1.Text = "Not Deleted"
CASE 3
TextLabel1.Text = "Cancelled!"
END SELECT
END
PUBLIC SUB Menu2Item3_Click()
SELECT Message.Question("Did you like this?", "Yes","No","Don’t know")
CASE 1
TextLabel1.Text = "Liked it."
CASE 2
TextLabel1.Text = "Did not like it."
CASE 3
TextLabel1.Text = "Did not know."
END SELECT
END
PUBLIC SUB Menu3Item1_Click()
Dialog.Title = " Open file... "
Dialog.OpenFile
TextLabel1.Text = " OPEN: " & Dialog.Path
END
PUBLIC SUB Menu3Item2_Click()
Dialog.Title = " Save file to... "
Dialog.SaveFile
TextLabel1.Text = "SAVE: " & Dialog.Path
END
PUBLIC SUB Menu3Item3_Click()
Dialog.Title = " Pick a dir... "
Dialog.SelectDirectory
TextLabel1.Text = "SAVE to DIR: " & Dialog.Path
END
PUBLIC SUB Menu4Item1_Click()
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
A Beginner’s Guide to Gambas
21
Message.Info("This is all about<br><b> Gambas Programming</b>!")
END
0.8
Codice sorgente di Module1.module
’ Gambas module file
PUBLIC FUNCTION SetColorName ( iVal AS Integer) AS String
rval AS String
SELECT iVal
CASE Color.Black
rval = "Black"
CASE Color.Blue
rval = "Blue"
CASE Color.Cyan
rval = "Cyan"
CASE Color.DarkBlue
rval = "DarkBlue"
CASE Color.DarkCyan
rval = "DarkCyan"
CASE Color.DarkGray
rval = "DarkGray"
CASE Color.DarkGreen
rval = "DarkGreen"
CASE Color.DarkMagenta
rval = "DarkMagenta"
CASE Color.DarkRed
rval = "DarkRed"
CASE Color.DarkYellow
rval = "DarkYellow"
CASE Color.Gray
rval = "Gray"
CASE Color.Green
rval = "Green"
CASE Color.LightGray
rval = "LightGray"
CASE Color.Magenta
rval = "Magenta"
CASE Color.Orange
rval = "Orange"
CASE Color.Pink
rval = "Pink"
CASE Color.Red
rval = "Red"
CASE Color.Transparent
rval = "Transparent"
CASE Color.Violet
rval = "Violet"
CASE Color.White
rval = "White"
CASE Color.Yellow
rval = "Yellow"
DEFAULT
rval = Str$(ival) & " and it is not a predefined color constant"
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.
22
A Beginner’s Guide to Gambas
END SELECT
RETURN rval
END
This product is [C] 2005 by John W. Rittinghouse, all rights reserved. It is released to the
Gambas User Community under an Open Content License [OCL] and may not be distributed
under any other terms or conditions without the express written consent of the author.