Cos'è MiniGUI
MiniGUI è una libreria GUI (graphic User Interface) per i compilatori Harbour e xHarbour.
Il principale scopo di MiniGUI è consentire un semplice accesso agli elementi dell'API GUI di Windows (nascondendo la specifica complessità dell'operazione).
MiniGUI non è
basata su classi (non è 'veramente' OOP). Essa implementa un
modello semi-oop.
Il mio obbiettivo è ottenere la maggior
parte dei vantaggi della programmazione OOP nascondendo il suo 'lato
oscuro';)
Secondo il mio modesto parere, questo modello si adatta perfettamente con xBase, poiché l'obbiettivo dei creatori originali di dBase era di ottenere la massima potenza con il minimo sforzo di programmazione. Questa fu la chiave del suo tremendo successo.
Nella maggior parte dei casi, i prodotti xBase per Windows, consistono in un compilatore xBase legato ad un motore OOP GUI standard, dando luogo a linguaggi 'schizoidi', estremamente facili da utilizzare in tutti i loro aspetti, eccetto la creazione di GUI.
Ho cercato di creare un sistema GUI coerente con la filosofia xBase, senza badare strettamente a nessun paradigma di programmazione standard.
Alcune idee del modello semi-oop di MINIGUI sono ispirate dall'eminente compilatore basic Rapid-Q di William Yu. Desidero pubblicamente ringraziarlo per le sue brillanti idee e la sua aperta visione della scienza della programmazione.
Note alla traduzione italiana:
Nel tradurre il testo originale dall'inglese si è cercato di armonizzare i contenuti con una forma il più possibile scorrevole in italiano, pur mantenendo il più possibile la traduzione letterale. In alcuni casi termini inglesi di corrente utilizzo nel gergo della programmazione sono stati conservati in lingua originale. In altri casi si è ritenuto utile aggiungere note di spiegazione per termini di chiaro significato in inglese ma forse di non immediata comprensione per lettori di lingua italiana. Tali note aggiuntive sono identificate dal simbolo (§) a fine riga.
Per maggiori dettagli ed una più completa descrizione delle funzionalità offerte da MINIGUI si rimanda alla guida / reference (in inglese) compresa nel pacchetto di distribuzione.
Il vostro primo programma in MINIGUI
Non sarò originale, così questo programma visualizzerà il messaggio 'Hello World' :)
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT 0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 01 - Hello World!' ;
MAIN
END WINDOW
ACTIVATE WINDOW Win_1
Return
comando DEFINE WINDOW: Creerà la finestra principale del programma. Tutto quanto di competenza del menu principale è collocato tra i comandi DEFINE WINDOW / END WINDOW. (§)
Win_1: E' il nome del programma.
AT 0,0: Indica la posizione della finestra (riga=0,colonna=0)
WIDTH 400: Significa che la finestra avrà una larghezza di 400 pixel.
HEIGHT 200: Significa che la finestra avrà un'altezza di 400 pixel.
TITLE 'Hello World!': Indica il testo nella barra del titolo della finestra.
MAIN: Indica che stiamo definendo la finestra principale dell'applicazione (una finestra principale è necessaria per ogni applicazione MINIGUI)
ACTIVATE WINDOW Form_1: Mostrerà la finestra e darà inizio al 'event loop' (attesa eventi).
L'Approccio tradizionale
Potete modificare il comportamento/aspetto delle finestre (controllli) usando un comando in stile xBase (MODIFY)
Nell'esempio precedente, se desiderate modificare il titolo della finestra, potete utilizzare la linea di comando seguente:
MODIFY WINDOW Win_1 TITLE 'Nuovo Titolo'
Se invece desiderate recuperare il titolo della finestra:
FETCH WINDOW Win_1 TITLE TO cVar
L'Approccio Semi-OOP
Per fare le stesse cose, potete usare una sintassi semi-oop:
Win_1.Title := 'Nuovo Titolo'
cVar := Win_1.Title
Aggiungere il Menu principale
Ora aggiungeremo un menu principale al programma:
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT 0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 02 - Test Proprietà' ;
MAIN
DEFINE MAIN MENU
POPUP "Primo Popup"
ITEM 'Cambia Titolo Finestra' ACTION Win_1.Title := 'New Title'
ITEM 'Recupera Titolo Finestra' ACTION MsgInfo ( Win_1.Title )
END POPUP
END MENU
END WINDOW
ACTIVATE WINDOW Win_1
Return
Come potete vedere è semplice ed intuitivo.
Tutto quanto di competenza del menu principale è collocato tra i comandi DEFINE MAIN MENU / END MENU .
Ogni singolo menu popup sarà compreso tra i comandi POPUP / END POPUP.
Ogni singola voce del menu sarà codificata per mezzo del comando ITEM.
La clausola ACTION specifica l'azione da eseguire. (§)
Potete utilizzzare tutti i popup di cui avete bisogno e potetet nidificarli senza alcun limite.
La funzione MsgInfo()
E' questa una funzione molto utile. Mostrerà una piccola finestra (con l'icona 'informazione' di sistema ) ed un messaggio (di tipo carattere) passato come parametro.
MsgInfo ( 'Messaggio') (§)
Potete opzionalmente aggiungere un titolo (passato come secondo parametro).
MsgInfo ( 'Messaggio' , 'Titolo' ) (§)
Aggiungere un'etichetta (Label)
Il controllo label permette di la visualizzazione di testi in modo molto semplice.
@ 100,10 LABEL Label_1 VALUE 'Questa è un'etichetta!'
@ 100,10 significa che il testo verrà visualizzato alla riga 100, colonna 10 (ricordate che l'unità di misura è il pixel)
Label_1 è il nome del controllo (che verrà usato per identificarlo)
VALUE indica il valore inizialmente assegnato al controllo al momento della creazione.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 03 - Test
etichette/LABEL' ;
MAIN
@ 100,10 LABEL Label_1 VALUE 'Questa è una etichetta!'
END WINDOW
ACTIVATE WINDOW Win_1
Return
Ricevere dati dall'utente (Il controllo TextBox)
Il controllo TextBox è il modo principale per ricevere dati dall'utente.
@ 40 , 120 TEXTBOX Text_1
Se volete ricevere dati numerici, è sufficiente aggiungere la clausola NUMERIC:
@ 80 , 120 TEXTBOX Text_2 NUMERIC
Se volete specificare una maschera di editing (formato dei dati), potete utilizzare la clausola INPUTMASK.
@ 120 , 120 TEXTBOX Text_2 NUMERIC INPUTMASK '9999.99'
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 300 ;
TITLE 'Tutor 04 TextBox Test'
;
MAIN
DEFINE MAIN MENU
POPUP "Primo Popup"
ITEM
'Cambia contenuto TextBox' ACTION Win_1.Text_1.Value := 'Nuovo valore
TextBox '
ITEM 'Recupera contenuto TextBox' ACTION MsgInfo (
Win_1.Text_1.Value)
SEPARATOR
ITEM 'Cambia contenuto Numeric
TextBox' ACTION Win_1.Text_2.Value := 100
ITEM 'Recupera contenuto
Numeric TextBox' ACTION MsgInfo (
Str(Win_1.Text_2.Value))
SEPARATOR
ITEM 'Cambia contenuto
Numeric (InputMask) TextBox' ACTION Win_1.Text_3.Value :=
1234.12
ITEM 'Recupera contenuto Numeric (InputMask) TextBox'
ACTION MsgInfo ( Str(Win_1.Text_3.Value))
END POPUP
END MENU
@ 40 , 120 TEXTBOX Text_1
@ 80 , 120 TEXTBOX Text_2 NUMERIC
@ 120 , 120 TEXTBOX Text_3 NUMERIC INPUTMASK '9999.99'
END WINDOW
ACTIVATE WINDOW Win_1
Return
Ricevere informazioni Logiche
Alcune volte avrete bisogno di ricevere dall'utente informazioni di tipo logico. Il metodo più semplice per fare questo è utilizzare il controllo CHECKBOX.
@ 180, 120 CHECKBOX Check_1
Aggiungiamolo al programma, assieme a nuove opzioni di menu per gestire il suo valore.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 300 ;
TITLE 'Tutor 05 - CheckBox
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia CheckBox Value' ACTION Win_1.Check_1.Value := .T.
ITEM
'Recupera CheckBox Value' ACTION MsgInfo (
if(Win_1.Check_1.Value,'.T.','.F.'))
END POPUP
END MENU
@ 100, 120 CHECKBOX Check_1 CAPTION 'Check Me!'
END WINDOW
ACTIVATE WINDOW Win_1
Return
Fare una scelta
Il miglior modo per proporre all'utente la scelta tra un numero limitato di opzioni già note al momento del design è l'utilizzo del controllo RADIOGROUP.
@ 80, 120 RADIOGROUP Radio_1 OPTIONS {'Opzione 1','Opzione 2','Opzione 3'}
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 06 - RadioGroup
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM 'Cambia RadioGroup Value' ACTION Win_1.Radio_1.Value := 2
ITEM 'Recupera RadioGroup Value' ACTION MsgInfo ( Str(Win_1.Radio_1.Value))
END POPUP
END MENU
@ 80, 120 RADIOGROUP Radio_1 OPTIONS {'Opzione 1','Opzione 2','Opzione 3'}
END WINDOW
ACTIVATE WINDOW Win_1
Return
Altre possibilità
Oltre al controllo RadioGroup, ci sono varie possibilità per proporre un ascelta all'utente. Una di queste è il controllo LISTBOX.
@ 10, 10 LISTBOX List_1 ITEMS {'Opzione 1','Opzione 2','Opzione 3'}
Utilizzando una ListBox potrete aggiungere, modificare o togliere elementi (opzioni di scelta) durante l'esecuzione del programma (runtime).
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 07 - ListBox
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia ListBox Value' ACTION Win_1.List_1.Value := 2
ITEM
'Recupera ListBox Value' ACTION MsgInfo (
Str(Win_1.List_1.Value))
SEPARATOR
ITEM 'Add List Item' ACTION
Win_1.List_1.AddItem ('New List Item')
ITEM 'Rimuovi List Item'
ACTION Win_1.List_1.DeleteItem (2)
ITEM 'Cambia List Item' ACTION
Win_1.List_1.Item (1) := 'New Item Text'
ITEM 'Get List Item
Count' ACTION MsgInfo (Str(Win_1.List_1.ItemCount))
END POPUP
END MENU
@ 10, 10 LISTBOX List_1 ITEMS {'Opzione 1','Opzione 2','Opzione 3'}
END WINDOW
ACTIVATE WINDOW Win_1
Return
Altre possibilità - II
Altra alternativa per gestire una scelta dell'utente è il controllo COMBOBOX.
@ 10, 10 COMBOBOX Combo_1 ITEMS {'Opzione 1','Opzione 2','Opzione 3'}
L'utilizzo di Combobox è simile a quello della ListBox.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 08 - ComboBox
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia valore ComboBox' ACTION Win_1.Combo_1.Value := 2
ITEM
'Recupera valore ComboBox' ACTION MsgInfo (
Str(Win_1.Combo_1.Value))
SEPARATOR
ITEM 'Aggiungi elemento
Combo' ACTION Win_1.Combo_1.AddItem ('Nuovo elemento Lista')
ITEM
'Rimuovi elemento Combo' ACTION Win_1.Combo_1.DeleteItem (2)
ITEM
'Cambia elemento Combo' ACTION Win_1.Combo_1.Item (1) := 'Nuovo testo
elemento'
ITEM 'Conta elementi Combo' ACTION MsgInfo
(Str(Win_1.Combo_1.ItemCount))
END POPUP
END MENU
@ 10, 10 COMBOBOX Combo_1 ITEMS {'Opzione 1','Opzione 2','Opzione 3'}
END WINDOW
ACTIVATE WINDOW Win_1
Return
Azione! (Pulsanti Standard)
A parte i menu, un altro modo per interagire con l'utente sono i pulsanti (Buttons).
@ 10,10 BUTTON Button_1 CAPTION 'Click Here!' ACTION MsgInfo('Button Clicked!')
CAPTION
specifica il testo visualizzato dal controllo (§)
La clausola
ACTION specifica l'azione da eseguire (§).
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 09 - Button
Test' ;
MAIN
@ 10,10 BUTTON Button_1 ;
CAPTION
'Click qui!' ;
ACTION MsgInfo('Button Clicked!')
END WINDOW
ACTIVATE WINDOW Win_1
Return
Una maggiore resa grafica (Picture Buttons)
Invece di un testo, il controllo BUTTON può visualizzare un'immagine.
@ 10,10 BUTTON PictureButton_1 ;
PICTURE
'button.bmp' ;
ACTION MsgInfo('Picture Button Clicked!!') ;
WIDTH
27 ;
HEIGHT 27 ;
TOOLTIP 'Picture Button Tooltip'
La clausola opzionale TOOLTIP provoca la visualizzazione di una piccola finestra contenente testo esplicativo quando il cursore del mouse si sofferma sul controllo per qualche istante. Potete utilizzare questa clausola con la maggior parte dei controlli di MiniGUI.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 10 - Picture
Button Test' ;
MAIN
@ 10,10 BUTTON PictureButton_1 ;
PICTURE
'button.bmp' ;
ACTION MsgInfo('Picture Button Clicked!!') ;
WIDTH
27 ;
HEIGHT 27 ;
TOOLTIP 'Picture Button Tooltip'
END WINDOW
ACTIVATE WINDOW Win_1
Return
BUTTON + CHECKBOX = CHECKBUTTON
Il controllo CHECKBUTTON si comporta come una CheckBox, ma si presenta come un Button. E come i controlli Button è disponibile in due varianti: Testo e Grafica.
@ 10,10 CHECKBUTTON CheckButton_1 ;
CAPTION
'CheckButton' ;
VALUE .F.
@ 50,10 CHECKBUTTON CheckButton_2 ;
PICTURE
'Open.Bmp' ;
WIDTH 27 ;
HEIGHT 27 ;
VALUE .F. ;
TOOLTIP
'Graphical CheckButton'
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 11 - CheckButton
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia valore Text CheckButton' ACTION Win_1.CheckButton_1.Value :=
.T.
ITEM 'Recupera valore Text CheckButton' ACTION MsgInfo (
if(Win_1.CheckButton_1.Value,'.T.','.F.'))
SEPARATOR
ITEM
'Cambia valore Picture CheckButton' ACTION Win_1.CheckButton_2.Value
:= .T.
ITEM 'Recupera valore Picture CheckButton' ACTION MsgInfo (
if(Win_1.CheckButton_2.Value,'.T.','.F.'))
END POPUP
END MENU
@ 10,10 CHECKBUTTON CheckButton_1 ;
CAPTION
'CheckButton' ;
VALUE .F.
@ 50,10 CHECKBUTTON CheckButton_2 ;
PICTURE
'Open.Bmp' ;
WIDTH 27 ;
HEIGHT 27 ;
VALUE .F. ;
TOOLTIP
'Graphical CheckButton'
END WINDOW
ACTIVATE WINDOW Win_1
Return
Gestire le Date (Il controllo DATEPICKER)
Il modo più semplice di ricevere l'immissione di date da parte dell'utente è il controllo DATEPICKER.
@ 10,10 DATEPICKER Date_1
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 12 - DatePicker
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia valore DatePicker' ACTION Win_1.date_1.Value := Date()
ITEM
'Recupera valore DatePicker' ACTION MsgInfo (
dtoc(Win_1.Date_1.Value))
END POPUP
END MENU
@ 10,10 DATEPICKER Date_1
END WINDOW
ACTIVATE WINDOW Win_1
Return
Gestire testi di grandi dimensioni (Il controllo EDITBOX)
Il controllo EDITBOX consente di gestire testi di grandi dimensioni (multilinea).
@ 10,10 EDITBOX Edit_1 ;
WIDTH
300 ;
HEIGHT 150
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 300 ;
TITLE 'Tutor 13 EditBox Test'
;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia contenuto EditBox' ACTION Win_1.Edit_1.Value := 'Nuovo valore
EditBox'
ITEM 'Recupera contenuto EditBox Content' ACTION MsgInfo
( Win_1.Edit_1.Value)
END POPUP
END MENU
@ 10,10 EDITBOX Edit_1 ;
WIDTH
300 ;
HEIGHT 150
END WINDOW
ACTIVATE WINDOW Win_1
Return
Visualizzare Immagini (Il controllo IMAGE)
Il controllo IMAGE permette di visualizzare immagini nel vostro programma.
@ 10,10 IMAGE Image_1 ;
PICTURE
'Demo.Bmp' ;
WIDTH 90 ;
HEIGHT 90
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 14 Image Test'
;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia contenuto Image' ACTION Win_1.Image_1.Picture :=
'Open.Bmp'
ITEM 'Recupera contenuto Image' ACTION MsgInfo (
Win_1.Image_1.Picture)
END POPUP
END MENU
@ 10,10 IMAGE Image_1 ;
PICTURE
'Demo.Bmp' ;
WIDTH 90 ;
HEIGHT 90
END WINDOW
ACTIVATE WINDOW Win_1
Return
Mostrare i Progressi
The progressbar control allows to show the completion status of an operation.
@ 10,10 PROGRESSBAR Progress_1 ;
RANGE 0 , 65535
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 15 Progressbar
Test' ;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM 'ProgressBar Test' ACTION DoTest()
END POPUP
END MENU
@ 10,10 PROGRESSBAR Progress_1 ;
RANGE 0 , 65535
END WINDOW
ACTIVATE WINDOW Win_1
Return
Procedure DoTest()
Local i
For i = 0 To 65535 Step 25
Win_1.Progress_1.Value := i
Next i
Return
Spinning
Un modo alternativo di ricevere dati numerici è il controllo SPINNER. Si tratta di una TextBox dotata di due frecce che permettono di cambiare il valore numerico del controllo usando il mouse.
@ 10,10 SPINNER Spinner_1 ;
RANGE
0,10 ;
VALUE 5 ;
WIDTH 100
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 16 Spinner Test'
;
MAIN
DEFINE MAIN MENU
POPUP "First Popup"
ITEM
'Cambia valore Spinner' ACTION Win_1.Spinner_1.Value := 8
ITEM
'Recupera valore Spinner' ACTION MsgInfo (
Str(Win_1.Spinner_1.Value))
END POPUP
END MENU
@ 10,10 SPINNER Spinner_1 ;
RANGE
0,10 ;
VALUE 5 ;
WIDTH 100
END WINDOW
ACTIVATE WINDOW Win_1
Return
Organizzarsi (Controllo TAB)
Il controllo TAB permette di organizzare i controlli e di risparmiare spazio sul form (finestra), raggruppando i controlli in cartelle.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 250 ;
TITLE 'Tutor 17 Tab Test'
;
MAIN
DEFINE MAIN MENU
POPUP "Primo Popup"
ITEM
'Cambia valore Tab' ACTION Win_1.Tab_1.Value := 2
ITEM 'Recupera
valore Tab' ACTION MsgInfo ( Str(Win_1.Tab_1.Value))
END POPUP
END MENU
DEFINE TAB Tab_1 ;
AT
10,10 ;
WIDTH 350 ;
HEIGHT 150
PAGE 'Page 1'
@ 50,50 LABEL Label_1 VALUE 'Questa è la pagina 1'
END PAGE
PAGE 'Page 2'
@ 50,50 LABEL Label_2 VALUE 'Questa è la pagina 2'
END PAGE
END TAB
END WINDOW
ACTIVATE WINDOW Win_1
Return
Maggiore Organizzazione (Controllo TOOLBAR)
Le TOOLBAR sono usate per raggruppare i pulsanti di comando (Buttons) in una barra posizionata (di solito) sotto la barra principale dei menu.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'Tutor 18: ToolBar Test'
;
MAIN ;
FONT 'Arial' SIZE 10
DEFINE MAIN MENU
POPUP '&File'
ITEM
'&Disattiva pulsante ToolBar' ACTION Win_1.Button_1.Enabled :=
.F.
ITEM '&Attiva pulsante ToolBar' ACTION
Win_1.Button_1.Enabled := .T.
ITEM '&Esci' ACTION
Win_1.Release
END POPUP
END MENU
DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 80,80 FLAT BORDER
BUTTON Button_1 ;
CAPTION
'Pulsante &1' ;
PICTURE 'button1.bmp' ;
ACTION
MsgInfo('Click! 1')
BUTTON Button_2 ;
CAPTION
'Pulsante &2' ;
PICTURE 'button2.bmp' ;
ACTION
MsgInfo('Click! 2') ;
SEPARATOR
BUTTON Button_3 ;
CAPTION
'Pulante &3' ;
PICTURE 'button3.bmp' ;
ACTION
MsgInfo('Click! 3')
END TOOLBAR
END WINDOW
CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1
Return Nil
Mostrare lo Status (Controllo Statusbar)
Questo controllo crea una status bar alla base della finestra, utilizzata per mostrare informazioni (solitamente informazioni di stato)
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 400 ;
HEIGHT 200 ;
TITLE 'Tutor 19 Tab Test'
;
MAIN
DEFINE MAIN MENU
POPUP '&StatusBar Test'
ITEM
'Definisci elemento 1 StatusBar' ACTION Form_1.StatusBar.Item(1) :=
"Nuovo valore 1"
ITEM 'Definisci elemento 2 StatusBar'
ACTION Form_1.StatusBar.Item(2) := "Nuovo valore 2"
END POPUP
END MENU
DEFINE STATUSBAR
STATUSITEM
"Item 1" ACTION MsgInfo('Click! 1')
STATUSITEM "Item
2" WIDTH 100 ACTION MsgInfo('Click! 2')
CLOCK
DATE
STATUSITEM "Item 5" WIDTH 100
END STATUSBAR
END WINDOW
ACTIVATE WINDOW Win_1
Return
Controlli per Dati I: BROWSE
I controlli per
dati sono progettati per gestire dati direttamente nei file .dbf .
Il
controllo BROWSE permette di visualizzare / modificare i record di un
database in forma tabulare.
La proprietà 'Value' può
essere utilizzata per fissare / recuperare un prestabilito numero di
record (recno()).
Per default, il controllo BROWSE non modifica il
puntatore ai record nella sua work area (*).
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE 'Tutor 20: BROWSE Test'
;
MAIN NOMAXIMIZE ;
ON INIT OpenTables() ;
ON RELEASE
CloseTables()
DEFINE MAIN MENU
POPUP 'File'
ITEM
'Set Browse Value' ACTION Win_1.Browse_1.Value := Val ( InputBox
('Set Browse Value','') )
ITEM 'Get Browse Value' ACTION MsgInfo (
Str ( Win_1.Browse_1.Value ) )
SEPARATOR
ITEM 'Exit' ACTION
Win_1.Release
END POPUP
POPUP 'Help'
ITEM 'About' ACTION MsgInfo ("Tutor 20: BROWSE Test")
END POPUP
END MENU
@ 10,10 BROWSE Browse_1 ;
WIDTH
610 ;
HEIGHT 390 ;
HEADERS { 'Code' , 'First Name' , 'Last
Name', 'Birth Date', 'Married' , 'Biography' } ;
WIDTHS { 150 ,
150 , 150 , 150 , 150 , 150 } ;
WORKAREA Test ;
FIELDS {
'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth'
, 'Test->Married' , 'Test->Bio' } ;
DELETE ;
LOCK ;
EDIT
INPLACE
END WINDOW
CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1
Return Nil
Procedure OpenTables()
Use Test
Win_1.Browse_1.Value := RecNo()
Return Nil
Procedure CloseTables()
Use
Return Nil
(*) Per cambiare questo comportamento (di default) è necessario cambiare l'impostazione 'browsesync' utilizzando il comando 'Set BrowseSync On'.
Controlli per Dati II: TEXTBOX, DATEPICKER, CHECKBOX, EDITBOX
La versione dati di questi controlli richede l'uso delle seguenti proprietà / metodi per collegarli ad un campo di database:
Proprietà
Field: Stabilisce il campo da collegare al controllo.
Metodo
Refresh: Aggiorna il contenuto del controllo basandosi sul
contenuto del campo corrente.
Metodo Save: Aggiorna il file
del database in accordo con il contenuto del controllo.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 640 ;
HEIGHT 480 ;
TITLE 'Tutor 21: Test
Collegamento Dati-Controlli' ;
MAIN ;
ON INIT OpenTables() ;
ON
RELEASE CloseTables()
DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 100,30 FLAT RIGHTTEXT BORDER
BUTTON TOP ;
CAPTION
'&Primo' ;
PICTURE 'primero.bmp' ;
ACTION ( DbGoTop() ,
Refresh() )
BUTTON PREVIOUS ;
CAPTION
'Pre&cedente';
PICTURE 'anterior.bmp' ;
ACTION ( DbSkip(-1)
, Refresh() )
BUTTON NEXT ;
CAPTION
'&Successivo';
PICTURE 'siguiente.bmp' ;
ACTION ( DbSkip(1)
, if ( eof() , DbGoBottom() , Nil ) , Refresh() )
BUTTON BOTTOM ;
CAPTION
'&Ultimo' ;
PICTURE 'ultimo.bmp' ;
ACTION ( DbGoBottom() ,
Refresh() )
BUTTON SAVE ;
CAPTION
'Sal&va' ;
PICTURE 'guardar.bmp' ;
ACTION ( Save() ,
Refresh() )
BUTTON UNDO ;
CAPTION
'&Annulla' ;
PICTURE 'deshacer.bmp' ;
ACTION ( Refresh() )
END TOOLBAR
@ 50,10 LABEL LABEL_1 VALUE 'Codice:'
@ 80,10 LABEL LABEL_2 VALUE 'Nome'
@ 110,10 LABEL LABEL_3 VALUE 'Cognome'
@ 140,10 LABEL LABEL_4 VALUE 'Nato/a il:'
@ 170,10 LABEL LABEL_5 VALUE 'Coniugato:'
@ 200,10 LABEL LABEL_6 VALUE 'Bio:'
@ 50,200 TEXTBOX TEXT_1;
FIELD
TEST->CODE ;
NUMERIC ;
MAXLENGTH 10
@ 80,200 TEXTBOX TEXT_2;
FIELD
TEST->FIRST ;
MAXLENGTH 30
@ 110,200 TEXTBOX TEXT_3;
FIELD
TEST->LAST ;
MAXLENGTH 30
@ 140,200 DATEPICKER DATE_4 ;
FIELD Test->Birth
@ 170,200 CHECKBOX CHECK_5 ;
CAPTION
'' ;
FIELD Test->Married
@ 200,200 EDITBOX EDIT_6 ;
FIELD
Test->Bio ;
HEIGHT 100
END WINDOW
Win_1.Text_1.SetFocus
ACTIVATE WINDOW Win_1
Return Nil
Procedure Refresh
Win_1.Text_1.Refresh
Win_1.Text_2.Refresh
Win_1.Text_3.Refresh
Win_1.Date_4.Refresh
Win_1.Check_5.Refresh
Win_1.Edit_6.Refresh
Win_1.Text_1.SetFocus
Return
Procedure Save
Win_1.Text_1.Save
Win_1.Text_2.Save
Win_1.Text_3.Save
Win_1.Date_4.Save
Win_1.Check_5.Save
Win_1.Edit_6.Save
Return
Procedure OpenTables
USE TEST
Return
Procedure CloseTables
USE
Return
Maggiore Organizzazione II (Controllo SPLITBOX)
I controlli definiti come parti di questo contenitore possono essere posizionati dall'utente , utilizzando una gripperbar colocata sul lato sinistro del controllo. E' necessario omettere '@ <row>,<col>' nella definizione del controllo.
#include "minigui.ch"
Function Main
DEFINE WINDOW Win_1 ;
AT
0,0 ;
WIDTH 640 HEIGHT 450 ;
TITLE 'Tutor 22: SplitBox Test'
;
MAIN
DEFINE SPLITBOX
LISTBOX List_1 ;
WIDTH
200 ;
HEIGHT 400 ;
ITEMS {'Elemento 1','Elemento 2','Elemento
3','Elemento 4','Elemento 5'} ;
VALUE 3 ;
TOOLTIP 'ListBox 1'
EDITBOX Edit_1 ;
WIDTH
200 ;
HEIGHT 400 ;
VALUE 'EditBox!!' ;
TOOLTIP 'EditBox'
;
MAXLENGTH 255
END SPLITBOX
END WINDOW
CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1
Return Nil