Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
1
 
 
 
 
 
“Microsoft Visual FoxPro ® 6.0 
Programmer’s Guide” 
© Microsoft Press 
 
Guida del Programmatore 
Traduzione in lingua italiana 
Cap 1 ÷ 6 
www.foxitaly.com 
 
 
La presente traduzione a cura del gruppo Foxitaly, ha il solo scopo di aiutare chi desidera avvicinarsi a questo potente 
ambiente di sviluppo ma conosce poco la lingua inglese. 
Hanno collaborato: 
Alessandro Bindi - Alessandro Panighi - Annibale Freda - Dario de Santis - Gian-Carlo Baldarelli - Mirco Lucchini 
 
Non si assume nessuna responsabilità per errori e omissioni 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
2
 
Capitolo 1: Introduzione alla programmazione 
Traduzione di Alessandro Bindi 
In Visual FoxPro, la programmazione di tipo procedurale e quella orientata agli oggetti sono 
integrate in maniera tale da permettere la realizzazione di applicazioni potenti e allo stesso 
momento flessibili. Concettualmente si pensa alla tecnica di programmazione come alla possibilità 
di scrivere una sequenza di istruzioni al fine di ottenere determinati risultati. A livello strutturale, 
programmare in VisualFoxPro comporta la manipolazione di informazioni memorizzate (in appositi 
contenitori N.D.T.) 
(…) 
Questo capitolo comprende: 
?? Vantaggi della programmazione 
?? I meccanismi della programmazione in VFP 
?? Concetti di base 
?? Il processo di programmazione 
?? Utilizzo di procedure e funzioni definite dall’utente 
?? Come procedere 
Vantaggi della programmazione 
Generalmente, avendo il tempo a disposizione, qualsiasi processo eseguito da un programma può 
essere replicato manualmente. Per esempio, ammettendo di voler trovare informazioni relative ad 
uno specifico cliente (ad esempio l’azienda “Ernst Handel “) all’interno di una tabella, è possibile 
procedere manualmente seguendo la specifica sequenza di istruzioni di seguito riportata. 
Ricercare manualmente una informazione all’interno di una tabella 
1. Dal menu File, selezionare Open. 
2. Dalla finestra Files of type (tipo di file), selezionare Table. 
3. Fare doppio click su Customer.dbf che appare nella lista dei files. 
4. Dal menu View, selezionare Browse. 
5. Sfogliare la tabella fino a trovare la voce “Ernst Handel.” nel campo Company 
Utilizzando la tecnica di programmazione, si può ottenere lo stesso risultato componendo 
all’interno della finestra dei comandi (Command window) le seguenti istruzioni: 
USE Customer 
LOCATE FOR Company = "Ernst Handel" 
BROWSE 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
3
Supponiamo che, dopo aver individuato il record relativo all’azienda cercata, si voglia 
incrementare, ad esempio, del 3% il valore del massimo importo per ordine. 
Incrementare manualmente il valore massimo importo per ordine 
1. Spostarsi con il tasto Tab sul campo the max_ord_amt. 
2. Moltiplicare il valore presente in max_ord_amt per 1.03 ed introdurre il nuovo risultato nel 
campo. 
Utilizzando la tecnica di programmazione, si può ottenere lo stesso risultato componendo 
all’interno della finestra dei comandi le seguenti istruzioni: 
REPLACE max_ord_amt WITH max_ord_amt * 1.03 
Come si vede è relativamente semplice modificare il massimo importo per ordine di un singolo 
cliente, sia utilizzando la procedura manuale, sia utilizzando la tecnica di programmazione. 
Supponiamo, però, di dover effettuare la stessa operazione su tutti i clienti. L’esecuzione manuale 
risulterebbe alquanto laboriosa e fioriera di errori. Scrivendo, invece, un file di programma con le 
giuste istruzioni, Visual FoxPro sarà in grado di eseguire tutta l’operazione in maniera semplice, 
veloce e senza errori. 
Esempio di programma per l’incremento del valore massimo importo per ordine su tutti i 
clienti. 
Code Comments 
USE customer Apre la tabella CUSTOMER. 
SCAN Si predispone a scorrere tutta la tabella eseguendo 
i comandi presenti tra le istruzioni SCAN ed 
ENDSCAN, per ogni record. 
REPLACE max_ord_amt WITH ; 
 max_ord_amt * 1.03 
Incrementa il valore del campo massimo importo 
per ordine di una quantità pari al 3%. (Il punto e 
virgola (;) a fine riga indica che il commando 
prosegue alla riga successiva.) 
ENDSCAN Fine del ciclo che scandisce I records della tabella. 
 
L’esecuzione di un programma comporta indubbi vantaggi rispetto alla esecuzione di singole 
istruzioni digitate all’interno della Finestra dei comandi ad esempio: 
?? I programmi possono essere modificati e rieseguiti a piacimento. 
?? Si può lanciare un programma dalla barra dei menu, da una maschera (form) o da una barra 
di strumenti (toolbar). 
?? Un programma può, a sua vo lta, lanciare l’esecuzione di un altro programma. 
Le sezioni seguenti spiegheranno in dettaglio i meccanismi, i concetti ed i processi rispetto a questo 
e ad altri programmi scritti in Visual FoxPro. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
4
Il meccanismo di programmazione di Visual FoxPro 
E’ possibile programmare in Visual FoxPro scrivendo codice, istruzioni sotto forma di comandi, 
funzioni, od operatori che VFP sia in grado di interpretare. Queste istruzioni possono essere inserite 
direttamente in: 
?? Finestra dei comandi (Command window). 
?? Files di programma. 
?? Nelle finestre relative al codice da associare agli Eventi (Event) o ai metodi (method) 
all’interno del Form Designer o del Class Designer. 
?? Nella finestra del Menu Designer. dedicata alla scrittura del codice. 
?? Nella finestra del Report Designer. dedicata alla scrittura del codice. 
Utilizzare la finestra dei comandi (Command Window) 
E’ possibile eseguire una istruzione di Visual FoxPro scrivendola all’interno della finestra dei 
comandi e premendo il tasto INVIO (ENTER). Per rieseguire un comando già dato è sufficiente 
spostarsi con il cursore sulla linea relativa e premere nuovamente il tasto INVIO (ENTER). 
E’ persino possibile eseguire dalla finestra dei comandi più di una linea di codice alla volta 
Eseguire più linee di codice all’interno della finestra dei comandi 
1. Selezionare le linee del codice che si intende eseguire. 
2. Premere INVIO (ENTER) o selezionare la voce Execute Selection dal menu dei comandi 
rapidi (shortcut menu). 
Poiché la finestra dei comandi è una finestra di scrittura (editing window), è possibile modificare le 
istruzioni digitate, utilizzando le utility di scrittura (editing tools) disponibili all’interno 
dell’ambiente di sviluppo. E’ possibile quindi modificare, inserire, cancellare, tagliare, copiare o 
spostare del testo digitato all’interno della finestra dei comandi. 
Il vantaggio principale che si ottiene dalla imputazione delle istruzioni all’interno della finestra dei 
comandi è che le istruzioni vengono eseguite immediatamente, senza la necessità di salvarle 
all’interno di un file di testo e di eseguirlo come programma. 
Inoltre tutte le istruzioni date per mezzo dei menu e delle finestre di dialogo (dialog boxes) vengono 
riportate in chiaro all’interno della finestra dei comandi come se le avessimo scritte per esteso. 
Naturalmente è possibile copiare queste istruzioni all’interno dei programmi di Visual FoxPro che, 
eseguiti ripetutamente, rendono semplice e veloce l’esecuzione di migliaia di istruzioni per 
moltissime volte. 
Creare i programmi 
Un programma di Visual FoxPro non è altro che un file di testo contenente una serie di istruzioni. 
E’ possibile creare un programma in Visual FoxPro utilizzando uno dei seguenti metodi: 
Per creare un programma 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
5
1. In Project Manager, selezionare la voce Programs presente all’interno della sottovoce 
(tab) Code . 
2. Scegliere New. 
-oppure-in fase di progettazione o in fase di esecuzione. 
Ad esempio, alcune proprietà che una casella di selezione può avere sono indicate nella seguente 
tabella: 
Proprietà Descrizione 
Caption Il testo descrittivo a fianco della casellina. 
Enabled Specifica se la casella può essere selezionata dall’utente. 
ForeColor Il colore del testo descrittivo. 
Left La posizione della parte sinistra della casella di selezione. 
MousePointer La forma del puntatore mouse quando passa sopra la casella. 
Top La posizione della parte alta della casella. 
Visible Indica se la casella deve essere visibile. 
 
Gli Oggetti hanno eventi e metodi associati 
Ogni oggetto riconosce e reagisce a determinate azioni che si definiscono eventi. Un evento è una 
attività specifica e predeterminata, iniziata dall’utente o dal sistema. Gli eventi, nella maggior parte 
dei casi, sono generati dall’iterazione dell’utente. Ad esempio, con il telefono, un evento viene 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
37
innescato quando l’utente solleva la cornetta, o quando preme i tasti per comporre il numero di 
telefono. 
In VFP, le azioni che l’utente provoca sono il movimento del mouse, il click del mouse, la pressione 
dei tasti della tastiera. L’inizializzazione di un oggetto, l’incontro di una linea di codice che causa 
un errore, sono esempi di eventi di sistema. 
I metodi sono procedure associate con un oggetto. I metodi sono differenti dalle normali procedure 
di VFP, i metodi sono inestricabilmente confinati con un oggetto e vengono invocati in modo 
differente da come si richiamano le normali procedure. 
Gli eventi possono avere metodi con loro associati. Ad esempio, se scrivete il codice per il metodo 
di gestione dell’evento click, questo codice viene eseguito quando avviene l’evento click. I metodi 
possono tuttavia esistere indipendentemente da qualsiasi evento. Questi metodi devono essere 
richiamati in modo specifico attraverso il codice. 
L’elenco degli eventi, anche se vasto, è fisso. Voi non potete creare nuovi eventi, L’elenco dei 
metodi invece può essere estesa in modo infinito. 
La seguente tabella elenca alcuni eventi associati con la solita casella di controllo (check box): 
Evento Descrizione 
Click L’utente clicca nella casella. 
GotFocus L’utente seleziona la casella con un click o con il tasto TAB. 
LostFocus L’utente Seleziona una casella differente. 
 
La tabella seguente elenca I metodi associati con la medesima casella di controllo: 
Method Description 
Refresh Il valore della casella di controllo viene aggiornato per evidenziare 
qualsiasi cambiamento che possa essere accaduto alla sotto struttura del 
codice sorgente. 
SetFocus Il fuoco viene impostato sulla casella sebbene l’utente abbia premuto il 
TAB mentre la casella era selezionata. 
 
Nel capitolo 4 viene discusso il modello degli eventi e l’ordine in cui gli eventi accadono. 
Capire le classi in Visual FoxPro 
Tutte le proprietà, gli eventi ed I metodi di un oggetto sono specificate nella definizione della 
classe. In aggiunta, le classi hanno le seguenti caratteristiche che le rendono specialmente utili per il 
riutilizzo e la manutenzione: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
38
?? Incapsulamento 
?? Sottoclasse 
?? Eredità 
 
Nascondere la complessità non necessaria 
Quando inserite un telefono nel vostro ufficio, probabilmente non vi preoccupate del come faccia il 
telefono internamente a ricevere una chiamata, inizia e termina una connessione con la centrale di 
commutazione, o traduce la pressione di un tasto in un segnale elettrico. Quello che dove 
semplicemente sapere è che dovete sollevare la cornetta, comporre il numero e parlare con la 
persona con cui volete parlare, La complessità per raggiungere lo scopo è nascosta. Il beneficio di 
poter nascondere i dettagli interni di un oggetto in modo da concentrasi solo sull’oggetto viene 
definita Astrazione. 
La complessità interna può essere nascosta 
 
L’incapsulamento, che coinvolge: metodo di impacchettare e codice delle proprietà in un oggetto, 
contribuisce all’astrazione. Ad esempio, la proprietà che determina le voci di una casella di 
selezione (List Box) e il codice che viene eseguito quando selezionale una voce della lista, possono 
essere incapsulate insieme in un singolo controllo che aggiungete ad una maschera (form). 
Utilizzare la potenza delle classi esistenti 
Una sottoclasse può avere tutta la funzionalità di una classe esistente, più qualsiasi controllo o 
funzionalità aggiuntiva che le vogliate aggiungere. Se la vostra classe è un semplice telefono, voi 
potete creare una sottoclasse del telefono che possiede tutte le funzionalità di base del telefono 
stesso, con in aggiunta tutte quelle che vorrete aggiungere voi. 
La creazione di sottoclassi consente il riutilizzo del codice 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
39
 
La creazione di sottoclassi è un modo di ridurre la quantità di codice da scrivere. Iniziate con la 
definizione dell’oggetto che sia vicino a quello che desiderate e poi personalizzatelo. 
Migliorare la manutenzione del codice 
Attraverso l’eredità, se voi modificate una classe, la modifica si trasmetterà su tutte le sottoclassi di 
quella classe. Questo aggiornamento automatico consente di risparmiare tempo e fatica. Ad 
esempio, se il produttore dell’apparecchio telefonico, modifica l’apparecchio dal selettore a disco 
alla tastiera, risparmierà molto tempo se potrà apportare la modica in base allo schema di 
costruzione principale in modo che tutti i telefoni prodotti, basati su questo schema, possano 
ricevere automaticamente la modifica, senza dover intervenire su ogni telefono per ricevere la 
nuova tastiera. 
L’eredità rende semplice la manutenzione del codice. 
 
L’eredità non si applica all’Hardware, ma si può utilizzare nel software. Se scoprite un errore in una 
classe, invece di dover correggere l’errore in tutte le sottoclassi, basterà correggerlo nella classe e il 
modifica si ripercuoterà su tutte le sottoclassi di quella classe. 
La gerarchia di classi di Visual FoxPro 
Quando create delle classi definite, è importante conoscere la gerarchia adottata in VFP 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
40
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
41
 
La gerarchia delle classi in VFP 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
42
Contenitore e Non contenitore 
Le due principali di classi in VFP, e, per estensione, degli oggetti, sono le classi contenitore e le 
classi dei controlli 
Classi contenitore e Classi controlli 
 
Classi Contenitore 
I contenitori possono contenere altri oggetti e consentire l’accesso agli oggetti contenuti. Ad 
esempio, se create una classe contenitore che consiste in due menu a tendina (list Box) e due tasti di 
comando ( command button) e quindi aggiungete un oggetto basato su questa classe ad una 
maschera (form), ogni singolo oggetto può essere manipolato sia in fase di progettazione che in fase 
di esecuzione. Potete facilmente modificare la posizione dei menu a tendina o dei titoli dei tasti di 
comando. Potete anche aggiungere oggetti al controllo in fase di progettazione, ad esempio potete 
aggiungere etichette che identificano i menù a tendina. 
La seguente tabella elenca cosa può contenere ogni classe contenitore.: 
Container Can contain 
Gruppo tasti di comando Tasti di comando (Command buttons) 
Contenitore (Container) Qualsiasi controllo 
Controllo (Control) Qualsiasi controllo 
(personalizzato) Custom Qualsiasi controllo, cornice, contenitore, personalizzati 
Form sets Maschere(Forms), Barre strumenti (toolbars) 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
43
Forms Cornici, qualsiasi controllo, contenitori, og.personalizzati 
Colonne (Grid columns) Titoli Intestazioni e qualsiasi oggetto eccetto gruppi di 
maschere, maschere, barre strumenti, contatori, e altre 
colonne. 
Griglie (Grids) Colonne (Grid columns) 
Gruppi tasti opzioni (Option button 
groups) 
Tasti opzioni (Option buttons) 
Cornici (Page frames) Pagine 
Pagine Qualsiasi controllo, contenitore, og. Personalizzato 
Progetto Files, servers 
Barre strumenti (Toolbars) Qualsiasi controllo, cornici, contenitore 
 
Classi Controllo 
Le classi controllo sono più incapsulate delle classi contenitore, ma possono risultare meno flessibili 
per questa ragione. Le classi controllo non dispongono del metodo AddObject 
Adattare le classi ai compiti 
Il vostro obiettivo è quello di essere in grado di utilizzare le classi in molti e svariati contesti. Una 
pianificazione intelligente vi consentirà di decidere in modo preciso quale classe progettare e quale 
funzionalità includere nella classe. 
Decidere quando creare le classi 
Potreste creare classi per ogni controllo e per ogni maschera che intendiate utilizzare, ma questo 
non è il metodo migliore per progettare una applicazione. Finireste per avere classi che fanno 
pressappoco la medesima cosa ma che devono essere mantenute separatamente. 
Incapsulare le funzionalità generiche 
Potete creare controlli per le funzionalità generiche. Ad esempio, tasti di comando che consentano 
all’utente di spostare il puntatore di una tabella, un tasto per la chiusura di una maschera, uno per 
l’help , possono essere tutti salvato in una classe e aggiunti alle maschere ogni volta che vorrete 
disporre di queste funzionalità. 
Potete esporre le proprietà ed I metodi di una classe in modo che l’utente possa integrarle 
nell’ambiente dati di una maschera o di un gruppo di maschere. 
Fornire un valido e gradevole aspetto all’applicazione 
Potete creare gruppi di maschere, maschere e classi di controllo con un aspetto comune in modo che 
tutta l’applicazione abbia il medesimo aspetto. Per esempio potreste aggiungere grafica e colori ad 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
44
una classe maschera e utilizzarla come cornice di base per tutte le maschere che creerete. Potreste 
creare una classe casella di testo con un preciso aspetto, come un effetto ombra, e quindi utilizzarla 
come una classe in tutta l’applicazione ogni colta che dovrete aggiungere una casella di testo. 
Decidere che tipo di classe creare 
VFP vi consente di creare diversi tipi di classe, ognuna con le sue proprie caratteristiche. Potete 
specificare il tipo di classe che intendete creare nella finestra di dialogo NewClass oppure con la 
clausola AS del comando CREATE CLASS nella finestra di comando. 
Le classi di base di VFP 
Potete creare sottoclassi della maggior parte delle classi di VFP attraverso il Class Designer. 
Le classi di base di Visual FoxPro 
ActiveDoc Custom Label PageFrame 
CheckBox EditBox Line ProjectHook 
Column* Form ListBox Separator 
CommandButton FormSet OLEBoundControl Shape 
CommandGroup Grid OLEContainerControl Spinner 
ComboBox Header* OptionButton* TextBox 
Container Hyperlink Object OptionGroup Timer 
Control Image Page* ToolBar 
 
* Queste classi sono una parte integrante di un contenitore genitore e quindi non si possono creare 
sottoclassi nel Class Designer. 
Tutte le classi di base di VFP riconoscono di base tutti i seguenti eventi: 
Evento Descrizione 
Init Avviene quando un oggetto è creato. 
Destroy Avviene quando un oggetto viene scaricato dalla memoria. 
Error Avviene ogni volta che accade un errore in un evento o metodo della 
classe. 
 
All Visual FoxPro base classes have the following minimum set of properties: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
45
Proprietà Descrizione 
Class Che tipo di classe è. 
BaseClass Da quale classe di base è derivata, come ad es. Una maschera, un modulo, 
un tasto di comando, un oggetto personale ecc. 
ClassLibrary In quale libreria è salvato. 
ParentClass La classe genitrice dalla quale è stato derivato. Se la classe è derivata da 
una classe di base VFP, la proprietà di ParentClass è la medesima di 
BaseClass. 
 
Estendere le classi di base di VFP 
Potete creare delle sottoclassi di queste classi in modo da impostare le vostre proprietà di controllo 
di base. Ad esempio, se volete che il nome di un controllo che aggiungete ad una maschera rifletta 
automaticamente la vostra convenzione dei nomi, potete creare delle classi basate su quelle di base 
di VFP allo scopo. Potete creare classi con un particolare aspetto o comportamento che servano da 
stampo per tutte le maschere che creerete. 
Potete anche creare delle sottoclassi di quelle di base per creare dei controlli con delle funzionalità 
incapsulate. Se volete che un click su un tasto chiuda una maschera , potete creare una classe basata 
sulla classe command button di VFP, impostare la proprietà captino su Quit e includere il seguente 
comando associato all’evento click 
THISFORM.Release 
Potete quindi aggiungere questo tasto a qualsiasi maschera della vostra applicazione. 
Tasto personalizzato aggiunto ad una maschera. 
 
Creare controlli con componenti multipli 
Le vostre sottoclassi non sono limitate ad una singola classe di base. Potette aggiungere controlli 
multipli ad una singola definizione di classe. Molti delle classi di VFP della libreria di esempi 
ricadono in questa categoria. Ad esempio la classe VCR nel Buttons.vcx che si trova nella cartella 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
46
Visual Studio …\Samples\Vfp98\Classes, contenente 4 tasti di comando per la navigazione fra i 
record di una tabella. 
Creare classi non visuali 
Una classe basata sulla classe custom di VFP non ha elementi visuali di funzionamento. Potete 
creare metodi e proprietà per la vostra classe utilizzando l’ambiente Class Designer. Ad esempio, 
potreste creare una classe personale chiamata StrMethods e includere un numero di metodi per 
manipolare le stringhe di carattere. 
THISFORM.txtCount.Value = ; 
 THISFORM.StrMethods.WordCount(THISFORM.edtText.Value) 
Le classi non visuali ( come ad esempio controlli, timer ) hanno una rappresentazione visuale 
solamente in fase di progettazione nel FormDesigner. Impostate la proprietà picture (immagine) 
della classe personale con il file .bmp che volete mostrato nel FormDesigner quando la classe viene 
aggiunta ad una maschera. 
Creare delle classi 
Potete creare delle nuovi classi nel ClassDesigner e potete vedere come ogni singolo oggetto 
apparirà all’utente mentre lo progettate. 
Per creare una nuova classe 
?? Nel Project Manager, selezionate la linguetta Classes e cliccate su New. 
-or- 
?? Dal menu File, scegliete New, selezionate Class, e scegliete New File. 
-or- 
?? Utilizzate il comando CREATE CLASS nella finestra di comando. 
La finestra di dialogo New Class vi consentirà di specificare come chiamare la nuova classe, su 
quale classe di base si basa e in quale libreria salvarla. 
Creare una nuova classe 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
47
Cambiare la definizione di una classe 
Appena avete creato una classe, potete modificarla. Le modifiche apportate ad una classe hanno 
effetto su tutte le sottoclassi e tutti gli oggetti basati su quella classe. Potete aggiungere 
miglioramenti alla classe o correggere un errore, tutte le sottoclassi e gli oggetti basati erediteranno 
le modifiche. 
Per modificare una classe nel Project Manager 
1. Selezionate una classe che volete modificare.2. scegliete Modify. 
Si aprirà il Class Designer . 
Potete modificare la definizione di una classe visuale attraverso il commando MODIFY CLASS. 
Importante. Non cambiate la proprietà nome della classe se la classe è già stata utilizzata in altri 
componenti di applicazioni . Altrimenti VFP non sarà in grado di localizzare la classe quando 
necessario. 
Creare una sottoclasse della definizione 
Potete creare una sottoclasse di una classe personale (user defined) in uno o due modi.. 
Per creare una sottoclasse di una classe user-defined 
1. Nella finestra di dialogo New Class, cliccate il tasto alla destra della casella di Based On. 
2. Nella finestra Open che si è aperta, scegliete la classe su cui volete basarvi. 
-oppure- 
?? Utilizzate il commando CREATE CLASS . 
Ad esempio, per creare una nuova classe x basata sulla classe genitrice (parentclass) nella 
Mylibrary.vcx, utilizzate il seguente codice: 
CREATE CLASS x OF y AS parentclass ; 
 FROM mylibrary 
Utilizzare il Class Designer 
Quando specificate la classe su cui si basa la vostra nuova classe e la libreria dove salvare la classe, 
si apre il Class Designer. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
48
Class Designer 
 
Il Class Designer mostra la stessa interfaccia del Form Designer. Consentendovi di visualizzare e 
editare le proprietà della vostra classe nella finestra Properties. La finestra per l’editing vi consente 
di scrivere codice da eseguire quando vengono richiamati metodi o accadono eventi. 
Aggiungere Oggetti alla classe Control o Container 
Se basate la nuova classe sulla classe controlli o contenitori, potete aggiungere controlli nello stesso 
modo in cui aggiungete controlli al Form Designer: selezionate il tasto di controllo dalla barra 
strumenti Form Controls e trascinatelo nella dimensione voluta nel Class Designer. 
Non importa che tipo su quale tipo di classe vi state basando, potete impostare proprietà e scrive re 
metodi. Potete anche creare nuove proprietà e metodi per la classe. 
Aggiungere Proprietà e metodi alla classe 
Potete aggiungere tutte le proprietà e metodi che volete alla nuova classe. Le proprietà conterranno i 
valori; i metodi conterranno il codice procedurale che verrà eseguito quando verrà invocato il 
metodo. 
Creare nuove proprietà e metodi 
Quando create nuove proprietà e metodi per una classe, le proprietà ed I metodi sono estesi a tutta la 
classe e non solo ad un singolo componete. 
Per aggiungere una nuova proprietà ad una classe 
1. Dal menu Class, scegliete New Property. 
2. Nella finestra di dialogo New Property, scrivete il nome della nuova proprietà. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
49
3. Indicate la visibilità: Public, Protected, or Hidden. (pubblica protetta nascosta) 
Una proprietà pubblica può essere disponibile ovunque nell’applicazione. Le proprietà e i 
metodi protetti o nascosti vengono discussi nella parte Proteggere e Nascondere membri 
di una classe. 
La finestra di dialogo New Property 
 
4. Cliccare su Add. 
Potete anche aggiungere una descrizione della proprietà che sarà mostrata nella parte basse 
della finestra delle proprietà nel Class Designer e nel Form Designer quando il controllo 
viene aggiunto alla maschera. 
Problematiche – Quando aggiungete una proprietà ad una classe che può essere impostata 
dall’utente della classe, l’utente potrebbe inserire un valore non valido e quindi provocare un errore 
di esecuzione. Dovete specificare i valori validi per la proprietà. Se la proprietà può essere 
impostata a 0, 1, o 2, ad esempio, specificatelo nella casella Descrizione della finestra di dialogo 
New Property. Dovreste anche verificare il valore attraverso il codice che si riferisce a quella 
proprietà. 
Per creare un array ( insieme, matrice ) di dati proprietà 
?? Nella casella Name della finestra di dialogo New Property, specificate il nome, la grandezza 
e la dimensione della matrice. 
Ad esempio, per creare una proprietà di nome Myarray con 10 colonne e dieci righe scrivete 
quanto segue nella casella Name. 
myarray[10,2] 
La proprietà matrice e solo in lettura in fase di progettazione e viene mostrata nella finestra di 
dialogo delle Properties in corsivo. La proprietà matrice può essere gestita e ridimensionata in fase 
di esecuzione. Un esempio si trova nel capitolo 9 “Gestione di istanze multiple in una maschera.” 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
50
Per aggiunger un nuovo metodo ad una classe 
Dal menu Class. Scegliete New Method. 
1. Nella finestra di dialogo New Method, scrivete il nome del metodo. 
2. Specificate la visibilità: Public, Protected, or Hidden. 
3. Selezionate la casella di selezione Access per specificare un metodo di accesso, selezionate 
la casella Assign per creare una metodo di assegnazione. 
 
I metodi Access e Assign vi consentono di eseguire del codice quando il viene richiesto il valore 
della proprietà o quando tentate di modificare il valore della proprietà. 
Il codice di un metodo access viene eseguito quando si interroga il valore della proprietà, di solito 
quando si riferisce alle proprietà di un oggetto, immagazzinando il valore della proprietà in una 
variabile, oppure stampando il valore della proprietà con il punto interrogativo. 
Il codice in un metodo Assign viene eseguito quando tentate di modificare il valore di una proprietà, 
si solito utilizzando il commando STORE per assegnare un nuovo valore alla proprietà. 
Potete anche aggiungere una descrizione del metodo. 
Proteggere e Nascondere I membri di una classe 
Le proprietà ed i metodi in una classe sono Public per definizione: il codice in altre classi e 
procedure possono impostare o richiamare i metodi. Le proprietà ed i metodi che voi impostate 
come Protected possono essere acceduti solo da altri metodi della definizione di classe o nelle 
sottoclassi della classe stessa. Proprietà e metodi di classi definite Hidden possono essere accedute 
solo da altri membri della definizione di classe, sottoclassi della classe non possono vedere o 
riferirsi a membri nascosti. 
Per assicurare il corretto funzionamento in alcune classi, avete bisogno di prevenire il fatto che 
l’utente possa modificare le proprietà o richiamare metodi dall’esterno della classe. 
Il seguente esempio mostra come proteggere le proprietà ed I metodi di una classe.. 
La classe orologio inclusa nel Samples.vcx, nella cartella Visual Studio …\Samples\Vfp98\Classes, 
include un timer e 5 Labels per mostrare il tempo trascorso. 
La classe stopwatch del Samples.vcx 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
51
 
La classe Stopwatch contiene etichette e un timer. 
L’impostazione delle proprietà della classe Stopwatch 
Controllo Proprietà Impostazione 
lblSeconds Caption 00 
lblColon1 Caption : 
lblMinutes Caption 00 
lblColon2 Caption : 
lblHours Caption 00 
tmrSWatch Interval 1000 
 
Questa classe possiede anche tre proprietà nascoste, nSec, nMin, nHour e un metodo nascosto 
UpdateDisplay. 
Tip Cliccate su Class Info del menu Class per visualizzare la visibilità di tutte le proprietà e 
metodi di una classe. 
Le proprietà protette vengono utilizzate per calcoli interni nel metodo UpdateDisplay e l’evento 
Timer. Il metodo UpdateDisplay imposta i titoli delle etichette sul valore del tempo trascorso. 
Il metodo UpdateDisplay 
Code Comments 
cSecDisplay = ALLTRIM(STR(THIS.nSec)) 
cMinDisplay = ALLTRIM(STR(THIS.nMin)) 
cHourDisplay = ALLTRIM(STR(THIS.nHour)) 
Converte le proprietà numeriche nel tipo 
carattere per la visualizzazione nei titoli 
delle etichette. 
THIS.lblSeconds.Caption = ; 
 IIF(THIS.nSectitolo delle etichette, 
mantenendo il valore zero se il tempo è 
inferiore a 10. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
52
 "0", "") + cMinDisplay 
THIS.lblHours.Caption = ; 
 IIF(THIS.nHourrosso. Se modificate la proprietà 
BackColor della classe a verde, l’oggetto nella maschera dell’utente avrà ancora il colore di fondo 
rosso. Se d’altra parte, l’utente non cambia la proprietà del colore di fondo dell’oggetto e voi avete 
cambiato il colore della classe a verde, la proprietà dell’oggetto sulla maschera erediterà la modifica 
e sarà verde. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
56
Chiamare il metodo della classe genitore 
Un oggetto o classe basato su un’altra classe automaticamente eredita la funzionalità dell’originale. 
Tuttavia, potete facilmente ignorare il metodo ereditato. Ad esempio, potete scrivere nuovo codice 
per ‘evento Click di una classe dopo averla creata come sottoclasse oppure dopo che avete aggiunto 
un oggetto basato sulla classe ad un contenitore. In entrambi i casi, il nuovo codice viene eseguito 
in fase di esecuzione, il codice originale non viene eseguito. 
Molto più spesso, tuttavia, vorrete aggiungere funzionalità alla nuova classe o oggetto piuttosto che 
mantenere quelle originali. In effetti, una delle decisioni chiave che dovete fare nella 
programmazione ad oggetti è quale funzionalità aggiungere a livello di classe, a livello di 
sottoclasse, e, a livello di oggetto. Potete ottimizzare la progettazione delle classi utilizzando la 
funzione DODEFAULT() oppure attraverso l’operatore per la portata di risoluzione (::) per 
aggiungere codice a differenti livelli nella classe o nella gerarchia dei contenitori 
Aggiungere funzionalità alla sottoclasse 
Potete richiamare il codice della classe genitrice da una sottoclasse utilizzando la funzione 
DODEFAULT(). 
Ad esempio, cmdOK è una classe di tasti di commando della libreria Button.vcx, localizzata nella 
cartella …\Samples\Vfp98\Classes del Visual Studio. Il codice associato con l’evento click di 
cmdOk rilascia la maschera in cui si trova il tasto. CmdCancel è una sottoclasse di cmdOk della 
stessa libreria di classe. Per aggiungere funzionalità a cmdCancel per rifiutare le modifiche, ad 
esempio, potete aggiungere il seguente codice all’evento click: 
IF USED( ) AND CURSORGETPROP("Buffering") != 1 
 TABLEREVERT(.T.) 
ENDIF 
DODEFAULT( ) 
Poiché le modifiche sono aggiunte comunemente alla tabella in memoria, quando la tabella viene 
chiusa, non avete bisogno di aggiungere la funzione TABLEUPDATE() a cmdOk. Il codice 
aggiuntivo in cmdCancel annulla le modifiche prima di chiamare il codice cmdOk, classe genitrice, 
per scaricare la maschera. 
Classi e Gerarchie di contenitori 
La gerarchie di classi e I contenitori sono due entità separate. VFP cerca il codice deglil eventi per 
tutta la gerarchia delle classi, per gli oggetti invece cerca nella gerarchia dei contenitori. La 
seguente sezione tratta la gerarchia dei container. Più avanti viene spiegata la gerarchia di classi 
nella sezione Chiamare il codice evento nella gerarchia di classi. 
Riferirsi ad oggetti nella gerarchia dei container 
To manipulate an object, you need to identify it in relation to the container hierarchy. For example, 
to manipulate a control on a form in a form set, you need to reference the form set, the form, and 
then the control. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
57
Per manipolare un oggetto, avete bisogno di identificarlo nella relazione alla gerarchia dei 
container. Ad esempio per manipolare un controllo di una maschera di una serie di maschera, 
dovete prima riferirvi alla serie delle maschere, poi alla maschera, e quindi al controllo. 
You can compare the referencing of an object within its container hierarchy to giving Visual 
FoxPro an address to your object. When you describe the location of a house to someone outside 
your immediate frame of reference, you need to indicate the country, the state or region, the city, 
the street, or just the street number of the house, depending on how far they are from you. 
Otherwise, there could be some confusion 
Potete confrontare il relazione ad un oggetto all’interno della sua gerarchia di contenitori per fornire 
a VFP un indirizzo al vostro oggetto. Quando decidete di descrivere la posizione di una casa a 
qualche persona al di fuori della vostra cerchia di conoscenza, avete bisogno di indicare la nazione, 
la regione oppure solo la strada ed il numero civico della casa, dipendentemente da quanto lontano 
la persona è lontana da voi 
La seguente illustrazione mostra un possibile contenitore di situazioni annidate. 
Contenitore annidato 
 
Per disattivare il controllo nella colonna di una griglia, dovete fornire il seguente indirizzo: 
Formset.Form.PageFrame.Page.; 
 Grid.Column.Control.Enabled = .F. 
La proprietà ActiveForm dell’oggetto dell’applicazione (_VFP) consente di manipolare la maschera 
attiva ance se non conoscete il suo nome. Ad esempio, la seguente linea di codice cmodifica il 
colore di sfondo della maschera attiva, non importa a quale serie appartiene: 
_VFP.ActiveForm.BackColor = RGB(255,255,255) 
In modo simile, la proprietà ActiveControl vi consente di manipolare il controllo attivo nella 
mascera attiva. Ad esempio, la seguente espressione inserita nella finestra di controllo (Wath 
window) mostra il nome del controllo sulla maschera nel momento in cui voi iterativamente 
scegliete alcuni controlli: 
_VFP.ActiveForm.ActiveControl.Name 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
58
Relative Referencing 
Quando fate riferimento a oggetti all’interno della gerarchia dei contenitori (ad esempio, nell’evento 
click del tasto di comando su una maschera appartenente ad una serie), potete utilizzare alcune 
scorciatoie per identificare l’oggetto che volete manipolare. La seguente tabella elenca le proprietà 
o chiavi che semplificano la relazione ad un oggetto all’interno della gerarchia di oggetti: 
Proprietà o Chiavi Riferimento 
Parent Fa riferimento all'oggetto contenitore di un controllo 
THIS Fornisce un riferimento ad un oggetto prima che venga 
creato 
THISFORM Fornisce un riferimento ad un oggetto maschera (Form) 
prima che venga creato 
THISFORMSET Fornisce un riferimento ad un oggetto FormSet prima che 
venga creato 
 
Note Potete utilizzare THIS, THISFORM, e THISFORMSET solo in codice metodo o evento 
La seguente tabella fornisce una esempio di utilizzo di THISFORMSET, THISFORM, THIS, e 
Parent per impostare le proprietà di un oggetto: 
Command Dove includere il commando 
THISFORMSET.frm1.cmd1.Caption = "OK" Nel codice dell’evento o metodo di 
qualsiasi controllo in qualsiasi maschera 
di una serie. 
THISFORM.cmd1.Caption = "OK" Nel codice dell’evento o metodo di 
qualsiasi controllo nella stessa maschera 
dove si trovi cmd1. 
THIS.Caption = "OK" Nel codice dell’evento o metodo del 
controllo di cui volete modificare il 
titolo. 
THIS.Parent.BackColor = RGB(192,0,0) Nel codice dell’evento o metodo di un 
controllo in una maschera. Il comando 
cambia il colore da scuro a rosso.. 
 
Impostare le proprietà 
Potete impostare le proprietà sia in fase di esecuzione che in fase di progettazione 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
59
Per impostare una proprietà 
?? Utilizzare questa sintassi: 
Container.Object.Property = Value 
Ad esempio, la seguente dichiarazione imposta varie proprietà di una casella ti testo di nome 
txtDate in una maschera di nome frmPhoneLog: 
frmPhoneLog.txtDate.Value = DATE( ) && Mostra la data corrente 
frmPhoneLog.txtDate.Enabled = .T. && Il controllo viene attivato 
frmPhoneLog.txtDate.ForeColor = RGB(0,0,0) && Testo in nero 
frmPhoneLog.txtDate.BackColor = RGB(192,192,192) && Sfondo grigio 
Per l’impostazione delle proprietà nell’esempio precedente, frmPhoneLog è l’oggetto contenitore al 
più alto livello. Se frmPhoneLog fosse contenuto in una serie di maschere,avreste anche dovuto 
includere la serie nel percorso genitore 
frsContacts.frmPhoneLog.txtDate.Value = DATE( ) 
Impostare proprietà multiple 
Con la struttura WITH ... ENDWITH si semplifica l’impostazione delle proprietà multiple. Ad 
esempio, per impostare le proprietà multiple delle colonne di una griglia di una maschera di una 
serie, potete utilizzare la seguente sintassi: 
WITH THISFORMSET.frmForm1.grdGrid1.grcColumn1 
 .Width = 5 
 .Resizable = .F. 
 .ForeColor = RGB(0,0,0) 
 .BackColor = RGB(255,255,255) 
 .SelectOnEntry = .T. 
ENDWITH 
Chiamare metodi 
Una volta che sia creato l’oggetto, potete chiamare I metodi di quell’oggetto da qualsiasi punto 
della vostra applicazione. 
Per chiamare un metodo 
?? Utilizzate questa sintassi: 
Parent.Object.Method 
La seguente dichiarazione chiama I metodi per mostrare una maschera e impostare il la partenza 
(focus) in una casella di testo.: 
frsFormSet.frmForm1.Show 
frsFormSet.frmForm1.txtGetText1.SetFocus 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
60
I metodi che restituiscono valori sono utilizzati in espressioni, devono terminare con le doppie 
parentesi (). Ad esempio, la seguente dichiarazione imposta il titolo di una maschera al valore che 
viene restituito dal metodo definito dall’utente GetNewCaption: 
Form1.Caption = Form1.GetNewCaption( ) 
Note I parametric passati ad un metodo devono essere racchiusi fra parentesi dopo il nome del 
metodo; ad esempio, Form1.Show(nStyle). Passa nStyle al metodo mostra di Form1. 
Rispondere agli eventi 
Il codice che includete in una procedura gestione eventi viene eseguito quando accade un evento. 
Ad esempio, il codice che includete nel codice per gestire l’evento click di una tasto di commando 
viene eseguito quando l’utente clicca sul tasto. 
Un evento può essere provocato artificialmente anche attraverso la programmazione: Click, 
DblClick, MouseMovi e DragDrop attraverso il comando mouse, oppure utilizzare il comando 
ERROR per generare un evento errore e il comando KEYBOARD per generare l’evento KeyPress. 
Non potete creare altri eventi tramite la programmazione, ma potete richiamare la procedura 
associata con l’evento. Ad esempio la seguente istruzione esegue il codice di attivazione 
dell’oggetto frmPhoneLog, ma non attiva la maschera: 
frmPhoneLog.Activate 
Se volete attivare la maschera, utilizzate il metodo Show della maschera. Richiamare il metodo 
show provoca la visualizzazione e attivazione della maschera nel punto in cui l’evento Activate 
viene eseguito. 
frmPhoneLog.Show 
Definire le classi attraverso la programmazione 
Potete definire delle classi visualmente attraverso il ClassDesigner e il FormDesigner o attraverso la 
programmazione in file .prg . Questa sezione descrive come scrivere definizioni di classi. Per 
informazioni sui comandi, funzioni, operatori specifici utilizzate l’help 
In a program file, you can have program code prior to the class definitions, but not after the class 
definitions, in the same way that program code cannot come after procedures in a program. The 
basic shell for class creation has this syntax: 
In un file programma, potete avere il codice del programma prima della definizione della classe, ma 
non dopo, allo stesso modo in cui non potete avere il codice programma dopo le procedure. 
L’impostazione di base per la creazione di una classe ha la seguente sintassi: 
DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC] 
[[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...] 
[Object.]PropertyName = eExpression ...] 
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT] 
[WITH cPropertylist]]... 
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS | _ASSIGN] 
[NODEFAULT] 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
61
cStatements 
[ENDFUNC | ENDPROC]]... 
ENDDEFINE 
Proteggere e nascondere I membri di una classe 
Potete proteggere o nascondere proprietà e metodi in una definizione di classe con le chiavi 
PROTECTED e HIDDEN del commando DEFINE CLASS 
Ad esempio, se create una classe per mantenere le informazioni degli impiegati, e non volete che 
l’utente possa modificare il giorno di paga, potete proteggere la proprietà HireDate.(GiornoDiPaga). 
Se l’utente necessita quando è stato pagato un dipendente, potete includere un metodo che 
restituisca il giorno di paga 
DEFINE CLASS employee AS CUSTOM 
PROTECTED HireDate 
 First_Name = "" 
 Last_Name = "" 
 Address = "" 
 HireDate = { - - } 
 
PROCEDURE GetHireDate 
 RETURN This.HireDate 
ENDPROC 
ENDDEFINE 
Creare oggetti da una classe 
Quando avete salvato una classe visuale, potete creare un oggetto basato su quella classe attraverso 
la funzione CREATEOBJECT( ) . Il seguente esempio mostra come eseguire una maschera salvata 
come definizione di una classe nella libreria Forms.vcx: 
Creare e visualizzare un oggetto maschera la cui classe è stata progettata nel Form Designer 
Codice Commento 
SET CLASSLIB TO Forms ADDITIVE Imposta la libreria sul file .vcx in cui la 
definizione di maschera è stata salvata. La chiave 
ADDITIVE previene questo comando dal chiudere 
qualsiasi libreria che risulti aperta. 
frmTest = CREATEOBJECT("TestForm") Il codice assume che il nome della classe della 
maschera salvata nella libreria sia TestForm. 
frmTest.Show Mostra la maschera 
 
Aggiungere un oggetto ad una classe contenitore 
Potete utilizzare la clausola ADD OBJECT del comando DEFINE CLASS oppure il metodo 
AddObject per aggiungere un oggetto al contenitore. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
62
Ad esempio, la seguente definizione di classe si basa su una maschera. Il comando ADD OBJECT 
aggiunge due tasti di comando alla maschera: 
DEFINE CLASS myform AS FORM 
 ADD OBJECT cmdOK AS COMMANDBUTTON 
 ADD OBJECT PROTECTED cmdCancel AS COMMANDBUTTON 
ENDDEFINE 
Utilizzate il metodo AddObject per aggiungere oggetti al contenitore dopo che questo è stato creato. 
Ad esempio il seguente codice crea una maschera e aggiunge due tasti di comando: 
frmMessage = CREATEOBJECT("FORM") 
frmMessage.AddObject("txt1", "TEXTBOX") 
frmMessage.AddObject("txt2", "TEXTBOX") 
Potete anche utilizzare il metodo AddObject nel codice metodo di una classe. Ad esempio, la 
seguente definizione di classe utilizza AddObject nel codice associato all’evento Init per aggiungere 
un controllo alle colonne di una griglia. 
DEFINE CLASS mygrid AS GRID 
ColumnCount = 3 
PROCEDURE Init 
 THIS.Column2.AddObject("cboClient", "COMBOBOX") 
 THIS.Column2.CurrentControl = "cboClient" 
ENDPROC 
ENDDEFINE 
Aggiungere e creare classi nel codice metodo 
Potete aggiungere oggetti ad un contenitore attraverso la programmazione con il metodo 
AddObject. Potete anche creare oggetto con la funzione CREATEOBJECT() nei metodi Load, Init 
o qualsiasi altro metodo della classe. 
Quando aggiungete un oggetto mediante il metodo AddObject, l’oggetto diventa un metodo del 
contenitore. La proprietà Parent dell’oggetto aggiunto si riferisce al contenitore. Quando un oggetto 
basato sul contenitore o sulla classe controllo viene scaricato dalla memoria, viene scaricato anche 
l’oggetto aggiunto. 
Quando create un oggetto con la funzione CREATEOBJECT(), l’oggetto è esteso ad una proprietà 
della classe o a una variabile della classe metodo che chiama questa funzione 
Attribuire metodi e codice eventi 
In aggiunta alla scrittura di codice per I metodi e gli eventi di un codice, potete estendere la serie di 
metodi alle sottoclassi di quelle di base di VFP. Ecco alcune regole per scrivere codice eventi e 
metodi: 
?? La serie di eventi della classi base di VFP non può essere estesa. 
?? Ogni classe riconosce una serie di eventi fissi di base, fra cui si include i metodi Init, Destry 
e Error. 
?? Quando create un metodo nella definizione di classe con lo stesso nome dell’evento che la 
classepuò riconoscere, il codice del metodo viene eseguito quando accade l’evento. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
63
?? Potete aggiungere metodi alle vostre classi attraverso la creazione di procedure e funzioni 
all’interno della definizione di classe. 
?? Potete creare metodi Access e Assign per le vostre classi attraverso procedure o funzioni con 
lo stesso nome della proprietà della classe com _ACCESS e _ASSIGN aggiunte al nome 
della procedura o della funzione. 
Richiamare il codice gestione eventi attraverso la gerarchia di classe 
Quando create una sottoclasse, la classe eredita automaticamente tutte le proprietà, metodi ed eventi 
della classe genitore. Se il codice è scritto per un evento della classe genitore, quel codice viene 
eseguito quando accade un evento in relazione ad un oggetto nella sottoclasse. Voi potete tuttavia 
ignorare il codice della classe genitore scrivendo codice per quel evento nella sottoclasse. 
Per chiamare in modo specifico un codice di evento in una classe genitore anche quando una 
sottoclasse possiede il codice per lo stesso evento, utilizzate la funzione DODEFAULT(). 
Per esempio, potreste avere una classe che si chiama cmdBottom che si basa sulla classe di base dei 
tasti di commando che ha il seguente codice per gestire l’evento click: 
GO BOTTOM 
THISFORM.Refresh 
Quando aggiungete un oggetto basato su questa classe in una maschera, chiamata, ad esempio, 
cmdBottom1, potreste decidere che volete anche mostrare un messaggio per l’utente in modo che 
lui o lei sappia che il puntatore dei record di una tabella si trova alla fine. Potete aggiungere il 
seguente codice all’evento click dell’oggetto per mostrare il messaggio: 
WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1 
Quando lanciate la maschera, tuttavia, il messaggio viene mostrato, la il puntatore del record non si 
muove perché il codice per la gestione dell’evento click della classe madre non viene eseguito. Per 
assicurarsi che venga eseguito anche il codice della classe madre, includete le seguenti linee di 
codice per l’evento click dell’oggetto: 
DODEFAULT( ) 
WAIT WINDOW "At the Bottom of the Table" TIMEOUT 1 
Note Potete utilizzare la funzione ACLASS() per determinare tutte le classi appartenenti ad una 
gerarchia. 
Impedire l’esecuzione del codice di una classe di base 
Alcune volte potreste voler evitare il comportamento delle classi di base sia eseguito in un evento o 
metodo. Potete ottenerlo includendo la chiave NODEFAULT nel codice del metodo. Ad esempio, il 
seguente programma utilizza la chiave NODEFAULT nell’evento KeyPress di una casella di testo 
per impedire che il carattere premuto sia mostrato nella casella. 
frmKeyExample = CREATEOBJECT("test") 
frmKeyExample.Show 
READ EVENTS 
DEFINE CLASS test AS FORM 
 ADD OBJECT text1 AS TEXTBOX 
 PROCEDURE text1.KeyPress 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
64
 PARAMETERS nKeyCode, nShiftAltCtrl 
 NODEFAULT 
 IF BETWEEN(nKeyCode, 65, 122) && between 'A' and 'z' 
 This.Value = ALLTRIM(This.Value) + "*" 
 ACTIVATE SCREEN && invia il risultato nella finestra principale di windows 
 ?? CHR(nKeyCode) 
 ENDIF 
 ENDPROC 
 PROCEDURE Destroy 
 CLEAR EVENTS 
 ENDPROC 
ENDDEFINE 
Creare una serie di tasti di navigazione per una tabella 
Una caratteristica di molte applicazioni è la tipica serie di tasti che consente di navigare all’interno 
di una tabella. Questa di solito include dei tasti per muovere il puntatore dei record al record 
successivo o a quello precedente, così come al primo record o all’ultimo. 
Tasti di navigazione 
 
Progettare I tasti di navigazione 
Ogni tasto avrà delle caratteristiche e funzionalità comuni, così è una buona idea creare una classe 
di tasti. Quindi ogni tasto potrà essere derivato da questa classe. La classe genitrice è la NavButton 
definita più avanti. 
Una volta definite la classe genitrice, le sottoclassi seguenti definiscono la funzionalità e aspetto 
specifico per ogni tasto di ogni tasto di navigazione: navTop, navPrior, navNext, navBottom. 
Infine, la classe contenitore, vcr, viene creata e ogni tasto di navigazione 
viene aggiunto al contenitore. Il contenitore viene aggiunto alla maschera o 
alla barra strumenti per fornire le funzioni di navigazione alla tabella. 
Definizione della classe NAVBUTTON 
Per creare Navbutton, salvate in un file programma Navclass.prg le seguenti sei definizioni di 
classi (Navbutton, navTop, navBottom, navPrior, navNext, and vcr) 
Definizione della classe generica di tasti di navigazioni 
Code Comments 
DEFINE CLASS Navbutton AS 
COMMANDBUTTON 
 
 Height = 25 
 Width = 25 
 TableAlias = "" 
 
Definisce la classe genitrice dei tasti di 
navigazione 
 
Fornisce alla classe alcune dimensioni. 
Include una proprietà personale, TableAlias, per 
memorizzare l’alias in cui navigare. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
65
PROCEDURE Click 
 IF NOT EMPTY(This.TableAlias) 
 SELECT (This.TableAlias) 
 ENDIF 
ENDPROC 
Se è stato impostato TableAlias , la procedura 
della classe genitrice seleziona l’alias prima che I 
codice di navigazione nella sottoclasse venga 
eseguito. Altrimenti, assume che l’utente voglia 
navigare nella tabella nell’area di lavoro 
attualmente selezionata. 
PROCEDURE RefreshForm 
 _SCREEN.ActiveForm.Refresh 
ENDPROC 
Utililzzando _SCREEN.ActiveForm.Refresh al 
posto di THISFORM.Refresh vi consente di 
aggiungere la classe ad una maschera o ad una 
barra degli strumenti avendo la stessa funzionalità. 
ENDDEFINE Termina la definizione della classe. 
 
Tutti I tasti di navigazione sono basati sulla classe Navbutton. Il seguente codice definisce il tasto 
principale della serie. I restanti tre tasti sono definiti nella seguente tabella. Le quattro classi sono 
simili, quindi solo la prima a tutti i commenti. 
Definizione del tasto principale della classe di tasti di navigazione 
Code Comments 
DEFINE CLASS navTop AS Navbutton 
 Caption = "|principale all'interno di un metodo della 
sottoclasse. 
Definizione delle altre classi di tasti di navigazione 
Codice Commento 
DEFINE CLASS navNext AS Navbutton 
 Caption = ">" 
Definisce la classe del tasto Next (successivo) e 
imposta la proprietà didascalia. 
PROCEDURE Click 
 DODEFAULT( ) 
 SKIP 1 
 IF EOF( ) 
 GO BOTTOM 
 ENDIF 
 THIS.RefreshForm 
ENDPROC 
ENDDEFINE 
 
 
 
Include il codice per impostare il puntatore al 
record successivo nella tabella. 
 
 
 
Termina la definizione della classe. 
DEFINE CLASS navPrior AS Navbutton 
 Caption = "|" 
Definisce la classe del tasto Bottom (ultimo) ed 
imposta la proprietà didascalia. 
PROCEDURE Click 
 DODEFAULT( ) 
 GO BOTTOM 
 THIS.RefreshForm 
 
 
Include il codice per impostare il puntatore 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
67
ENDPROC 
ENDDEFINE 
all’ultimo record della tabella. 
 
Termina la definizione della classe. 
 
La seguente definizione di classe contiene tutti I Quattro tasti di navigazione in modo da essere 
aggiunti come un tutt’uno in una maschera 
Definizione di una classe di controlli di navigazione di una tabella 
Code Comments 
DEFINE CLASS vcr AS CONTAINER 
 Height = 25 
 Width = 100 
 Left = 3 
 Top = 3 
Inizia la definizione della classe. La 
proprietà altezza è impostata alla stessa 
altezza del tasto di comando che 
conterrà. 
 ADD OBJECT cmdTop AS navTop ; 
 WITH Left = 0 
 ADD OBJECT cmdPrior AS navPrior ; 
 WITH Left = 25 
 ADD OBJECT cmdNext AS navNext ; 
 WITH Left = 50 
 ADD OBJECT cmdBot AS navBottom ; 
 WITH Left = 75 
Aggiunge I tasti di navigazione. 
PROCEDURE SetTable(cTableAlias) 
 IF TYPE("cTableAlias") = 'C' 
 THIS.cmdTop.TableAlias = ; 
 cTableAlias 
 THIS.cmdPrior.TableAlias = ; 
 cTableAlias 
 THIS.cmdNext.TableAlias = ; 
 cTableAlias 
 THIS.cmdBot.TableAlias = ; 
 cTableAlias 
 ENDIF 
ENDPROC 
Questo metodo viene utilizzato per 
impostare la proprietà TableAlias del 
tasto. TableAlias è definito nella classe 
genitrice Navbutton. 
 
Potete anche utilizzare il metodo SetAll 
per impostare le proprietà: 
IF TYPE ("cTableAlias") = 'C' 
This.SetAll("TableAlias", 
"cTableAlias") 
ENDIF 
Tuttavia, causerà un errore se un oggetto 
che venga aggiunto alla classe non 
possiede la proprietà TableAlias. 
ENDDEFINE Termina la definizione della classe. 
 
Una volta definite la classe, potete creare delle sottoclassi o aggiungerle ad una maschera. 
Creare una sottoclasse basati sulla nuova classe 
Potete anche creare sottoclassi basate sulla classe vcr con dei tasti in più ad esempio Search, Edit, 
Save, and Quit. Ad esempio la, vcr2 include il tasto Quit: 
Tasti di navigazione con un tasto per chiudere la maschera 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
68
 
Definizione di una sottoclasse di controlli di navigazione 
Codice Commento 
DEFINE CLASS vcr2 AS vcr 
ADD OBJECT cmdQuit AS 
COMMANDBUTTON WITH ; 
 Caption = "Quit",; 
 Height = 25, ; 
 Width = 50 
Width = THIS.Width + 
THIS.cmdQuit.Width 
cmdQuit.Left = THIS.Width - ; 
 THIS.cmdQuit.Width 
 
Definisce una classe basata sulla vcr e aggiunge un 
tasto di commando. 
PROCEDURE cmdQuit.CLICK 
 RELEASE THISFORM 
ENDPROC 
 
Quando l’utente clicca sul tasto, cmdQuit, chiude 
la maschera. 
ENDDEFINE Termina la definizione di classe. 
 
Vcr2 possiede ogni cosa che appartiene a vcr, con in più il nuovo tasto di commando, e voi non 
dovrete riscrivere nessuna istruzione del codice esistente. 
Le modifiche a vcr si riflettono anche nella sottoclasse 
Grazie all’ereditarietà. Le modifiche sulla classe genitrice si riflettono in tutte le sottoclassi della 
classe. Ad esempio, potete far sapere all’utente che è stato raggiunto la fine della tabella sostituendo 
il codice IF EOF( ) nella navNext.Click con il seguente: 
IF EOF( ) 
 GO BOTTOM 
 SET MESSAGE TO "Fine della tabella" 
ELSE 
 SET MESSAGE TO 
ENDIF 
Potete far sapere all’utente che ha raggiunto la cima della tabella modificando il codice IF BOF ( ) 
in navPrior.Click con il seguente: 
IF BOF() 
 GO TOP 
 SET MESSAGE TO "Inizio della tabella" 
ELSE 
 SET MESSAGE TO 
ENDIF 
Se la modifica viene eseguita su navNext e navPrior, verranno applicate automaticamente ai tasti 
appropriati in vcr e vcr2. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
69
Aggiungere VCR ad una classe maschera 
Una volta definito vcr come controllo, il controllo può essere aggiunto in una definizione di 
contenitore. Ad esempio, il seguente codice aggiunge a Navclass.prg definisce una maschera con i 
l’aggiunta dei tasti di navigazione: 
DEFINE CLASS NavForm AS Form 
 ADD OBJECT oVCR AS vcr 
ENDDEFINE 
Avvio della maschera che contiene il VCR 
Una volta definita la sottoclasse maschera, potete mostrarla facilmente con I comandi appropriati. 
Per mostrare una maschera 
1. caricare la definizione della classe: 
2. SET PROCEDURE TO navclass ADDITIVE 
3. Creare un oggetto basato sulla classe navform: 
4. frmTest = CREATEOBJECT("navform") 
5. invoca il metodo Show della maschera: 
frmTest.Show 
Se non richiamate il metodo SetTable del oVCR ( l’oggetto vcr del NavForm) quando l’utente 
clicca i tasti di navigazione. Il puntatore dei record si sposata nella tabella nell’area di lavoro 
corrente. Potete richiamare l’evento SetTable per specificare a quale tabella fare riferimento. 
frmTest.oVCR.SetTable("customer") 
Note Quando l’utente chiude la maschera, frmTEst viene impostato a valore nullo .NULL. Per 
scaricare la variabile oggetto dalla memoria, utilizzate il comando RELEASE. Variabili oggetto 
create in un programma vengono scaricate dalla memoria quando il programma è completato. 
Definizione di un controllo griglia 
Una griglia contiene colonne, che a turno possono contenere intestazioni e qualsiasi altro controllo. 
Il controllo di base contenuto in una colonna è la casella di testo, così come la funzionalità di base 
di una griglia è una finestra di scorrimento. Tuttavia, l’architettura sottostante della griglia offre una 
estendibilità senza fine. 
Controlli griglia con una casella di controllo in una colonna 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
70
 
Definizione di una classe griglia con una casella di controllo in una colonna della griglia 
Code Comments 
DEFINE CLASS grdProducts AS Grid 
 Left = 24 
 Top = 10 
 Width = 295 
 Height = 210 
 Visible = .T. 
 RowHeight = 28 
 ColumnCount = 2 
Inizia la definizione e imposta le proprietà 
che determinano l’aspetto della griglia. 
 
Quando definite la proprietà ColumnCount a 
2, aggiungete due colonne alla griglia. Ogni 
colonna contiene una intestazione non il 
nome Header1.In aggiunta, ogni colonna ha 
un gruppo indipendente di proprietà che 
determinano l’aspetto ed il comportamento. 
Column1.ControlSource ="prod_name" 
Column2.ControlSource ="discontinu" 
Quando impostate il ControlSource di una 
colonna, la colonna mostra il valore di quel 
campo per tutti I record della tabella. 
Discontinu è un campo logico. 
Column2.Sparse = .F. Column2 conterrà la casella di controllo. 
Impostate la proprietà Sparse della colonna a 
.F. in modo che la casella sia visibile in utte 
le righe, non solo nella cella selezionata. 
Procedure Init 
 THIS.Column1.Width = 175 
 THIS.Column2.Width = 68THIS.Column1.Header1.Caption = ; 
 "Product Name" 
 THIS.Column2.Header1.Caption = ; 
 "Discontinued" 
 
 THIS.Column2.AddObject("chk1", ; 
 "checkbox") 
 THIS.Column2.CurrentControl = ; 
 "chk1" 
 THIS.Column2.chk1.Visible = .T. 
 THIS.Column2.chk1.Caption = "" 
Imposta la larghezza della colonna e 
l’intestazione. 
 
 
 
 
 
 
 
Il metodo AddObject vi consente di 
aggiungere un oggetto ad un container. In 
questo caso, una casella di controllo di nome 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
71
ENDPROC questo caso, una casella di controllo di nome 
chk1. 
Imposta il CurrentControl della colonna alla 
casella di controllo in modo che questa venga 
mostrata. 
Assicura che la casella di controllo sia 
visibile. 
Imposta la didascalia ad una stringa vuota in 
modo che quella di default chk1 non venga 
mostrata. 
ENDDEFINE Fine della definizione della classe. 
 
The following class definition is the form that contains the grid. Both class definitions can be 
included in the same program file. 
La seguente definizione di classe è la maschera che contiene la griglia. Entrambi le definizioni 
possono essere incluse nello stesso file. 
Definizione di una classe maschera che contiene la classe griglia 
Codice Commento 
DEFINE CLASS GridForm AS FORM 
 Width = 330 
 Height = 250 
 Caption = "Grid Example" 
 ADD OBJECT grid1 AS grdProducts 
Create una classe form e aggiunge un 
oggetto, basato sulla classe griglia.. 
PROCEDURE Destroy 
 CLEAR EVENTS 
ENDPROC 
 
ENDDEFINE 
Il programma che crea l’oggetto basato su 
questa classe userà READ EVENTS. 
Includendo CLEAR EVENTS nell’evento 
Destroy della maschera consente al 
programma di terminare quando l’utente 
chiude la maschera. . 
Fine della definizione di classe. 
 
Il seguente programma apre la tabella con I campi da mostrare nelle colonne, crea un oggetto basato 
sulla classe GridForm, e esegue il comando READ EVENT: 
CLOSE DATABASE 
OPEN DATABASE (HOME(2) + "data\testdata.dbc") 
USE products 
frmTest= CREATEOBJECT("GridForm") 
frmTest.Show 
READ EVENTS 
Questo programma può essere incluso nello stesso file con la definizione della classe se si trova 
all’inizio del file. Potete anche utilizzare il comando di SET PROCEDURE TO per specificare il 
programma con la definizione di classe e includere questo codice in un programma separato. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
72
Creare una riferimento ad un oggetto 
Al posto di fare una copia di un oggetto, potete creare un riferimento (collegamento) all’oggetto. Un 
riferimento occupa meno memoria che l’eventuale oggetto aggiunto, può essere passato fra diverse 
procedure. 
Restituire una relazione ad un oggetto 
Alcune volte, potreste voler manipolare un oggetto attraverso uno o più riferimenti a quell’oggetto. 
Ad esempio, il seguente programma definisce una classe, crea un oggetto basato su questa classe e 
restituisce una relazione all’oggetto. 
*--NEWINV.PRG 
*--Returns a reference to a new invoice form. 
frmInv = CREATEOBJECT("InvoiceForm") 
RETURN frmInv 
 
DEFINE CLASS InvoiceForm AS FORM 
 ADD OBJECT txtCompany AS TEXTBOX 
 * code to set properties, add other objects, and so on 
ENDDEFINE 
IL seguente programma stabilisce una relazione con l’oggetto creato nel programma Newinv.prg. 
La variabile di relazione può essere manipolata nell’esatto modo in cui lo può essere una variabile 
oggetto. 
frmInvoice = NewInv() && store the object reference to a variable 
frmInvoice.SHOW 
Potete anche creare riferimenti ad oggetto in una maschera, come nel seguente esempio: 
txtCustName = frmInvoice.txtCompany 
txtCustName.Value = "Fox User" 
Tip Una volta creato un oggetto, potete utilizzare il commando DISPLAY OBJECT per mostrare la 
gerarchia di classe, le impostazioni delle proprietà, gli oggetti contenuti, i metodi ed eventi 
disponibili. Potete riempire una matrice con le proprietà ( non le impostazioni ), eventi, metodi e gli 
oggetti contenuti in un oggetto con la funzione AMEMBERS(). 
Scaricare oggetti e riferimenti dalla memoria 
Se esiste un riferimento ad un oggetto, il rilascio dell’oggetto non lo scarica dalla memoria. Per 
esempio, il seguente comando scarica frmInvoice: l’oggetto originale: 
RELEASE frmInvoice 
Tuttavia poiché i riferimenti ad un oggetto appartenenete a frmInvoice esistono ancora, l’oggetto 
non è scaricato dalla memoria fino a che txtCustName non viene rilasciato con il seguente comando 
RELEASE txtCustName 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
73
Verifica dell’esistenza di un oggetto 
Potete utilizzare le funzioni TYPE() ISNULL() VARTYPE() per determinare l’esistenza di un 
oggetto. Ad esempio, le seguenti linee di codice verificano l’esistenza dell’oggetto oConnection: 
IF TYPE("oConnection") = "O" AND NOT ISNULL(oConnection) 
 * Object exists 
ELSE 
 * Object does not exist 
ENDIF 
Note ISNULL( ) è necessario perché .NULL. è salvata nella variabile dell’oggetto maschera 
quando un utente chiude la maschera, ma il tipo di variabile resta “O” 
Creare una matrice di membri 
Potete definire I membri di una classe in una matrice. Il seguente esempio, le scelte sono una 
matrice di controlli:: 
DEFINE CLASS MoverListBox AS CONTAINER 
DIMENSION choices[3] 
ADD OBJECT lstFromListBox AS LISTBOX 
ADD OBJECT lstToListBox AS LISTBOX 
ADD OBJECT choices[1] AS COMMANDBUTTON 
ADD OBJECT choices[2] AS COMMANDBUTTON 
ADD OBJECT choices[3] AS CHECKBOX 
PROCEDURE choices.CLICK 
 PARAMETER nIndex 
 DO CASE 
 CASE nIndex = 1 
 * code 
 CASE nIndex = 2 
 * code 
 CASE nIndex = 3 
 * code 
 ENDCASE 
ENDPROC 
ENDDEFINE 
Quando l’utente clicca un controllo di una matrice di controlli, VFP passa l’indice del controllo 
all’evento click. In questa procedura, potete utilizzare una dichiarazione CASE per eseguire codice 
diverso in base al tasto che è stato ciccato. 
Creare una matrice di oggetti 
Potete creare anche una matrice di oggetti, ad esempio MyArray possiede 5 tasti di comando: 
DIMENSION MyArray[5] 
FOR x = 1 TO 5 
 MyArray[x] = CREATEOBJECT("COMMANDBUTTON") 
ENDFOR 
Ci sono alcune considerazioni da ricordare con le matrici di oggetti: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
74
?? Potete assegnare un oggetto ad una intera matrice con un commando. Dovete assegnare 
l’oggetto ad ogni elemento della matrice individualmente. 
?? Non potete assegnare un valore alla proprietà dell’intera matrice. IL seguente commando 
riporterebbe un errore: 
MyArray.Enabled = .F. 
?? Quando ridimensionate una matrice di oggetti in modo che sia più grande 
della matrice originale, i nuovi elementi sono inizioalizzati a .F. come 
nel caso di tutte le matrici in VFP. Quando ridimensionate un oggetto 
della matrice in modo che sia più piccolo dell’originale, l’oggetto con un 
subscrip più grande del più grande viene rilasciato. 
Utilizzare un oggetto per memorizzare dati 
Nel linguaggio orientato agli oggetti, una classe offer un utile e conveniente veicolo per 
memorizzare dati e procedure relaziomnati ad una identità. Ad esempio, potete definire una classe 
customer per memorizzare i dati di un customer così come il metodo per calcolare l’età di un 
customer. 
DEFINE CLASS customer AS CUSTOM 
 LastName = "" 
 FirstName = "" 
 Birthday = { - - } 
 PROCEDURE Age 
 IF !EMPTY(THIS.Birthday) 
 RETURN YEAR(DATE()) - YEAR(THIS.Birthday) 
 ELSE 
 RETURN 0 
 ENDIF 
 ENDPROC 
ENDDEFINE 
Tuttavia, I dati memorizzati in un oggetto basato sulla classe customer sono memorizzati solo nella 
memoria. Se questi dati erano in una tabella, la tabella sarà memorizzata sul disco. Se avevate più di 
un cliente su cui memorizzare i dati, la tabellala tabella vi darà l’accesso a tutti i comandi di 
gestione dei database forniti da VFP. Così potrete facilmente localizzare le informazioni, 
organizzarle, raggrupparle, ed eseguire calcoli su di essi, creare stampe e interrogazioni ecc. 
Salvare e manipolare dato in un database o in una tabella è quello che fa meglio VFP. CI sono delle 
volte tuttavia, quando vorrete memorizzare dati in un oggetto, di solito, quando i dati sono 
significativi solamente quando i la vostra applicazione è in funzione si riferiscono ad una singola 
entità. 
Ad esempio, in una applicazione che include sistemi di sicurezza, avrete di solito una tabella di 
utenti che hanno accesso all’applicazione. LA tabella includerà identificazioni dell’utente, 
password, e livelli di accesso. Quando l’utente è entrato, non avrete bisogno di tutte le informazioni 
della tabella. Tutto quello che vi servirà, sono le informazioni dell’utente corrente, e queste 
informazioni possono essere facilmente memorizzate in un oggetto manipolato. La seguente 
definizione di classe, attiva un accesso (logon) quando un oggetto basato su quella classe viene 
creato: 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
75
DEFINE CLASS NewUser AS CUSTOM 
 PROTECTED LogonTime, AccessLevel 
 UserId = "" 
 PassWord = "" 
 LogonTime = { - - : : } 
 AccessLevel = 0 
 PROCEDURE Init 
 DO FORM LOGON WITH ; && assuming you have created this form 
 This.UserId, ; 
 This.PassWord, ; 
 This.AccessLevel 
 This.LogonTime = DATETIME( ) 
 ENDPROC 
* Create methods to return protected property values. 
 PROCEDURE GetLogonTime 
 RETURN This.LogonTime 
 ENDPROC 
 PROCEDURE GetAccessLevel 
 RETURN This.AccessLevel 
 ENDPROC 
 
ENDDEFINE 
Nel programma principale della vostra applicazione, potrete creare un oggetto basato su 
NewUserclass: 
oUser = CREATEOBJECT('NewUser') 
oUser.Logon 
In tutte le parti della vostra applicazione, quando avrete bisogno delle informazioni circa l’utente, le 
poterete avere dall’oggetto oUsert. Ad esempio: 
IF oUser.GetAccessLevel( ) >= 4 
 DO ADMIN.MPR 
ENDIF 
Integrare oggetti e dati 
Nella maggior parte delle applicazioni, potete utilizzare la potenza di VFP integrando oggetti e dati. 
La maggior parte delle classi VFP hanno proprietà e metodi che vi consentono di integrare la 
potenza di gestione database relazionale e sistema orientato agli oggetti. 
Proprietà di integrare le classi VFP e i dati di un database 
Classi Proprietà dati 
Grid RecordSource, ChildOrder, LinkMaster 
Tutti gli altri controlli ControlSource 
List box and combo box ControlSource, RowSource 
Form e form set DataSession 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
76
 
RecordSource - Specifica l'origine dati a cui è associato il controllo Grid. 
ChildOrder - Specifica il tag indice per l'origine record del controllo Grid o dell'oggetto Relation 
LinkMaster - Specifica la tabella principale collegata alla tabella secondaria visualizzata in un 
controllo Grid. 
ControlSource - Specifica l'origine dati a cui è associato un oggetto. 
RowSource - Specifica l'origine dei valori in un controllo ComboBox o ListBox. 
DataSession - Restituisce l'ID della sessione dati che identifica la sessione dati privata dell'oggetto 
FormSet, Form o ToolBar. 
 
Se la proprietà DataSession dell'oggetto Form, FormSet o ToolBar è impostata a 1 (Sessione dati 
predefinita), restituisce l'ID della sessione dati predefinita. 
Poiché queste proprietà possono essere modificate in fase di progettazione o in fase di esecuzione, 
potete creare controlli generici con funzionalità incapsulate che operano su dati diversi. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
77
Capitolo 4: Capire il modello a eventi 
 
Traduzione di Dario de Santis 
Visual FoxPro fornisce un vero sistema non modale, in modo che possiate facilmente coordinare 
maschere multiple automaticamente ed eseguire simultaneamente istanze multiple di una maschera. 
Visual FoxPro gestisce per voi anche l’elaborazione degli eventi, così potrete dare ai vostri utenti un 
ambiente iterativo molto piu’ ricco. 
Questo capitolo descrive: 
 
?? Gli eventi in Visual FoxPro 
?? Individuazione della sequenza di eventi 
?? Assegnazione del codice agli eventi 
Gli eventi in Visual FoxPro 
Il codice associato all’evento e’ automaticamente eseguito dal sistema in risposta a qualche azione 
dell’utente. Per esempio, il codice scritto per l’evento Click e’ eseguito automaticamente dal 
sistema quando l’utente clicca su di un cont rollo. Il codice dell’evento puo’ anche essere attivato 
dagli eventi del sistema, come nel caso dell’evento Timer in un controllo di tipo Timer. 
Gli eventi fondamentali 
La seguente tabella contiene una lista del gruppo base di eventi del Visual FoxPro, che valgono per 
la maggior parte dei controlli. 
Gruppo base di eventi 
 
Evento Quando si attiva l’evento 
Init L’oggetto viene creato. 
Destroy L’oggetto e’ rilasciato dalla memoria. 
Click L’utente clicca l’oggetto usando il tasto primario del mouse. 
DblClick L’utente fa doppio clic sull’oggetto usando il tasto primario del 
mouse. 
RightClick L’utente clicca l’oggetto usando il tasto secondario del mouse. 
 
GotFocus 
L’oggetto riceve il focus, o a causa dell’azione dell’utente che 
avanza con il Tab o clicca con il mouse, oppure cambiando il focus 
da programma con il il metodo SetFocus.. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
78
LostFocus 
 
L’oggetto perde il focus, o a causa dell’azione dell’utente che 
avanza con il Tab o fa clic con il mouse su un altro oggetto, oppure 
cambiando il focus da programma con il metodo SetFocus. 
KeyPress L’utente preme e rilascia un tasto. 
 
MouseDown 
L’utente preme il tasto del mouse mentre il cursore del mouse e’ 
sopra l’oggetto. 
MouseMove L’utente muove il mouse sopra l’oggetto. 
MouseUp L’utente rilascia il tasto del mouse mentre il cursore del mouse si 
muove sopra l’oggetto. 
 
Eventi di contenitori e di oggetti 
Ci sono due regole fondamentali da tenere presente quando si scrive del codice evento per i 
controlli: 
?? I contenitori non elaborano eventi associati ai controlli che essi contengono. 
?? Se nessun codice evento e’ associato al controllo, Visual FoxPro verifica se esiste del codice 
associato all’evento del controllo che lo precede nella gerarchia delle classi. 
Quando l’utente interagisce con un oggetto in un qualsiasi modo – passando su di esso con il Tab, 
cliccandoci sopra e cosi’ via – hanno luogo gli eventi dell’oggetto. Ogni oggetto riceve i suoi eventi 
indipendentemente. Ad esempio, anche se un CommandButton e’ su di un form, l’evento Click del 
form non viene intercettato quando l’utente clicca sul CommandButton; viene intercettato 
solamente l’evento Click del CommandButton. 
Il codice evento del contenitore e’ separato dal codice evento del controllo 
 
 
Se non vi e’ alcun codice evento associato al CommandButton non accade nulla quando l’utente 
clicca sul pulsante, anche se c’e’ del codice associato all’evento Click del form. 
Questa regola e’ altrettanto vera per i controlli griglia. La griglia contiene colonne che a loro volta 
contengono headers e controlli. Quando avvengono gli eventi soltanto l’oggetto piu’ interno 
implicato nell’evento riconosce l’evento stesso. I contenitori a livello piu’ alto non riconoscono 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
79
l’evento. La seguente illustrazione mostra quali oggetti gestiscono gli eventi MouseMove che 
vengono generati quando l’utente muove il cursore del mouse attraverso la griglia. 
Gli eventi MouseMove in una griglia 
 
 
Esiste tuttavia un’eccezione a questa1. Dal menu File, selezionare la voce New. 
2. All’interno della finestra di dialogo, selezionare Program. 
3. Scegliere New File. 
-oppure- 
?? All’interno della finestra dei comandi scrivere: 
?? MODIFY COMMAND 
Visual FoxPro aprirà una nuova finestra di scrittura chiamata Program1, all’interno della quale sarà 
possibile scrivere il nuovo programma. 
Il salvataggio di un programma 
Una volta scritto un programma, bisogna essere sicuri di salvarlo. 
Per salvare un programma 
?? Dal menu File, scegliere Save. 
Nel caso si cerchi di chiudere una finestra contenente un programma non salvato, apparirà 
puntualmente una piccola finestra di dialogo che chiederà di salvare o scartare le modifiche 
effettuate. 
Un programma creato utilizzando Project Manager verrà salvato e, automaticamente, aggiunto al 
progetto in corso. 
Nel caso in cui si cerchi di salvare un programma al quale non è stato assegnato un nome, verrà 
automaticamente aperta una finestra di dialogo del tipo “Salva con nome” in maniera da poterne 
specificare il nome. Una volta salvato il programma, sarà possibile eseguirlo o modificarlo 
successivamente. 
Eseguire modifiche ad un programma 
Come detto, una volta salvato, sarà possibile apportare modifiche al programma procedendo come 
di seguito: 
Aprire il programma 
?? Nel caso in cui il programma sia contenuto all’interno di un progetto, occorrerà selezionarlo 
all’interno del Project Manager e scegliere l’opzione Modify. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
6
-oppure- 
?? Dal menù File, selezionare Open, apparirà all’interno di una finestra di dialogo l’elenco dei 
files disponibili. Scegliendo Program dalla lista dei tipi di file, sarà possibile selezionare il 
programma da modificare cliccando su Open. 
-oppure- 
?? Scrivere nella finestra dei comandi il nome del programma da modificare digitando: 
MODIFY COMMAND myprogrm 
-oppure- 
?? Digitare nella finestra dei comandi 
 MODIFY COMMAND ? 
Apparirà all’interno di una finestra di dialogo l’elenco dei files disponibili dai quali si potrà 
scegliere quello desiderato ed aprirlo cliccando su Open. 
Una volta aperto il file di programma sarà possibile modificarlo. Una volta terminate le modifiche si 
potrà provvedere al successivo salvataggio. 
Eseguire un programma 
Una volta creato il programma è possibile mandarlo in esecuzione. 
Per eseguire un programma 
?? Nel caso in cui il programma sia contenuto all’interno di un progetto, occorrerà selezionarlo 
all’interno del Project Manager e scegliere l’opzione Run. 
-oppure- 
?? Dal menu Program, scegliere Do. Dall’elenco dei programmi disponibili, selezionare quello 
desiderato e cliccare su Do. 
-oppure- 
?? Dalla finestra dei comandi, digitare DO seguito dal nome del file di programma che si intende 
lanciare in esecuzione: 
 DO myprogram 
Scrivere Codice per mezzo dei Design Tools di Visual FoxPro 
Il Form Designer, Class Designer, ed il Menu Designer permettono di integrare facilmente il 
codice di programma con l’interfaccia utente, in maniera tale da rispondere alle azioni dell’utente 
con le corrette procedure. Il Report Designer permette, invece, di realizzare delle stampe ( report ) 
complesse e personalizzabili, potendo anche integrare del codice all’interno del file di report.. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
7
Al fine di sfruttare appieno la potenza di Visual FoxPro, è sempre raccomandabile utilizzare i 
design tools. Per ottenere maggiori informazioni sul Report Designer, consultare il Capitolo 7, 
Designing Reports and Labels, della Guida Utente. Per maggiori informazioni sul Class Designer, 
consultare il Capitolor 3, Object Oriented Programming, di questa guida. Per maggiori 
informazioni sul Form Designer, consultare il Capitolo 9, Creating Form, mentre per ciò che 
concerne il Menu Designer, è raccomandata la lettura del Capitolo 11, Designing Menus and 
Toolbars. 
I concetti di base della programmazione 
Quando si programma non si fa altro che creare dati e manipolarli attraverso una seri di istruzioni. I 
dati ed i loro contenitori sono il materiale grezzo del programmatore. Gli strumenti che servono per 
manipolare questo materiale grezzo sono i comandi, le funzioni e gli operatori. 
Immagazzinare i dati 
I dati sui quali si lavora probabilmente contengono quantità in tempo, denaro e voci contabili, come 
probabilmente date, nomi, descrizioni, eccetera. Ogni porzione di dati è di un determinato tipo, 
ovvero appartiene ad una categoria che offre la possibilità di manipolarli in modo similare. 
Naturalmente è sempre possibile lavorare direttamente con questi dati senza memorizzarli, ma così 
facendo si perderebbe la maggior parte della flessibilità e della potenza di Visual FoxPro; Visual 
FoxPro, infatti, fornisce numerosi tipi di contenitori per i dati, così da semplificarne la gestione. 
Le varie tipologie di dati sono determinanti per come poi andremo a gestirli ed immagazzinarli. E’ 
infatti possibile eseguire la moltiplicazione tra due numeri, ma non si possono moltiplicare tra loro 
due caratteri. Si possono stampare caratteri in maiuscolo, ma non si possono stampare in maiuscolo 
dei numeri ! 
Le più importanti categorie di dati che Visual FoxPro è in grado di gestire sono elencati nella 
seguente tabella: 
Categorie di dati 
Tipo Esempi 
Numerico 123 
3.1415 
– 7 
Carattere “Stringa di testo” 
“123” 
“01/01/98” 
Logico .T. 
.F. 
Data 
DataTempo 
{^1998-01-01} 
{^1998-01-01 12:30:00 p} 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
8
 
Contenitori 
I contenitori permettono di eseguire le stesse operazioni su diverse porzioni di dati. Ad esempio è 
possibile eseguire la somma di tutte le ore lavorate da un impiegato, moltiplicarle per la paga oraria 
e, dedotte le tasse, determinare lo stipendio percepito. E’ possibile eseguire questo calcolo per ogni 
impiegato ed ogni mese di paga. Memorizzando questa informazione in un apposito contenitore, ed 
eseguendo direttamente le operazioni su tale contenitore, saremo in grado di sostituire 
automaticamente i vecchi valori con i nuovi ogni volta che il programma rieseguirà il calcolo. 
Le più importanti categorie di contenitori di dati che Visual FoxPro è in grado di gestire sono 
elencati nella seguente tabella: 
Tipo Descrizione 
Variabile Singoli elementi di dati contenuti nella memoria RAM (Random Access 
Memory) del calcolatore. 
Tabella Record Righe contenenti campi, ognuno dei quali può immagazzinare una 
predefinita quantità di dati. 
Le tabelle vengono salvate su disco. 
Matrici (Array) Elementi multipli di dati contenuti nella memoria RAM del calcolatore. 
 
Manipolare i dati 
Contenitori e categorie rappresentano, insieme agli operatori alle funzioni ed ai comandi, i mattoni 
necessari per la manipolazione dei dati. 
Utilizzare gli Operatori 
Gli operatori legano i dati l’uno all’altro. Di seguito vengono elencati gli operatori più 
comunemente utilizzati in Visual FoxPro. 
Operatore Categorie di dati 
utilizzati 
Esempio Risultato 
= Tutte ? n = 7 Stampa .T. se il valore 
memorizzato nella 
variabile n vale 7, 
altrimenti stampa .F. 
+ Numeric, Character, 
Date, DateTime 
? "Fox" + "Pro" Stampa “FoxPro” 
! o NOT Logical ? !.T. Stampa .F. 
*, / Numeric ? 5 * 5 
? 25 / 5 
Stampa 25 
Stampa 5 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
9
 
Note L’inserimento di un punto interrogativo (?) davanti ad una espressione, provoca la stampa 
del risultato della espressione all’interno della finestra correntemente attiva (usualmente la finestra 
principale di Visual Foxpo) preceduta da un carattere di ritorno a capo (CR). 
Occorre tener presente che è necessario, con ogni operatore, utilizzare sempre lo stesso tipo di dati.regola. Se avete scritto del codice evento per un gruppo 
OptionButton o gruppo CommandButton ma non vi e’ alcun codice per l’evento in uno specifico 
pulsante nel gruppo, viene eseguito il codice evento del gruppo quando avviene l’evento del 
pulsante. 
Per esempio, potete avere un gruppo OptionButton con del codice associato all’evento Click. 
Soltanto uno dei due pulsanti nel gruppo ha del codice associato all’evento Click: 
Il codice evento per i gruppi di pulsanti puo’ essere usato come predefinito 
 
Se l’utente clicca su Option1, viene eseguito il codice associato all’evento Click di Option1. Il 
codice associato all’evento Click del gruppo di OptionButton non viene eseguito. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
80
Dato che non vi e’ alcun codice associato all’evento Click di Option2, se l’utente clicca Option2 
viene eseguito il codice associato all’evento Click del gruppo. 
Nota Quando si inizia una sequenza di eventi per un controllo, come il MouseDown ed il 
MouseUp, l’intera sequenza di eventi appartiene al controllo. 
Ad esempio, se cliccate con il tasto sinistro del mouse su di un CommandButton e trascinate il 
cursore del mouse lontano da esso, l’evento MouseMove del CommandButton continua a 
verificarsi, anche se il cursore del mouse viene mosso fuori dal form. Se rilasciate il tasto sinistro 
del mouse all’interno del form invece che sul CommandButton, l’evento MouseUp che si verifica e’ 
associato al CommandButton invece che al form. 
Classi ed eventi di controlli 
Se il controllo su di un form è derivato da una classe definita dall’utente (il quale, a sua volta, 
potrebbe essere derivato da un’altra classe definita dall’utente) Visual FoxPro verifica il codice 
evento nel controllo gerarchicamente piu’ vicino quando avviene l’evento. Se esiste del codice in 
tale procedura Visual FoxPro lo esegue. Se non esiste codice nella procedura per l’evento Visual 
FoxPro controlla nel livello gerarchico immediatamente superiore alla classe. Se Visual FoxPro 
trova del codice per quell’evento, in un qualsiasi punto nella gerarchia delle classi, viene eseguito 
quel codice. Qualsiasi codice gerarchicamente piu’ in alto non viene eseguito. 
Se non vi e’ alcun codice associato all’oggetto, Visual FoxPro verifica la classe superiore. 
 
 
Si puo’, tuttavia, includere del codice in una procedura per eventi e chiamare esplicitamente il 
codice nelle classi dalle quali e’ derivato il controllo usando la funzione DODEFAULT( ). 
Tracciamento della sequenza di eventi 
Il modello a eventi di Visual FoxPro e’ esteso, consentendovi un enorme controllo sui componenti 
della vostra applicazione in risposta ad una vasta varieta’ di azioni dell’utente. Alcune delle 
sequenze di eventi sono fisse, come per esempio quando un form viene creato o distrutto. Alcuni 
eventi avvengono indipendentemente, ma la maggior parte si verificano in concomitanza con 
diversi altri eventi derivati dall’interazione con l’utente. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
81
Attivazione del tracciamento eventi 
Il miglior modo di vedere le sequenze di eventi di Visual FoxPro e’ attivando il tracciamento eventi 
nel debugger. Il tracciamento eventi vi consente di vedere ogni evento associato ai vostri form e 
controlli avvenire in relazione ad altri eventi, cosi’ da poter decidere la posizione piu’ efficiente 
dove inserire il vostro codice. 
Attivare il tracciamento eventi 
 
1. Dal menu Tools della finestra del Debugger, selezionare Event Tracking. 
2. Nella finestra di dialogo Event Tracking, selezionare Turn event tracking on. 
Gli eventi presenti nella lista Events to track vengono inviati alla finestra Output del Debugger o 
scritti in un file man mano che si verificano. 
La finestra di dialogo Event Tracking 
 
 
Nota In questo esempio gli eventi MouseMove e Paint sono stati tolti dalla lista Events to track 
perche’ tali eventi si verificano cosi’ di frequente che rendono piu’ difficile vedere la sequenza 
degli altri eventi. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
82
Osservazione degli eventi che si verificano 
 
A volte viene innescato un singolo evento dall’azione dell’utente, come l’utente che muove il 
cursore del mouse su di un controllo. Spesso, tuttavia, l’azione dell’utente innesca eventi multipli. 
Questo paragrafo descrive l’ordine con cui avvengono gli eventi in risposta all’interazione 
dell’utente, prendendo il seguente form come esempio. 
Un form di esempio che illustra le sequenze di eventi 
 
 
In questo schema d’esempio l’utente compie le seguenti azioni sul form: 
1. Lancia il form. 
2. Scrive del testo in Text1. 
3. Seleziona il campo e lo copia nella clipboard. 
4. Passa su Text2. 
5. Incolla il testo su Text2. 
6. Chiude il form cliccando su Command2. 
Queste azioni scatenano uno o piu’ eventi di sistema per ciascun oggetto. Le seguenti tabelle 
mettono in risalto gli eventi innescati in risposta ad ogni azioni dell’utente. 
Azione 1 
L’utente lancia il form digitando il seguente comando nella finestra Command: 
DO FORM form1 NAME frmObject 
Visual FoxPro carica il form, inizializza ciascun oggetto, poi inizializza il form; il form viene 
attivato ed in seguito il primo campo riceve il focus. 
Ogetto Evento 
DataEnvironment BeforeOpenTables 
Form1 Load 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
83
DataEnvironment Init 
Text1 Init 
Text2 Init 
Command1 Init 
Command2 Init 
Form1 Init 
Form1 Activate 
Form1 GotFocus 
Text1 When 
Text1 GotFocus 
 
Azione 2 
L’utente digita Test in Text1. La pressione di ogni tasto genera due eventi. L’evento KeyPress 
riceve 2 parametri: il tasto premuto e lo stato dei tasti SHIFT, ALT e CTRL. 
Oggetto Evento 
Text1 KeyPress(84, 1) “T” 
Text1 InteractiveChange 
Text1 KeyPress(101, 0) “e” 
Text1 InteractiveChange 
Text1 KeyPress(115,0) “s” 
Text1 InteractiveChange 
Text1 KeyPress(116,0) “t” 
Text1 InteractiveChange 
 
Azione 3 
L’utente fa un doppio clic su Text1 per selezionarne il testo, poi preme CTRL+C per copiarlo nella 
clipboard. Gli eventi del mouse ed un evento Click accompagnano l’evento DblClick. Gli eventi 
MouseMove e MouseDown ricevono quattro parametri: un numero indica quale tasto e’ stato 
premuto, lo stato dello Shift e le posizioni X ed Y. Le posizioni X ed Y sono relative al form e 
riflettono l’unita’ di misura (pixels, per esempio) usata per esso. Viene indicato soltanto un evento 
MouseMove per ogni controllo. In realta’ questo evento scattera’ una mezza dozzina di volte o piu’. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
84
Oggetto Evento 
Form1 MouseMove(0, 0, 100, 35) 
Text1 MouseMove(0,0,44,22) 
Text1 MouseDown(1, 0, 44, 22) 
Text1 MouseUp(1, 0, 44, 22) 
Text1 Click 
Text1 MouseDown(1, 0, 44, 22) 
Text1 MouseUp(1, 0, 44, 22) 
Text1 DblClick 
 
Azione 4 
L’utente preme TAB per muoversi su Text2. 
 
Oggetto Evento 
Text1 KeyPress(9, 0) 
Text1 Valid 
Text1 LostFocus 
Text2 When 
Text2 GotFocus 
 
Azione 5 
 
L’utente incolla il testo copiato su Text2 premendo CTRL+V. 
 
Oggetto Evento 
Text2 InteractiveChange 
 
Azione 6 
L’utente clicca Command2, il quale chiude il form. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
85
Oggetto Evento 
Form1 MouseMove 
Command2 MouseMove 
Text2 Valid 
Command2 When 
Text2 LostFocus 
Command2 GotFocus 
Command2 MouseDown(1, 0, 143, 128) 
Command2 MouseUp(1, 0, 143, 128) 
Command2 Click 
Command2 Valid 
Command2 When 
 
Quando viene chiuso il form e l’oggetto viene rilasciato hanno luogo questi ulteriori eventi, in 
ordine inverso rispetto a quelli in Azione 1. 
Oggetto EventoForm1 Destroy 
Command2 Destroy 
Command1 Destroy 
Text2 Destroy 
Text1 Destroy 
Form1 Unload 
DataEnvironment AfterCloseTables 
DataEnvironment Destroy 
 
La sequenza di eventi del Visual FoxPro 
La tabella seguente illustra la completa sequenza di eventi Visual FoxPro che si genera. La 
proprieta’ AutoOpenTables del data environment si suppone posta a true (.T.). Altri eventi possono 
verificarsi a seconda dell’interazione dell’utente ed alla risposta del sistema. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
86
Oggetto Evento 
Data environment BeforeOpenTables 
Form set Load 
Form Load 
Data environment 
cursor(s) 
Init 
Data environment Init 
Objects 1 Init 
Form Init 
Form set Init 
Form set Activate 
Form Activate 
Object1 2 When 
Form GotFocus 
Object1 GotFocus 
Object1 Message 
Object1 Valid 3 
Object1 LostFocus 
Object2 3 When 
Object2 GotFocus 
Object2 Message 
Object2 Valid 4 
Object2 LostFocus 
Form QueryUnload 
Form Destroy 
Object 5 Destroy 
Form Unload 
Form set Unload 
Data environment AfterCloseTables 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
87
Data environment Destroy 
Data environment 
cursor(s) 
Destroy 
 
1. Per ciascun oggetto, da quello piu’ interno al contenitore piu’ esterno. 
2. Il primo oggetto nell’ordine del tab. 
3. L’oggetto successivo che prende il focus 
4. Quando l’oggetto perde il focus 
5. Per ciascun oggetto, dal contenitore piu’ esterno all’oggetto piu’ interno 
Assegnazione del codice agli eventi 
A meno che non associate del codice ad un evento nulla accade quando esso si verifica. Non 
scriverete quasi mai codice per tutti gli eventi associati ad un qualsiasi oggetto Visual FoxPro, 
magari vorrete incorporare della funzionalita’ in risposta a certi eventi chiave nelle vostre 
applicazioni. Per aggiungere del codice da eseguirsi quando avviene l’evento usate la finestra 
Properties nel Form Designer. 
La sequenza di eventi ha influenza su dove dovreste mettere il codice. Tenete presente i seguenti 
suggerimenti: 
?? Gli eventi Init di tutti i controlli di un form vengono eseguiti prima dell’evento Init del form 
stesso, in modo che possiate inserire del codice nell’evento Init del form per maneggiare uno 
qualsiasi dei controlli del form prima che esso venga visualizzato. 
?? Se volete che del codice venga eseguito ogni volta che cambia il valo re di una list box, 
combo box o check box associatelo all’evento InteractiveChange. L’evento Click potrebbe 
non avvenire o potrebbe essere chiamato anche se il valore non e’ cambiato. 
?? Quando trascinate un control gli eventi del mouse vengono sospesi. Ad esempio gli eventi 
MouseUp e MouseMove non si verificano durante un’operazione di drag-and-drop. 
?? Gli eventi Valid e When ritornano un valore. True (.T.) e’ il predefinito. Se ritornate false 
(.F.) o 0 dall’evento When il controllo non potra’ ricevere il focus. Se ritornate false (.F.) o 0 
dall’evento Valid il focus non potra’ lasciare il controllo. 
Per maggiori informazioni sull’uso del Form Designer guardate il Capitolo 9, Creazione dei form. 
Per informazioni sulla stesura di codice per le classi ed aggiunta di codice eventi guardate il 
Capitolo 3, Programmazione orientata agli oggetti. 
Nella seguente tabella viene elencato una serie di eventi di Visual FoxPro, che è valido per la 
maggior parte dei controlli. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
88
Set di eventi centrali 
 
Evento 
 
 
L'evento viene attivato quando 
 
Load Viene caricato un form o un set di form in memoria. 
Unload Viene rilasciato un form o un set di form dalla memoria. 
Init Viene creato un oggetto. 
Destroy Viene rilasciato un oggetto dalla memoria. 
Click L'utente fa clic sull'ogge tto utilizzando il pulsante primario del mouse. 
DblClick L'utente fa doppio clic sull'oggetto utilizzando il pulsante primario del 
mouse. 
RightClick L'utente fa clic sull'oggetto utilizzando il pulsante secondario del mouse. 
GotFocus L'oggetto diventa l'elemento attivo, in seguito ad azioni dell'utente come 
la tabulazione o il clic oppure in seguito alla modifica nel codice 
dell'elemento attivo con il metodo SetFocus. 
LostFocus L'oggetto non è più l'elemento attivo, in seguito ad azioni dell'utente come 
la tabulazione o il clic su un altro oggetto, oppure in seguito alla modifica 
nel codice dell'elemento attivo con il metodo SetFocus. 
KeyPress L'utente preme e rilascia un tasto. 
MouseDown 
 
L'utente preme un pulsante del mouse mentre il puntatore del mouse si 
trova sopra l'oggetto. 
MouseMove L'utente sposta il mouse sopra l'oggetto. 
MouseUp L'utente rilascia un pulsante del mouse mentre il puntatore del mouse si 
trova sopra l'oggetto. 
InteractiveChange 
 
Il valore dell'oggetto viene modificato in modo interattivo. 
ProgrammaticChange 
 
Il valore dell'oggetto viene modificato in fase di programmazione. 
 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
89
Capitolo 5: Progettare i Database 
 
Traduzione di Mirco Lucchini 
 
Form = maschere di inserimento 
Report = modulo di stampa 
 
Con Visual Fox Pro, utilizzate i database per organizzare e mettere in relazione tabelle e viste. I 
database forniscono l’architettura per immagazzinare dati ed avere anche vantaggi aggiuntivi. 
Usando un database, si possono creare estensioni a livello di tabella, come regole per campo e 
regole per record, valori iniziali di campo, e triggers. Potrete anche creare procedure memorizzate e 
relazioni permanenti tra tabelle. Potete usare il vostro database per creare connessioni a sorgenti di 
dati remote e creare viste di tabelle locali e remote. 
 
Questo capitolo fornisce le linee guida per organizzare le tabelle che saranno usate in un database di 
Visual Fox Pro. Esso vi guiderà attraverso la progettazione dell’esempio di database Tasmanian 
Traders e fornirà degli esempi aggiuntivi sulla progettazione del database. 
L’esempio del database Tasmanian Traders si trova nella cartella di Visual Studio 
..\samples\Vfp98\Tastrade\data. 
Per informazioni sulla creazione di database di Visual Fox Pro dopo averli progettati, vedere il 
Capitolo 6, “Creare Database”. Per informazioni sulla creazione di tabelle di Visual Fox Pro, vedere 
il Capitolo 7, “Lavorare con le Tabelle”. 
 
Questo capitolo tratterà i seguenti argomenti: 
 
?? Usare un metodo per la progettazione del database 
?? Analizzare i requisiti dei dati 
?? Raggruppare i requisiti in tabelle 
?? Determinare i campi necessari 
?? Identificare le relazioni 
?? Rifinire il progetto 
?? Diagrammi del database d'esempio 
 
(NDT riportiamo qui una definizione di alcuni termini presenti nei paragrafi di questo capitolo) 
 
Terminologia 
Indice primario primary index 
Un indice che non permette valori duplicati nel campo specificato o nell’espressione. Gli 
indici primari sono utilizzati principalmente nella tabella principale o referenziata per 
stabilire una integrità referenziale in una relazione persistente. Si può creare solamente un 
indice primario in una tabella. VFP restituisce un errore se viene indicato come indice 
primario un campo che contiene valori duplicati. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
90
Indice candidato candidate index 
Un indice che può diventare chiave primaria, perché non contiene valori nulli o duplicati 
Indice regolare regular index 
Un indice che non è unico, primario, o candidato. Gli indici regolari determinano l'ordine di 
elaborazione dei record ma consentono l'immissione in un campo di valori duplicati (quindi 
escludono il controllo di unicità). È possibile aggiungere ad una tabella più indici regolari. 
Si possono utilizzare indici regolari per ogni latodi una relazione persistente uno-a-molti 
Indice univoco unique index 
E’ possibile creare un indice univoco che seleziona e ordina una parte di record in base alla 
prima ricorrenza di un valore nel campo specificato. Se si desidera selezionare i record in 
questo modo, è possibile che invece si desideri creare una query o una vista. 
Chiave primaria primary key 
La colonna o le colonne I cui valori identificano in modo univoco una riga in una tabella 
Chiave esterna foreign key 
Una colonna o combinazioni di colonna, i cui valori devono corrispondere a quelli di una 
chiave primaria in un’altra tabella. Viene utilizzata per unire in relazione le tabelle. 
Integrità referenziale referential integrity (RI) 
Le regole che governano la consistenza dei dati, specificatamente le relazioni fra le chiavi 
primarie e le chiavi esterne di tabelle differenti. VFP indirizza l’integrità referenziale con un 
campo definito dall’utente e regole a livello di record. Il Referential Integrity Builder 
consente l’impostazione delle regole con cui controllare l’inserimento, l’aggiornamento e la 
cancellazione di record nelle tabelle. 
Relazione persistente persistent relationship 
Relazione fra tabelle la cui persistenza esiste anche quando il programma non è in funzione, 
devono essere collocate in un database per consentire questo tipo di relazione. 
 
Usare un metodo per la progettazione del database 
 
Se usate un metodo predefinito per la progettazione del database, potrete creare effettivamente e 
velocemente un database ben progettato che vi fornirà un accesso vantaggioso alle informazioni che 
vi interessano. Con una solida progettazione, impiegherai meno tempo nella costruzione del 
database, e otterrai velocemente risultati più precisi. 
 
Nota Il termine database e tabella non sono sinonimi in Visual Fox Pro. Il termine database (.dbc 
File) si riferisce a un database relazionale che è un contenitore di informazioni riguardanti una o più 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
91
tabelle (.dbf files) o viste. 
 
La chiave di un efficace progetto di database, sta nel capire esattamente quali informazioni si 
vogliono immagazzinare e il modo in cui un database relazionale, come Visual Fox Pro, le 
memorizza. 
Per fornire efficientemente ed accuratamente le informazioni di cui necessitate, Visual Fox Pro ha 
bisogno di informazioni riguardanti soggetti differenti organizzate in tabelle separate. Per esempio, 
potete avere una tabella che contiene solo informazioni riguardanti gli impiegati e un'altra che 
contiene informazioni riguardanti le vendite. 
 
Organizzando le vostre informazioni in maniera appropriata, renderete flessibile il vostro database 
in modo da poter combinare e presentare i fatti in modi diversi. Per esempio, potrete stampare 
report dove potrete combinare fatti riguardanti gli impiegati e fatti riguardanti le vendite. 
 
Separare le informazioni in tabelle aggiunge flessibilità al database. 
 
 
Quando progettate un database, per prima cosa dovrete spezzare le informazioni che desiderate 
mantenere in soggetti separati, e poi dire a Visual Fox Pro come i soggetti sono collegati agli altri 
cosicché Visual Fox Pro possa produrre le giuste informazioni quando ne avete bisogno. Per 
mantenere le informazioni in tabelle separate, dovrete organizzare e gestire i vostri dati come se 
costruiste un’applicazione ad alte prestazioni. 
 
Ecco i passi necessari alla progettazione del database. Ogni passo è trattato dettagliatamente nella 
sezione rimanente di questo capitolo. 
 
1. Determinare lo scopo del database La conoscenza dello scopo vi aiuterà a decidere quali 
informazioni volete che Visual Fox Pro immagazzini. 
2. Determinare le tabelle necessarie Quando è chiaro lo scopo del vostro database, potrete 
dividere le informazioni in soggetti separati, come “Impiegati” o “Ordini”. Ogni soggetto 
sarà una tabella nel vostro database. 
3. Determinare i campi necessari Decidete quali informazioni volete mantenere in ogni 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
92
tabella. Ogni categoria di informazione in una tabella è chiamato campo ed è visualizzato 
come una colonna quando scorrerete una tabella. Per esempio, un campo in una tabella 
Impiegati potrebbe essere Last_name (cognome); ed un altro potrebbe essere Hire_date 
(data_salario). 
4. Determinare le relazioni Visualizzare ogni tabella e decidere come i dati di una tabella 
sono in relazione con i dati di un'altra tabella. Aggiungere campi alle tabelle o creare nuove 
tabelle per semplificare le relazioni, se necessario. 
5. Rifinire il progetto Controllate il progetto per eventuali errori. Create le tabelle e 
aggiungete un po’ di dati. Vedete se si ottengono i risultati voluti dalle tabelle. Effettuate le 
modifiche necessarie al progetto. 
 
Non vi preoccupate se ci saranno errori o se dimenticate qualche cosa rispetto al progetto iniziale. 
Pensate ad esso come ad una bozza grezza che potrete rifinire più avanti. Eseguite delle prove con 
dati di esempio, prototipi dei vostri forms e reports. Con Visual Fox Pro, è facile cambiare la 
struttura del vostro database rispetto a come è stato creato. In ogni caso, diventerà molto più 
difficile effettuare cambiamenti alle tabelle dopo averle riempite di dati e dopo aver creato forms e 
reports. Per questa ragione assicuratevi di avere una solida struttura prima di continuare nella 
costruzione della vostra applicazione. 
 
Analizzare i requisiti dei dati 
 
Il primo passo nella progettazione di un database di Visual Fox Pro è quello di analizzare i requisiti 
per i vostri dati determinando lo scopo del database e come esso sarà utilizzato; vale a dire quali 
informazioni vorrete recuperare dal database. Da questo, potrete determinare di quali soggetti avrete 
bisogno per immagazzinare informazioni riguardo alle tabelle e quali informazioni avrete bisogno 
di memorizzare riguardo ad ogni soggetto (i campi nelle tabelle). 
 
Parlare con le persone che utilizzeranno il database. Domandatevi a quali domande il database 
dovrà risposta. Impostate i reports che vorrete che esso produca. Raccogliete i forms che usate 
correntemente per registrare i vostri dati. Utilizzerete tutte queste informazioni nei rimanenti passi 
del processo di progettazione. 
 
Esempio: Controllare le vendite e l’Inventario 
Supponiamo che Tasmanian Traders, una società di import/export che vende specialità 
gastronomiche di tutto il mondo, voglia un database che possa tenere sotto controllo le informazioni 
riguardanti le vendite e l’inventario dell’azienda. 
 
Partiamo scrivendo una lista di domande alle quali il database dovrebbe rispondere. Quante vendite 
del nostro prodotto abbiamo fatto il mese scorso? Chi è il fornitore del prodotto più venduto? 
 
Proseguiamo riunendo tutti i forms ed i reports che contengono le informazioni che il database 
dovrebbe produrre. La società attualmente utilizza un report stampato per tenere una traccia dei 
prodotti che sono stati ordinati, e un form di ordini per prendere nuove ordini. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
93
Forms e reports mostrano alcuni dati richiesti per il database. 
 
 
 
Tasmanian Traders necessita anche di stampare delle etichette per l’invio di posta a clienti, 
impiegati e fornitori. 
 
Dopo aver raccolto queste informazioni siamo pronti per il prossimo passo. 
 
Raggruppare i requisiti in tabelle 
 
Decidere le tabelle del vostro database può essere un passo strategico nella progettazione del 
database. 
Questo perché i risultati che si vogliono ottenere dal database – i reports che volete stampare, i 
forms che volete usare, e le risposte alle vostre domande – non forniscono necessariamente degli 
indizi riguardo alla struttura delle tabelle che produrranno tali oggetti. Essi vi dicono quello che voivolete sapere ma non come disporre le informazioni nelle tabelle. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
94
Guardate il precedente form degli ordini come esempio. Esso include notizie riguardanti i clienti – 
l’indirizzo e il numero di telefono del cliente – insieme a notizie riguardanti l’ordine. Questo form 
vi fornisce un numero di informazioni che sapete di voler immagazzinare nel vostro database. 
Sebbene le notizie siano tutte sullo stesso form, potete facilmente prevenire i problemi di integrità 
dei dati comuni, memorizzandole in tabelle separate. 
 
Immagazzinare informazioni una volta riduce le possibilità di errore. Per esempio, se utilizzate 
una sola tabella per salvare le informazioni per un form degli ordini, supponendo che un cliente vi 
invii tre ordini differenti, voi dovreste aggiungere l’indirizzo e il numero di telefono del cliente tre 
volte, una volta per ogni ordine, ma questo moltiplica le possibilità di errori in fase di inserimento 
dei dati. 
La tabella dei Clienti memorizza l’indirizzo una sola volta. 
 
 
 
Inoltre, se il cliente cambiasse indirizzo, dovreste accettare informazioni contraddittorie oppure 
cercare e cambiare tutti i records delle vendite per quel cliente nella tabella. E’ molto meglio creare 
una tabella clienti che immagazzina l’indirizzo del cliente una sola volta nel database. In seguito se 
dovesse essere necessario cambiare i dati di un cliente, lo si farebbe una sola volta. 
 
Prevenire la cancellazione di informazioni preziose. Supponiamo che un nuovo cliente faccia un 
ordine e poi lo annulli. Quando cancellate l’ordine dalla tabella che contiene informazioni sia 
riguardanti il cliente sia il suo ordine, voi cancellereste anche i dati del cliente anche se voi vorreste 
tenere questo nuovo cliente nel database in modo da potergli spedire il vostro prossimo catalogo. 
Allora, è meglio mettere le informazioni riguardanti il cliente in una tabelle Clienti separata. In 
questo modo potrete eliminare gli ordini senza cancellare le informazioni del cliente. 
Controllate le informazioni che volete ottenere dal database e dividetele in soggetti fondamentali da 
avere sotto controllo, come clienti, impiegati, prodotti in vendita, fornitura di servizi e così via. 
Ognuno di questi soggetti sarà una tabella separata. 
 
Consiglio Una strategia per dividere le informazioni in tabelle è quella di guardare ai singoli 
avvenimenti e determinare di cosa trattano. Per esempio, nel form degli ordini di Tasmanian 
Traders, l’indirizzo del cliente non interessa i dati della vendita, interessa i dati del cliente. Questo 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
95
suggerisce che avete bisogno di tabelle separate per i clienti. Nel report Prodotti dell’ordine, il 
numero di telefono del fornitore non riguarda la scorta del prodotto; riguarda il fornitore. Questo 
suggerisce che avete bisogno di una tabella separata per i fornitori. 
 
Esempio: Progettare le tabelle nel database Tasmanian Traders 
 
Il form degli ordini e il report dei Prodotti in ordine di Tasmanian Traders, includono informazioni 
riguardanti questi soggetti: 
 
?? Impiegati 
?? Clienti 
?? Fornitori 
?? Prodotti 
?? Ordini 
 
Da questa lista, potete abbozzare le tabelle del database ed alcuni dei campi per ogni tabella. 
 
Bozza delle tabelle e dei campi necessari per il database di Tasmanian Traders. 
 
 
 
Nonostante il database finale di Tasmanian Traders contenga altre tabelle, questo elenco è un buon 
inizio. 
Più avanti in questo capitolo, vedrete come aggiungere altre tabelle per rifinire il progetto. 
 
Determinare i campi necessari 
 
Per determinare i campi in una tabella, decidete che cosa avete bisogno di sapere riguardo alle 
persone, cose, o eventi registrati nella tabella. Potete pensare ai campi come ad attributi della 
tabella. Ogni record (o riga) nella tabella contiene lo stesso gruppo di campi o attributi. Per 
esempio, un campo indirizzo in una tabella clienti contiene gli indirizzi dei clienti. Ogni record 
nella tabella contiene dati riguardanti un cliente, e il campo indirizzo contiene l’indirizzo per quel 
cliente. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
96
 
Identificare i campi 
 
Ecco alcuni consigli per determinare i vostri campi: 
Correlate ogni campo direttamente al soggetto della tabella Un campo che descrive il soggetto 
di una tabella diversa può andare bene anche ad un'altra tabella. Più avanti, quando definirete le 
relazioni tra le vostre tabelle, vedrete come potrete combinare i dati da campi in tabelle multiple. 
Per adesso, siate sicuri che ogni campo nella tabella descriva direttamente il soggetto della tabella. 
Se trovate delle stesse informazioni ripetute in molte tabelle, significa che avete dei campi inutili in 
alcune delle tabelle. 
Non includete dati calcolati o derivati In molti casi, non si vogliono memorizzare i risultati nelle 
tabelle. Visual Fox Pro eseguirà per voi i calcoli quando vorrete visualizzare i risultati. 
Per esempio, il form degli ordini mostrato in precedenza in questo capitolo, mostra il prezzo esteso 
per ogni linea dell’ordine del database di Tasmanian Traders, nonostante il campo subtotale per il 
prezzo esteso non sia presente in alcuna tabella di Tasmanian Traders. Invece, la tabella 
Order_Line_Items contiene un campo quantità che immagazzina le unità nell’ordine per ogni 
singolo prodotto, ed anche il prezzo unitario di ogni oggetto ordinato. Usando questi dati Visual 
Fox Pro calcola i subtotali ogni volta che stampate un ordine, quindi il subtotale non ha bisogno di 
essere memorizzato nella tabella. 
 
Includete tutte le informazioni di cui avete bisogno E’ facile trascurare le informazioni 
importanti. Tornate alle informazioni che avete raccolto al primo passo del progetto. Controllate i 
forms e i reports su carta per essere sicuri che tutte le informazioni richieste precedentemente siano 
incluse nelle tabelle di Visual Fox Pro o che possano essere prelevate da esse. Pensate alle richieste 
che farete a Visual Fox Pro. Potrà Visual Fox Pro trovare tutte le risposte utilizzando le 
informazioni nelle vostre tabelle? Avete identificato i campi che conterranno dati unici come l’ID 
del cliente? Quali tabelle contengono informazioni che unirete in un report o in un form? Per 
maggiori informazioni riguardanti l’identificazione di campi chiave e tabelle correlate, vedere le 
sezioni Usare Campi Chiave Primari e Identificare le Relazioni più avanti in questo capitolo. 
 
Memorizzare le informazioni nelle relative più piccole parti logiche Potreste essere tentati di 
utilizzare un singolo campo per il nome completo, o il nome di un prodotto insieme alla sua 
descrizione. Combinare più di un tipo di informazione in un singolo campo renderà più difficile 
recuperare dei risultati più avanti. Provate a spezzare le informazioni in parti logiche; per esempio, 
create campi separati per il nome ed il cognome, o per il nome del prodotto, la sua categoria e la sua 
descrizione. 
 
Esempio: Aggiunta di campi alla Tabelle Prodotti 
 
Tasmanian Traders vende specialità gastronomiche importate da tutto il mondo. Gli impiegati 
utilizzano il report Products On Order per tenere una traccia dei prodotti ordinati. 
 
Report per controllare l’inventario dei prodotti 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
97
 
 
Il report indica che la tabella prodotti, che contiene dati riguardanti i prodotti venduti, ha bisogno di 
campi aggiuntivi per il nome del prodotto, le unità immagazzinate, le quantità in ordine. Ma come 
fare per i campi per il nome del fornitore ed il suo numero di telefono? Per ottenere il report Visual 
Fox Pro ha bisogno di sapere qual è il fornitore di un determinato prodotto. 
 
Bozza della tabella fornitori contenentei campi per il nome ed il numero di telefono del 
fornitore 
 
 
Potete risolvere il problema senza memorizzare dati ridondanti nelle vostre tabelle creando una 
tabella fornitori con campi separati per il nome ed il numero di telefono. Il prossimo passo vi farà 
aggiungere un campo alla tabella prodotti che identificherà le informazioni del fornitore. 
 
Utilizzare i Campi Chiave Primari 
 
La potenza in un sistema di gestione con un database relazionale come Visual Fox Pro deriva dalla 
sua capacità di trovare e raccogliere insieme informazioni memorizzate in tabelle separate. Per fare 
in modo che Visual Fox Pro possa lavorare al meglio, ogni tabella nel vostro database dovrà 
includere un campo o una serie di campi che identifichino univocamente ogni singolo record 
immagazzinato nella tabella. Spesso questo è un unico numero di identificazione, come un numero 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
98
ID per ogni impiegato o un numero di serie. Nella terminologia dei database questa informazione è 
chiamata chiave primaria della tabella. Visual Fox Pro usa i campi chiave primari per associare 
velocemente dei dati da tabelle multiple e riportare insieme i dati per voi. 
Se già avete un identificativo unico per una tabella, come un gruppo di numeri del prodotto che 
avete generato per identificare gli oggetti nel vostro magazzino, lo potete utilizzare come chiave 
primaria della tabella. Ma siate sicuri che i valori in questo campo siano sempre diversi per ogni 
record –Visual Fox Pro non permette valori duplicati in un campo chiave primario. Per esempio, 
non utilizzate il nome di qualcuno come chiave primaria, perché i nomi non sono unici. Potete 
facilmente avere due persone con lo stesso nome nella stessa tabella. 
 
Quando scegliete i campi chiave primari, tenete presente questi punti: 
 
?? Visual Fox Pro non permette valori duplicati o nulli in un campo chiave primario. Per questo 
motivo non dovrete scegliere un a chiave primaria che possa contenere tali valori. 
?? Potete utilizzare un valore in un campo chiave primario per identificare record, così esso non 
dovrà essere troppo lungo da ricordare o da digitare. Potrete decidere di assegnargli un certo 
numero di lettere o numeri oppure che sia contenuto in un range di valori. 
?? La dimensione della chiave primaria influisce sulla velocità delle operazioni nel vostro 
database. Quando create un campo chiave primario, utilizzate la più piccola dimensione che 
soddisfi i valori che immagazzinerete nel campo. 
 
Esempio: Impostazione della chiave primaria per la tabella dei prodotti 
 
La chiave primaria della tabella prodotti di Tasmanian Traders contiene il numero ID del prodotto. 
Siccome ogni numero del prodotto identifica un diverso prodotto, voi non vorrete due prodotti con 
lo stesso numero. 
 
La chiave primaria per la tabella prodotti è il campo Product_id. 
 
 
 
In alcuni casi potreste volere utilizzare due o più campi che insieme formino la chiave primaria di 
una tabella. Per esempio, la tabella Order_line_items nel database Tasmanian Traders usa due 
campi come sua chiave primaria: Order_id e Product_id. Più avanti vedrete perché. 
 
Identificare le relazioni 
 
Ora che avete suddiviso le informazioni in tabelle, avete bisogno un sistema per fare si che Visual 
Fox Pro le riunisca in modo comprensibile. Per esempio, il form seguente include informazioni 
provenienti da diverse tabelle. 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
99
Il Form Order Entry utilizza informazioni provenienti da diverse tabelle. 
 
 
 
Visual Fox Pro è un database relazionale, questo significa che i dati correlati saranno immagazzinati 
in tabelle diverse; poi definirete le relazioni tra le tabelle e Visual Fox Pro utilizzerà le relazioni per 
trovare le informazioni associate contenute nel vostro database. 
 
Per esempio, supponiate di voler telefonare ad un impiegato per avere informazioni riguardanti le 
sue vendite. Il numero di telefono dell’impiegato è registrato nella tabella impiegati e le vendite 
sono registrate nella tabella Ordini. Quando chiedete a Visual Fox Pro la vendita che vi interessa, 
Visual Fox Pro può consultare il numero di telefono basato sulla relazione tra le tabelle. Esso 
funziona perché Employee_id, la chiave primaria della tabella impiegati, è anche un campo nella 
tabella ordini. Nella terminologia dei database, il campo Employee_id nella tabella ordini è 
chiamato chiave esterna, perché si riferisce ad una chiave primaria di una tabella diversa o esterna. 
 
Il campo Employee_id come chiave primaria per la tabella Impiegati e come chiave esterna 
per la tabella Ordini 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
100
 
 
Così per impostare una relazione tra due tabelle – Tabella A e Tabella B – verrà aggiunta una 
chiave primaria all’altra tabella cosicché essa appaia in entrambe le tabelle. Ma quale sarà la chiave 
primaria della tabella da utilizzare?. Per impostare la relazione correttamente, dovrete determinare 
la natura della relazione. Esistono tre tipi di relazioni tra tabelle. 
 
?? Relazione uno-a-molti 
?? Relazione molti-a-molti 
?? Relazione uno-a-uno 
 
La parte rimanente di questa sezione mostra un esempio di ogni tipo di relazione e spiega come 
progettare le vostre tabelle in modo che Visual Fox Pro possa associare i dati correttamente. Lo 
scopo di ogni esempio è quello di spiegare come possiate determinare le relazioni tra le tabelle e 
come decidere quali campi appartenenti alle tabelle possano essere idonei per queste relazioni – 
esso non descrive come usare l’interfaccia di Visual Fox Pro per relazionare le tabelle. 
 
Esempio: creare una relazione Uno-a-molti 
 
 Una relazione uno-a-molti, è il tipo di relazione più comune in un database relazionale. . In una 
relazione uno-a-molti, un record nella Tabella A può avere più di un record correlato nella Tabella 
B, ma un record nella Tabella B puo avere al massimo un solo record correlato nella Tabella A. 
 
Per esempio, le tabelle Categorie e Prodotti nel database Tasmanian Traders hanno una relazione di 
tipo uno-a-molti. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
101
Le tabelle Categorie e Prodotti rappresentano una relazione uno-a-molti. 
 
 
 
Per impostare la relazione, aggiungete il campo o i campi, che rappresenteranno la chiave primaria, 
dalla parte “uno” della relazione alla tabella dalla parte “molti” della relazione. Utilizzerete una 
chiave primaria o a indice candidato per la parte “uno” della relazione e una chiave ad indice 
regolare per la parte “molti”. In questo caso dovrete aggiungere il campo Category_id dalla tabella 
Categorie alla tabella Prodotti, perché una categoria contiene molti prodotti. Visual Fox Pro utilizza 
il numero identificativo della categoria per trovare la corretta categoria per ogni prodotto. 
 
Per informazioni riguardo alla creazione di chiavi indice, vedere il Capitolo 7, Lavorare con le 
tabelle 
 
Esempio: Creare una relazione Molti-a-Molti 
 
Nella relazione molti-a-molti, un record nella Tabella A può avere più di un record corrispondente 
nella Tabella B. e un record nella Tabella B può avere più di un record corrispondente nella Tabella 
A. Questo tipo di relazione richiede delle modifiche al vostro database prima che possiate 
specificare correttamente la relazione a Visual Fox Pro. 
Per riconoscere le relazioni molti-a-molti tra le vostre tabelle, è importante dare uno sguardo ad 
entrambe le direzioni della relazione. Per esempio, considerate la relazione tra ordini e prodotti 
dell’azienda Tasmanian Traders. Un ordine può contenere più di un prodotto. Così per ogni record 
nella tabella degli ordini, potrebbero esserci più record nella tabella prodotti; ma non è tutto, ogni 
prodottopotrebbe apparire in molti ordini; così per ogni record della tabella prodotti, potrebbero 
esserci molti record nella tabella ordini. 
 
 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
102
 
Le tabelle Ordini e Prodotti rappresentano una relazione molti-a-molti. 
 
 
 
I soggetti delle due tabelle –ordini e prodotti- hanno una relazione ,molti-a-molti; ciò costituisce 
una sfida nella progettazione del database. Per capire il problema, immaginate cosa potrebbe 
succedere se cercaste di impostare la relazione tra le due tabelle aggiungendo il campo Product_id 
alla tabella Ordini. Per avere più di un prodotto per ordine, avreste bisogno più di un record nella 
tabella ordini per ogni ordine. Dovreste ripetere le informazioni riguardanti l’ordine più e più volte, 
cioè per ogni record relativo allo stesso ordine –una progettazione inefficiente che potrebbe portarvi 
ad avere informazioni non corrette. Incorrereste nello stesso problema se venisse aggiunto il campo 
Order_id nella tabella Prodotti- avreste più di un record nella tabella prodotti per ogni prodotto. 
Come risolvereste il problema? 
 
La risposta è quella di creare una terza tabella che divida la relazione molti-a-molti in due relazioni 
uno-a-molti. Questa terza tabella è chiamata tabella di congiunzione, perché essa rappresenta 
l’unione tra due tabelle. Metterete la chiave primaria da ognuna delle due tabelle nella tabella di 
congiunzione. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
103
La tabella Order_line_items crea un legame uno-a-molti tra gli Ordini e i Prodotti. 
 
 
Una tabella di congiunzione potrebbe contenere solo le due chiavi primarie che collegano insieme le 
tabelle oppure come nelle tabella Order_line_items, potrebbe contenere informazioni aggiuntive. 
 
Ogni record nella tabella Order_line_items rappresenta una singola voce in un ordine. La chiave 
primaria della tabella Order_line_items è composta da due campi –le chiavi straniere dalle tabelle 
Ordini e Prodotti. Il campo Order_id da solo non funziona come chiave primaria per questa tabella, 
perché un ordine può contenere più voci. L’ order_id è ripetuto per ogni voce in un ordine perciò il 
campo non conterrà valori univoci. Il campo Product_id allo stesso modo non potrà essere usato 
come chiave primaria perché un prodotto potrebbe essere presente in diversi ordini. Insieme i due 
campi nella tabella di congiunzione genereranno sempre un valore unico per ogni record. La tabella 
di congiunzione non richiede una sua chiave primaria. 
 
Nel database Tasmanian Traders, la tabella Ordini e la tabella Prodotti non sono correlate 
direttamente. Esse sono correlate indirettamente tramite la tabella Order_line_items. La relazione 
molti-a-molti tra ordini e prodotti è rappresentata nel database utilizzando due relazioni uno-a-
molti. 
 
?? Le tabelle Ordini e Order_line_items hanno una relazione uno-a-molti. Ogni ordine può 
avere più di una voce, ma ogni voce è collegata solo ad un ordine. 
?? Le tabelle Prodotti e Order_line_items hanno una relazione uno-a-molti. Ogni prodotto può 
avere più voci associate ad esso, ma ogni voce si riferisce solo ad un prodotto. 
 
Esempio: Creare una relazione Uno-a-Uno 
 
 
In una relazione uno-a-uno, un record della Tabella A non può avere più di un record 
corrispondente nella Tabella B, ed un record della Tabella B non può avere più di un record 
corrispondente nella Tabella A. Questo tipo di relazione è insolito e potrebbe essere richiamata per 
alcuni cambiamenti nella progettazione del vostro database. 
 
La relazione uno-a-uno tra tabelle è insolita perché in molti casi, l’informazione nelle due tabelle 
potrebbe semplicemente essere combinata in una tabella. Per esempio, supponete di creare una 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
104
tabella chiamata Giocatori di Ping-Pong per controllare le informazioni riguardanti il torneo di 
Ping-Pong di Tasmanian Traders. Siccome i giocatori di ping-pong sono tutti impiegati di 
Tasmanian Traders, questa tabella ha una relazione uno-a-uno con la tabella Impiegati del database 
Tasmanian Traders. 
 
Le tabelle Impiegati e Giocatori di Ping-Pong rappresentano una relazione uno-a-uno. 
 
 
 
Potreste aggiungere tutti i campi della tabelle Giocatori di Ping-Pong alla tabella Impiegati. Ma la 
tabella Giocatori di Ping-Pong controlla un evento momentaneo e non si desiderano altre 
informazioni una volta che l’evento si è verificato. In aggiunta, non tutti gli impiegati giocano a 
ping-pong, così se questi campi fossero inclusi nella tabella Impiegati, potrebbero non contenere 
niente per diversi record. Per questi motivi ha senso creare una tabella separata. 
 
Quando identificate la necessità di una relazione uno-a-uno nel vostro database, considerate di poter 
mettere insieme le informazioni in una sola tabella. Per esempio, nella tabella impiegati, un 
impiegato può avere un direttore che è anche un impiegato. Potete aggiungere un campo numero 
identificativo del direttore. Per ottenere le informazioni più avanti potrete creare un auto 
collegamento ne lle vostre query o nelle viste. Non avete bisogno di tabelle separate per risolvere 
una relazione uno-a-uno. Se per qualche motivo non volete farlo, ecco come impostare una 
relazione uno-a-uno tra due tabelle: 
 
?? se le due tabelle anno il medesimo soggetto, potrete probabilmente impostare la relazione 
usando lo stesso campo chiave primaria in entrambe le tabelle. 
?? Se le due tabelle hanno soggetti diversi con chiavi primarie diverse, prendete una delle 
tabelle( o l'altra) e mettete il suo campo chiave primaria nell’altra tabella come chiave 
esterna. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
105
Rifinire il progetto 
 
Quando avrete le tabelle, i campi e le relazioni che vi servono, sarà il momento di studiare il 
progetto e determinare ogni difetto o mancanza rimaste. 
 
Potrete incontrare diverse insidie mentre progettate il vostro database. Questi problemi comuni, 
potrebbero causare difficoltà di utilizzo e manutenzione dei vostri dati. 
 
?? Avete una tabella con un gran numero di campi che non si riferiscono allo stesso soggetto? 
Per esempio, una tabella potrebbe contenere campi relativi ai fornitori come anche campi 
contenenti informazioni sulle vendite. Siate certi che ogni tabella contenga dati riguardanti 
solo un soggetto. 
?? Avete dei campi che sono stati lasciati intenzionalmente vuoti in molti record perché non 
sono inerenti a quei record? Questo generalmente significa che appartengono ad un'altra 
tabella. 
?? Avete un gran numero di tabelle, molte delle quali contengono lo stesso campo? Per 
esempio, avete tabelle separate per le vendite di Gennaio e Febbraio, o per clienti locali o 
lontani, nelle quali immagazzinate lo stesso tipo di informazioni. Provate a consolidare tutte 
le informazioni relative ad uno stesso soggetto in una tabella. Potreste avere anche bisogno 
di aggiungere un campo extra, per esempio, per identificare la data delle vendite. 
 
Create le vostre tabelle, specificate le relazioni tra le tabelle e inserite pochi record di dati in ogni 
tabella. Osservate se potete utilizzare il database per ottenere le risposte che volete. Create degli 
schizzi grossolani dei vostri forms e report e vedete se mostrano i dati che vi aspettate. Cercate dati 
duplicati non necessari ed eliminateli. 
 
Quando proverete il vostro database, probabilmente scoprirete spazio per dei miglioramenti. Ecco 
alcune cose da controllare: 
 
?? Avete dimenticato qualche campo? Ci sono informazioni di cui avete bisogno che mancano? 
Se sì, appartengono ad altre tabelle esistenti? Se è un informazione riguardante qualcosa 
d’altro probabilmente avrete bisogno di creare un’altra tabella. 
?? Avete sceltouna buona chiave primaria per ogni tabella? Se la utilizzate per cercare dei 
record, è semplice da ricordare e da digitare? Siate sicuri che non dovrete inserire un valore 
nel campo chiave primario che è uguale ad un altro valore nel campo. 
?? Avete inserito ripetutamente informazioni duplicate in una delle vostre tabelle? Se è così, 
probabilmente avrete bisogno di dividere la tabella in due tabelle legate da una relazione 
uno-a-molti. 
?? Avete delle tabelle con molti campi, un numero limitato di record e molti campi vuoti in 
ogni record? Sarebbe meglio ricreare la tabella con meno campi e più record. 
 
Una volta identificati i cambiamenti da effettuare, potrete modificare le tabelle e i campi per 
rispettare i miglioramenti apportati al progetto. Per informazioni riguardanti la modifica delle 
tabelle vedere il capitolo 7, Lavorare con le tabelle. 
 
Esempio: perfezionare la tabella Prodotti 
 
Ogni prodotto della scorta della Tasmanian Traders appartiene ad una categoria, come Bevande, 
Condimenti o Frutti di mare. La tabella Prodotti potrebbe includere un campo che mostra la 
categoria di ogni prodotto. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
106
 
Tabella Prodotti con il campo Category_name 
 
 
 
Supponete che esaminando e perfezionando il database Tasmanian Traders decidiate di conservare 
una descrizione della categoria insieme al suo nome. Se aggiungete il campo Descrizione categoria 
alla tabella prodotti, ripeterete ogni descrizione di categoria per ogni prodotto che appartiene a 
quelle categoria –non è una buona soluzione. 
 
Una soluzione migliore è rendere Categoria un nuovo soggetto da controllare per il database con la 
sua tabella e la sua chiave primaria. Poi potrete aggiungere la chiave primaria dalla tabella 
Categoria alla tabella Prodotti come chiave esterna. 
 
La tabella Categoria fornisce una posizione dove conservare efficientemente le informazioni 
riguardanti la categoria. 
 
 
Le tabelle Categoria e prodotti hanno una relazione uno-a-molti: una categoria può avere più di un 
prodotto collegato ad essa, ma ogni prodotto può appartenere ad una sola categoria. 
 
Diagramma del Modello di Database 
 
Il diagramma del database in questa sezione potrebbe darvi un’idea per il progetto del vostro 
database. Questi database non sono inclusi in Visual Fox Pro, sono stati messi qui come esempi di 
tipi di database e tabelle che potete creare. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
107
 
Database di Appuntamenti 
 
Questa struttura di database memorizza gli appuntamenti per un ufficio professionale e può 
facilmente essere modificato per l’utilizzo in uno studio medico, dentistico, di un avvocato, o di un 
ragioniere. La tabella appuntamenti ha un campo-multiplo chiave primaria per identificare 
univocamente ogni appuntamento. Questa chiave primaria, l’indice “client_sta” è stato creato 
indicizzando una espressione che unisce i campi client_id e date_start_time. 
 
Esempio di un database appuntamenti 
 
 
 
Database del personale 
 
Questa struttura di database immagazzina informazioni riguardanti le risorse umane. La tabella Job 
History memorizza i dati riguardanti il salario o le promozioni, così essa potrà contenere molti 
record per ogni impiegato. 
 
Esempio di database del personale 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
108
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
109
 
Database per una libreria 
 
Questo database immagazzina dati riguardo ai libri di una libreria e al prestito ai lettori. Osservate 
la relazione molti-a-molti tra le tabelle Libri ed Autori e tra le tabelle Libri e Soggetti. 
 
Esempio di database per una libreria 
 
 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
110
Capitolo 6: Creazione di un database 
Traduzione di Annibale Freda 
Dopo aver progettato il database, è possibile generare lo stesso attraverso l’interfaccia o il 
linguaggio. E’ possibile aggiungere tabelle esistenti al proprio database, e poi modificarle per poter 
usufruire dei vantaggi caratterizzanti il Data Dictionary ( una tabella contenente le informazioni di 
tutte le tabelle in un database ) in Visual FoxPro. Se si lavora con un progetto nel Project Manager, 
si può direttamente aggiungere o creare tabelle. 
Per maggiori informazioni sulla creazione di un database per ambiente multiutente, vedi il capitolo 
17.: 
?? Creazione di un Database 
?? Visualizzare e modificare una struttura Database 
?? Amministrare un Database 
?? Relazionare Multipli Database 
?? Trattamento errori Database 
Creare un Database 
Quando si crea un database, si raccolgono insieme le tabelle in un gruppo guadagnando dei benefici 
del data dictionary. 
Un data dictionary fornisce una grande flessibilità nella progettazione e modifica del database e 
libera dalla scrittura di codice nella creazione di criteri di validità a livello di campo o di record 
assicurando l’unicità dei valori nell’utilizzo di chiavi indici primarie. Il data dictionary di Visual 
FoxPro permette di creare o stabilire: 
?? Chiavi primarie e candidate 
?? Relazioni permanenti tra tabelle database. 
?? Nomi lunghi per tabelle e campi 
?? Intestazioni dei campi quando vengono visualizzati in finestre di Browser e nel controllo 
Griglia. 
?? Valori predefiniti nei campi. 
?? Predefinire le control class usate nelle maschere (forms). 
?? Maschere di inserimento e visualizzazione del formato dei campi. 
?? Regole di campo e Regole di record 
?? Attivatori (trigger) 
?? Procedure memorizzate (stored procedure). 
?? Connessioni a dati remoti. 
?? Viste Locali e remote. 
?? Commenti per ogni campo, tabella e database. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
111
Alcune caratteristiche del dizionario dati, come i nomi lunghi dei campi, gli indici primari e 
candidati, i valori iniziali, criteri di validità di campo e di record, e gli attivatori, sono memorizzati 
nel file .dbc a seguito del processo di costruzione di una tabella o di una vista. Per informazioni su 
queste caratteristiche, vedere il Capitolo 7, Lavorare con le Tabelle, e il Capitolo 8, Creazione delle 
Viste. 
Raccogliere le Tabelle in un Database. 
Per raccogliere le tabelle in un database, è necessario creare un contenitore database per mantenere 
uniti tutti gli oggetti come viste, connessioni, e procedure memorizzate associate con le tabelle che 
compongono il database. 
Creare un nuovo database 
?? Nel Gestore dei progetti, selezionare l’etichetta Data, poi selezionare Databases dalla lista 
e scegliere New. 
- oppure - 
?? Utilizzare il comando CREATE DATABASE . 
Per esempio, il seguente codice crea e apre esclusivamente un nuovo database chiamato Sample: 
CREATE DATABASE Sample 
Quando si crea un nuovo database, lo stesso è vuoto, e non contiene nessuna tabella associata o altri 
oggetti al suo interno. Aggiungendo una tabella si crea un collegamento tra la tabella e il 
contenitore database. Le informazioni della tabella collegata sono memorizzate nel database. 
Questo tipo di informazioni sono denominate backlink. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
112
I collegamenti specificano le relazioni fra un contenitore database e le tabelle. 
 
In programmazione è possibile usare i seguenti comandi e funzioni per poter lavorare con un 
database. 
Comandi e funzioni che gestiscono i database e gli oggetti database. 
ADATABASES( ) CREATE VIEW MODIFY CONNECTION 
ADBOBJECTS( ) DBC( ) MODIFY DATABASE 
ADD TABLE DBGETPROP( ) MODIFY PROCEDURE 
ALTER TABLE DBSETPROP( ) MODIFYSTRUCTURE 
APPEND PROCEDURES DELETE CONNECTION MODIFY VIEW 
CLOSE DATABASE DELETE DATABASE OPEN DATABASE 
COPY PROCEDURES DELETE VIEW PACK DATABASE 
CREATE CONNECTION DISPLAY DATABASE RENAME TABLE 
CREATE DATABASE DROP TABLE REMOVE TABLE 
CREATE SQL VIEW INDBC( ) SET DATABASE 
CREATE TABLE LIST DATABASE VALIDATE DATABASE 
 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
113
Aggiungere Tabelle a un Database 
 
Ogni tabella di Visual Fox Pro può avere due caratteristiche: la prima è quella di essere usata come 
tabella libera, cioè un file .dbf non associato a nessun database, oppure come una tabella 
database, cioè un file .dbf associato ad un database. Le tabelle associate con un database possono 
avere proprietà che le tabelle libere non hanno, come Regole di campo e Regole di record , 
attivazioni, e relazioni permanenti. 
Si possono associare le tabelle con un database creandole quando il database è aperto oppure 
aggiungendole a tabelle già esistenti nel database. Per informazioni sulla creazione di nuove tabelle, 
vedere il Capitolo 7, Uso delle Tabelle. 
 
Aggiungere una tabella libera ad un database 
?? Nel Gestore di Progetti, selezionare Tables dall’etichetta All oppure da quella Data , poi 
scegliere Add. 
- oppure - 
?? Utilizzare il commando ADD TABLE. 
 
Per esempio, il successivo codice apre il database testdata e aggiunge la tabella orditems: 
OPEN DATABASE testdata 
ADD TABLE orditems 
 
 
E’ necessario aggiungere esplicitamente una tabella libera ad un database per far si che la tabella sia 
contenuta nel database. La modifica della struttura di una tabella libera non provocherà l’aggiunta 
della stessa ad un database, anche se un database è aperto quando si attiva il comando MODIFY 
STRUCTURE relativo alla tabella libera in uso. 
Usare le Tabelle Libere 
Si può associare una tabella ad un solo database. Tuttavia, si possono usare i dati contenuti in un file 
.dbf esistente senza incorporarlo all’interno del database. 
Accedere ad una tabella contenuta in un altro database. 
?? Creare una vista nel database con riferimento alla tabella. 
- oppure - 
?? Aprire la tabella con il commando USE ed il simbolo “!” 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
114
Si può usare il simbolo “!” per riferirsi ad una tabella presente in un altro database. Per esempio, se 
si vuole visualizzare la tabella orditems nel database testdata , è possibile digitare: 
USE testdata!orditems 
BROWSE 
Nel precedente esempio, il database testdata viene aperto automaticamente quando si esegue il 
comando USE, ma Visual FoxPro non imposta testdata come corrente database. Un database 
aperto automaticamente, come ne l precedente esempio, è automaticamente chiuso quando la tabella 
è chiusa, a meno che non si apra esplicitamente il database prima di chiudere la tabella. 
Per informazioni circa l’uso di una vista per accedere alle informazioni esternamente al database in 
uso, vedere il Capitolo 8, Creazione delle Viste. 
Rimuovere una Tabella da un Database 
Quando si aggiunge una tabella ad un database, Visual Fox Pro modifica il record di intestazione 
del file nella tabella per indicare il percorso ed il nome di file al database che ora è collegato alla 
tabella stessa. 
Le informazioni sul percorso e sul nome del file vengono denominate backlink, collegamento al 
database, in quanto collegano la tabella al relativo database. Il processo di rimozione di una tabella 
da un databse non solo rimuove la tabella e le informazioni associate nel data dictionary del file 
database, ma aggiorna le informazioni del record di testata della tabella al nuovo stato di tabella 
libera. 
Si può rimuovere una tabella da un database attraverso l’interfaccia o con il comando REMOVE 
TABLE . Oltre alla rimozione della tabella dal database è possibile rimuovere fisicamente la tabella 
dal disco cancellandola. 
Rimuovere una tabella da un database 
?? Nel Gestore di Progetti, selezionare il nome della tabella, poi scegliere Remove. 
- oppure - 
?? Dal Database Designer, selezionare la tabella e scegliere Remove dal menù Database. 
- oppure - 
?? Usare il comando REMOVE TABLE . 
Per esempio, il seguente codice apre il database testdata e rimuove la tabella orditems : 
OPEN DATABASE testdata 
REMOVE TABLE orditems 
 
Rimuovendo una tabella da un database la stessa non viene automaticamente cancellata dal disco. 
Se si desidera rimuovere la tabella dal database che eliminarla dal disco, bisogna usare la clausola 
DELETE del comando REMOVE TABLE oppure il comando DROP TABLE . Per esempio, il 
seguente codice apre il database testdata e cancella la tabella orditems dal disco: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
115
OPEN DATABASE testdata 
REMOVE TABLE orditems DELETE 
Il seguente codice apre il database testdata, poi cancella la tabella orditems senza spostare una 
copia della stessa nel Cestino di Windows: 
OPEN DATABASE testdata 
DROP TABLE orditems NORECYCLE 
 
 
Aggiornare Tabelle e Collegamenti al Database 
Se si effettua lo spostamento di un file database (.dbc, .dct, e .dcx), oppure di una tabella associata 
con un database, il relativo percorso cambia interrompendo il backlink e i relativi collegamenti che 
Visual FoxPro usa per associare database e tabelle: 
?? Il backlink collega la tabella al corrispondente database. Esso è composto del relativo 
percorso e nome di file del .dbc associato con la tabella, ed è memorizzato nella testata del 
file tabella di Visual FoxPro ( .dbf) . 
?? Il forward link distingue il database alla quale la tabella è collegata. I Forward links sono 
memorizzati nel file database ( .dbc ) , e consistono nell’indicazione del percorso e del nome 
di file per ogni file tabella associata. 
?? Si può ristabilire il collegamento e aggiornare le informazioni del relativo percorso per 
considerare la nuova locazione del file. 
?? Aggiornare i collegamenti dopo lo spostamento di una tabella o di un database. 
?? Usare la clausola RECOVER nel comando VALIDATE DATABASE . 
Per esempio il seguente codice apre il database testdata e visualizza la casella di dialogo che 
permette di individuare le tabelle che non sono nelle posizioni incluse nel database: 
OPEN DATABASE testdata 
VALIDATE DATABASE RECOVER 
Tip Se si vuole usare una tabella senza dover ristabilire i collegamenti per tutte le tabelle nel 
database, si può aprire la tabella con il comando USE Visual FoxPro visualizza la Open dialog box 
che permette di individuare il relativo database o cancellare i collegamenti. 
Per informazioni sulla rimozione del backlink di una tabella collegata ad un database cancellato 
accidentalmente dal disco, vedere TABELLE LIBERE. 
Creare Relazioni Permanenti 
Si possono creare relazioni permanenti fra le tabelle di un database. Le relazioni permanenti sono 
relazioni tra tabelle che sono memorizzate nel file database e sono: 
?? Automaticamente usate come condizioni predefinite nelle Query and View Designers. 
?? Visualizzate nel Database Designer come linee di connessione agli indici delle tabelle. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
116
?? Visualizzate nel Data Environment Designer come relazioni predefinite per forms e reports. 
?? Usate per memorizzare informazioni relative all’ integrità referenziale. 
A Differenza delle relazioni temporanee create con il comando SET RELATION , le relazioni 
permanenti non hanno bisogno di essere ricreate ogni volta che si usano le tabelle. Tuttavia, poiché 
le relazioni permanenti non controllano le relazioni fra i record nelle tabelle, si potrà usare 
contemporaneamente sia la relazione temporanea ( SET RELATION ) sia la relazione permanente 
quando si sviluppano applicazioniVisual FoxPro. 
In Visual FoxPro, si possono usare gli indici per stabilire relazioni permanenti fra tabelle in un 
database. E’ possibile creare una relazione permanente fra indici piuttosto che fra campi, in quanto 
è possibile mettere in relazione tabelle basate su espressioni semplici o complesse. 
Creare una relazione permanente fra tabelle 
?? Nel Database Designer, scegliere il nome del file indice che si vuole mettere in relazione, 
poi trascinarlo sul nome del file indice della tabella da relazionare. 
-oppure- 
?? Usare la clausola FOREIGN KEY con il comando CREATE TABLE oppure con il 
comando ALTER TABLE. 
Per esempio, il seguente comando aggiunge una relazione permanente uno a molti tra la tabella 
customer e la tabella orders, basata sulla chiave G cust_id nella tabella customer, e una nuova 
chiave esterna, cust_id, nella tabella orders : 
ALTER TABLE orders; 
 ADD FOREIGN KEY cust_id TAG ; 
 cust_id REFERENCES customer 
Se poi si esaminerà lo schema del database nel Database Designer, si vedrà una linea di 
congiunzione fra orders e customer, rappresentante la nuova relazione permanente. 
Gli indici impongono le basi per le relazioni permanenti 
 
Il tipo di indice determina il tipo di relazione permanente che si può creare. Si può usare una 
chiave indice primaria o candidata per ‘uno’ dei lati di una relazione uno a molti, mentre per il 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
117
lato ‘molti’ si può usare una chiave indice regolare . Per maggiori informazioni sui tipi di indice e 
lal creazione degli indici, vedere il Capitolo 7, Uso delle Tabelle. 
Cancellare una relazione permanente fra le tabelle. 
1. Nel Database Designer, cliccare sulla linea fra le due tabelle. 
La linea diventerà più grande per indicare che si è selezionata una relazione. 
2. Premere il tasto DELETE o CANC 
-oppure- 
Usare la calusola DROP FOREIGN KEY con il comando ALTER TABLE . 
Per esempio il seguente comando cancella una relazione permanente fra la tabella customer e la 
tabella orders, basata sulla chiave primaria cust_id nella tabella customer, e una chiave esterna, 
cust_id, nella tabella orders: 
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
118
 
Generazione dell’Integrità Referenziale 
Stabilire l’integrità referenziale impegna a costruire una serie di regole per proteggere le relazioni 
definite fra le tabelle quando si inseriscono o cancellano records. 
Se si applica l’integrità referenziale, Visual FoxPro impedisce di: 
?? Aggiungere records a una tabella relazionata quando non ci sono record associati nella 
tabella primaria. 
?? Modificare valori in una tabella primaria che potrebbe successivamente risultare priva di 
records nella tabella relazionata. 
?? Cancellare record da una tabella primaria quando vi sono records nella tabella relazionata. 
Si può scegliere di scrivere propri attivatori (trigger) e codice di Procedure Memorizzate (stored 
procedure) per rispettare l’integrità referenziale. Tuttavia, il Referential Integrity (RI) Builder 
permette di determinare le regole da rispettare, le tabelle sulla quale si vuole che le regole siano 
rispettate, e gli eventi di sistema che costringeranno Visual FoxPro a controllare le righe di integrità 
referenziale. 
Il sistema RI Builder a livelli multipli gestisce cancellazioni ed aggiornamenti a più livelli ed è 
raccomandato come strumento per la generazione dell’integrità referenziale. 
Aprire il Generatore di Integrità Referenziale 
1. Aprire il Database Designer. 
2. Dal Menù Database, scegliere Referential Integrity. 
Quando si usa il Generatore di Integrità Referenziale per costruire le regole del database, Visual 
FoxPro genera codice per imporre le regole dell’integrità relazionale, il codice viene salvato come 
trigger che fa riferimento a stored procedure. E’ possibile visualizzare il codice aprendo nel 
database l’editor di testo delle procedure memorizzate. Per informazioni sulla creazione della 
programmazione delle attivazioni, vedere “Uso delle Attivazioni” nel Capitolo 7, Uso delle Tabelle. 
Attenzione Quando si modifica un database, modificando le tabelle del database stesso o 
modificando gli indici usati in relazione permanente, è necessario rilanciare il Generatore di 
Integrità Referenziale prima di usare il database. Ripetendo l’operazione descritta il Generatore di 
Integrità Referenziale modifica le procedure memorizzate il codice ed i triger delle tabelle usate per 
rispettare l’integrità referenziale affinché essi possano aggiornare la nuova situazione. Se non si 
riavvia il Generatore di Integrità Referenziale si potrebbero avere risultati inattesi, perché le 
procedure memorizzate ed i trigger non sono aggiornati alle nuove modifiche. 
Creazione di Procedure Memorizzate 
E’ possibile creare procedure memorizzate per le tabelle contenute nel database. Una procedura 
memorizzata (Stored Procedure) è del codice scritto in Visual Fox Pro e memorizzato nel file .dbc. 
Le procedure memorizzate sono righe di codice che operano specificatamente sui dati del database. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
119
Memorizzare le procedure può migliorare le prestazioni perchè esse sono caricate nella memoria 
quando il database è aperto. 
Creare, modificare, o rimuovere una procedura memorizzata 
?? Nel Project Manager, selezionare un database e scegliere Stored Procedures, poi 
selezionare New, Modify, o Remove. 
-oppure- 
?? Nel Database Designer, scegliere Edit Stored Procedures dal menu Database. 
-oppure- 
?? Nella finestra Command, usare il comando MODIFY PROCEDURE. 
Ognuna di queste opzioni apre l’editor di testi di Visual Fox Pro, per permettere di poter creare, 
modificare, o cancellare le procedure memorizzate nel corrente database. 
Si possono usare le procedure memorizzate per creare funzioni definite dall’utente alle quali viene 
fanno riferimento nelle regole di convalida a livello di campi- e di record. Quando si salva una 
funzione personalizzata com una procedura memorizzata nel database, il codice per la funzione è 
salvato nel file .dbc e automaticamente segue il database anche se lo stesso cambia percorso di 
allocazione. Usando le procedure memorizzate costruite nell’applicazione rende la stessa più 
trasportabile non dovendo gestire le funzioni personalizzate separatamente dal database. 
Visualizzazione e impostazione proprietà Ambiente Database 
Ogni database di Visual Fox Pro contiene le proprietà Version e Comment. Si può visualizzare e 
mettere a punto queste proprietà con le funzioni DBGETPROP( ) e DBSETPROP( ) . 
Per esempio, il seguente codice visualizza il numero di versione del database testdata : 
? DBGETPROP('testdata', 'database', 'version') 
Il valore restituito rappresenta il numero di versione di un file .dbc di Visual Fox Pro, ed è un valore 
di sola lettura. Usando la stessa funzione, si può visualizzare il commento, nel caso ne esistesse uno, 
per il database: 
? DBGETPROP('testdata', 'database', 'comment') 
A differenza della proprietà Version, la proprietà Comment può essere assegnata. Si può usare la 
funzione DBSETPROP( ) e digitare una descrizione o altro testo che si vuole memorizzare con il 
database. 
Assegnare la proprietà commento al database corrente 
?? Nel Database Designer, scegliere Properties dal menù Database e digitare un commento 
nel riquadro Comment 
-oppure- 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
120
?? Usare l’opzione comment della funzione DBSETPROP( ). 
Per esempio, il seguente codice modifica il commento per il database testdata : 
? DBSETPROP('testdata', 'database', 'comment', ; 
 'TestData is included withVisual FoxPro') 
Si possono anche usare le funzioni DBGETPROP( ) e DBSETPROP( ) e visualizzare e mettere a 
punto le proprietà su altri oggetti del database come connessioni (connections) e viste (views). 
Visualizzare e Modificare l’Architettura di un Database 
Quando si crea un database, Visual FoxPro crea e apre esclusivamente un file .dbc (DataBase 
Container). Il file .dbc memorizza tutte le informazioni sul database, inclusi i nomi dei file e gli 
oggetti associati con esso. Il file .dbc non contiene fisicamente oggetti principali come tabelle o 
campi. Più propriamente, Visual FoxPro memorizza il percorso dei file tabella nel file .dbc. 
Per esaminare l’architettura del database, è possibile effettuare lo scorrimento (browse) del file 
database, visualizzare lo schema, visualizzare gli oggetti del database, validare il database, e persino 
estendere il file .dbc. 
 
Visualizzare lo Schema del Database 
Lo schema del database è una rappresentazione visuale della struttura della tabella e delle relazioni 
persistenti stabilite nel database. La finestra del Database Designer visualizza lo schema del 
database aperto. 
Visualizzare lo schema del database 
?? Usare il comando MODIFY DATABASE . 
Per esempio, il seguente codice apre il database testdata e visualizza lo schema nel Database 
Designer: 
MODIFY DATABASE testdata 
Uno schema del database è una rappresentazione degli oggetti presenti in un database. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
121
 
Dal Database Designer, si può usare la barra degli strumenti del Database per creare una nuova 
tabella, aggiungere una tabella esistente al database, rimuovere una tabella dal database, o 
modificare la struttura di una tabella. Puoi anche creare connessioni e modificare le procedure 
memorizzate. 
Visualizzare il File Database 
Il file database contiene un record per ogni tabella, vista, indice, tag indice, relazioni permanenti, e 
connessioni associati al database, così come per ogni campo della tabella o della vista si avranno 
proprietà estese. E’ incluso anche un singolo record che contiene le procedure memorizzate per il 
database. 
Per informazioni circa la struttura del file .dbc, vedere Struttura File Tabella. 
Mentre il Database Designer provvede ad una concettuale rappresentazione dello schema del 
database, a volte si potrebbe avere bisogno di effettuare la visualizzazione di ciò che è contenuto nel 
database. E’ possibile visualizzare un database chiuso eseguendo il comando USE sul file .dbc. Il 
seguente esempio apre una finestra Browse visualizzando il contenuto del database sales in 
formato tabella. 
CLOSE DATABASE sales 
USE sales.dbc EXCLUSIVE 
BROWSE 
Attenzione Non usare il commando BROWSE per alterare il file database a meno che non si 
conosca perfettamente la struttura del file .dbc. Se si compie un errore mentre si prova a modificare 
il file .dbc si può invalidare il database e potenzialmente perdere i dati. 
Estendere i File Database 
Ogni file .dbc contiene un campo Memo denominato User che è possibile usare per memorizzare le 
proprie informazioni circa ogni record incluso nel database. E’ possibile anche estendere un file 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
122
.dbc aggiungendo campi per favorire le necessità di programmazione. I campi possono essere 
aggiunti alla fine della struttura. Si deve avere accesso esclusivo a un file .dbc per poterne 
modificare la sua struttura. 
Aggiungere un campo a un file .dbc 
1. Aprire il file .dbc per uso esclusivo con il comando USE . 
2. Usare il commando MODIFY STRUCTURE . 
Per esempio, il seguente codice apre il Table Designer così è possibile aggiungere un campo alla 
struttura di Testdata.dbc: 
USE TESTDATA.DBC EXCLUSIVE 
MODIFY STRUCTURE 
Quando si aggiunge un nuovo campo a un file database, il nome del campo inizia con “U” per 
indicarlo come un campo definito dall’Utente. Questa assegnazione protegge il campo da conflitti 
con altre future estensioni del file .dbc. 
Attenzione Non cambiare le definizioni già esistenti dei campi di Visual Fox Pro nel file file .dbc. 
Ogni modifica eseguita su un file .dbc potrebbe influire sull’integrità del database. 
Convalidare un Database 
La convalida di un database assicura che le righe che lo compongono sono un’esatta 
rappresentazione dei meta-dati dello stesso . E’ possibile controllare l’integrità del corrente database 
con il comando VALIDATE DATABASE . 
Convalidare un database 
?? Usare il comando VALIDATE DATABASE . 
Per esempio, il seguente codice usa e convalida il file .dbc per il database testdata : 
OPEN DATABASE testdata EXCLUSIVE 
VALIDATE DATABASE 
Amministrare un Database 
Dopo la creazione di un database, è possibile che si voglia aggiungere lo stesso ad un progetto nel 
caso non ne facesse già parte. Se invece il database è parte di un progetto, è possibile rimuoverlo 
dallo stesso. Inoltre, se il database non è più necessario per i propri scopi, è possibile cancellarlo dal 
disco fisso. 
Un database nel Gestore di Progetti 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
123
 
Aggiungere un Database a un Progetto 
Quando si crea un database con il comando CREATE DATABASE , il database non è inserito 
automaticamente nel progetto, anche se il Project Manager è aperto. E’ possibile aggiungere il 
database ad un progetto per facilitarne la sua gestione, visualizzarlo e manipolare gli oggetti del 
database attraverso l’interfaccia, come pure per semplificare il processo di costruzione di 
un’applicazione. E’ possibile aggiungere un database a un progetto solamente attraverso il Project 
Manager. 
Aggiungere un database a un progetto 
?? Nel Project Manager, selezionare Databases e scegliere Add. 
Rimuovere un Database da un Progetto 
E’ possibile rimuovere un database da un progetto solamente attraverso il Project Manager. 
 
Rimuovere un database da un progetto 
?? Nel Project Manager, selezionare il database e scegliere Remove, e poi scegliere ancora 
Remove. 
Cancellare un Database 
E’ possibile cancellare un database da un disco usando il Project Manager o il comando DELETE 
DATABASE. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
124
Cancellare un database 
?? Nel Project Manager, selezionare il database e scegliere Remove, e poi scegliere Delete. 
-oppure- 
?? Usare il comando DELETE DATABASE . 
Per esempio, il seguente codice cancella il database sample: 
DELETE DATABASE sample 
Usare uno dei metodi sopradescritti per cancellare un database dal disco. Usando il Project 
Manager o il comando DELETE DATABASE si abilita Visual FoxPro a rimuovere i backlink, 
collegamenti, al database dalle tabelle di un database. Se si cancella un file database, così come il 
Windows Explorer, questi backlink non sono rimuovere. 
Nota Il comando DELETE DATABASE non cancella le tabelle associate con un database dal 
disco che invece diventano tabelle libere. Se si vogliono cancellare sia il database e tutte le relative 
tabelle associate dal disco, usare la clausola DELETETABLES con il comando DELETE 
DATABASE. 
Riferimento a più Database 
E’ possibile avere più database di Visual FoxPro sul proprio sistema per migliorare 
l’organizzazione in un ambiente multiutente. I database multipli offrono i seguenti vantaggi: 
?? Controllo dell’accesso utente a un sottosistema di tabelle contenute nel complessivo del 
sistema. 
?? Organizzare i dati efficientemente ed in modo appropriato le informazioni necessarie 
presenti nel proprio sistema informativo. 
?? Permettere l’uso esclusivo di un sottosistema di tabelle per creare viste locali e remote a 
run time. 
Per esempio, si potrebbe avere un database Vendite contenente le informazioni relative alleI seguenti comandi immettono due valori numerici all’interno di due variabili. In questo esempio, 
alle variabili sono stati assegnati nomi che iniziano con la lettera ‘n’, in maniera tale da capire 
immediatamente che il loro contenuto è di tipo numerico, anche se naturalmente è possibile 
definirle con qualsiasi combinazione di caratteri alfanumerici o caratteri di sottolineatura 
(underscore). 
nFirst = 123 
nSecond = 45 
In quest’altro caso, invece, vediamo come inserire all’interno di variabili dei valori di tipo carattere. 
Alle variabili sono stati assegnati nomi che iniziano con la lettera ‘c’, in maniera tale da capire 
immediatamente che il loro contenuto è di tipo carattere. 
cSecond = "45" 
Le seguenti due operazioni, addizione e concatenazione, forniranno risultati diversi, proprio a causa 
del diverso tipo di variabili utilizzate. 
? nFirst + nSecond 
? cFirst + cSecond 
Risultato 
168 
12345 
Dal momento che la variabile cFirst è di tipo carattere, mentre nSecond è di tipo numerico, 
otterremo un errore di tipo mismatch (accoppiamento non valido) se si tentasse la seguente 
operazione: 
? cFirst + nSecond 
E’ possibile aggirare questo problema utilizzando le funzioni di conversione. Per esempio, la 
funzione STR( ) convertirà in stringa di caratteri un dato numero, mentre la funzione VAL( ) 
restituirà il valore numerico equivalente ad una stringa di caratteri contenente numeri. Queste 
funzioni, insieme alla LTRIM( ), che rimuove tutti gli spazi a sinistra della stringa, permetteranno, 
ad esempio, di effettuare le seguenti operazioni: 
? cFirst + LTRIM(STR(nSecond)) 
? VAL(cFirst) + nSecond 
Risultato 
12345 
168 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
10
Utilizzo delle Funzioni 
Le funzioni restituiscono sempre un determinato tipo di dati. Ad esempio, le funzioni STR( ) e 
VAL( ), utilizzate negli esempi precedenti, restituiscono, rispettivamente, stringhe di caratteri e 
valori numerici. Come tutte le funzioni, le varie tipologie di dati restituiti verranno specificate di 
volta in volta. 
In Visual FoxPro, esistono cinque sistemi per chiamare una funzione: 
?? Assegnare il risultato della funzione ad una variabile. Ecco l’esempio con il quale assegnare 
la data di sistema ad una variabile chiamata dToday: 
 dToday = DATE( ) 
?? Includere la chiamata alla funzione in un comando Visual FoxPro. La seguente istruzione 
setta la directory di default in base al valore restituito dalla funzione GETDIR( ): 
 CD GETDIR( ) 
?? Stampare il valore restituito dalla funzione. La seguente linea di codice stampa l’ora di 
sistema all’interno della finestra attiva: 
 ? TIME( ) 
?? Chiamare la funzione senza memorizzarne il valore restituito da nessuna parte. Il seguente 
comando disabilita la visualizzazione del cursore: 
 SYS(2002) 
?? Includere la funzione all’interno di un’altra. Il seguente comando, ad esempio, stampa il 
giorno della settimana: 
 ? DOW(DATE( )) 
Alcuni altri esempi di funzioni utilizzate in questo capitolo sono: 
Funzione Descrizione 
ISDIGIT( ) Restituisce vero (.T.) se il primo carattere a sinistra di una stringa 
rappresenta un numero; in caso contrario, restituisce falso (.F.). 
FIELD( ) Restituisce il nome di un campo. 
LEN( ) Restituisce il numero di caratteri contenuti in una stringa. 
RECCOUNT( ) Restituisce il numero di records presenti all’interno della tabella attiva. 
SUBSTR( ) Estrae uno specifico numero di caratteri da una stringa, partendo da una 
determinata posizione. 
 
Utilizzare i comandi 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
11
Un comando provoca l’esecuzione di una determinata azione. Ogni comando ha una sintassi 
specifica che occorre rispettare affinché possa essere correttamente compiuta l’azione. Esistono, 
inoltre, delle proposizioni associate ai comandi che permettono di specificare con maggiore 
esattezza ciò che si vuole eseguire. 
Ad esempio, il comando USE, che permette di aprire e chiudere tabelle, può essere utilizzato in 
diverse maniere: 
Sintassi del comando 
USE 
Descrizione 
USE Chiude la tabella aperta nell’area di lavoro corrente. 
USE customer Apre la tabella CUSTOMER nell’area di lavoro corrente chiudendovi, 
contemporaneamente, ogni altra tabella aperta. 
USE customer IN 0 Apre la tabella CUSTOMER nella successiva area di lavoro disponibile. 
USE customer IN 0 
; 
 ALIAS mycust 
 
Apre la tabella CUSTOMER nella successiva area di lavoro disponibile 
ed assegna all’area l’alias mycust. 
 
Alcuni esempi di comandi mostrati in questo capitolo sono: 
Comando Descrizione 
DELETE Attiva il marcatore di cancellazione in uno specifico record all’interno di 
una tabella. 
REPLACE Sostituisce il valore di un record con uno nuovo. 
Go Posiziona il puntatore su uno specifico record all’interno di una tabella. 
 
Controllare il flusso di un programma 
Visual FoxPro include una speciale categoria di comandi che racchiudono “wrap around” altri 
comandi o funzioni, determinando quando e quante volte questi altri comandi e funzioni verranno 
eseguiti. Questi comandi permettono la scelta condizionale (conditional branching) ed i cicli 
(looping), due potentissimi strumenti di programmazione. Successivamente verranno mostrati 
programmi in grado di attivare scelte condizionali e cicli. 
Questi concetti sono descritti in maggior dettaglio nel seguente esempio. 
Supponiamo di avere 10,000 dipendenti e di volere aumentare lo stipendio del 6%, a quelli che 
guadagnano fino a $30,000 e del 3% a tutti gli altri. Nell’esempio seguente vediamo l’applicazione 
in grado di effettuare l’operazione. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
12
Questo programma parte dal presupposto di avere, nell’area corrente, una tabella aperta contenente 
un campo numerico chiamato salary. Per avere maggiori informazioni sull’utilizzo delle aree di 
lavoro si può consultare il paragrafio “Using Multiple Tables” del Capitolo 7, Working with Tables. 
Programma esemplificativo su come applicare un incremento di salario 
Codice Commenti 
SCAN Il codice che si trova tra SCAN ed ENDSCAN 
viene eseguito per ogni record presente in tabella. 
Dopo l’esecuzione del ogni blocco di codice che si 
trova tra SCAN ed ENDSCAN , il puntatore di 
record viene posizionato su record successivo. 
 IF salary >= 30000.00 
 REPLACE salary WITH ; 
 salary * 1.03 
Per ogni record, nel caso in cui il salario sia di un 
valore maggiore od uguale a 30,000, il valore 
stesso viene aumentato del 3%. Il punto e virgola 
(;) posto dopo l’istruzione WITH, sta ad indicare 
che il comando prosegue sulla riga successiva. 
 ELSE 
 REPLACE salary WITH ; 
 salary * 1.06 
Per ogni altro record il salario viene maggiorato 
del 6%. 
 ENDIF 
ENDSCAN 
 
Dichiarazione di fine della condizione (IF). 
Istruzione che termina la sequenza di codice da 
eseguire per ogni record presente in tabella. 
 
L’esempio di cui sopra utilizza sia la scelta condizionale (IF), sia il looping (SCAN…ENDSCAN) 
al fine di controllare il flusso del programma. 
Scelta Condizionale (Conditional Branching) 
La scelta condizionale permette di verificare delle condizioni e, in base ai risultati, eseguire 
differenti operazioni. Esistono due comandi in Visual Foxpro di effettuare questa operazione: 
?? IF ... ELSE ... ENDIF 
?? DO CASE ... ENDCASE 
Il codice che compare tra la prima istruzione (IF o CASE) e l’ultima (ENDIF o ENDCASE) verrà 
eseguito solo nel caso in cui la condizione logica risultante da tali istruzioni risulterà vera (.T.). 
Nell’esempio appena visto, l’istruzione IF viene utilizzata per distinguere due situazioni: quella in 
cui il salario sia uguale o maggiore a $ 30,000, e quella in cui il salario sia inferiore a $30,000. In 
base al verificarsi di una condizione o dell’altra, verranno eseguitevendite 
e che viene usato principalmente dal reparto vendite che lavora con i Clienti ed un altro database 
che contiene le informazioni relative al magazzino usate principalmente nel rapporto fra il Reparto 
Acquisti ed i Fornitori. A volte le informazioni di questi gruppi potrebbero essere sovrapposte. 
Questi database possono essere aperti contemporaneamente e accessibili a piacere ma essi 
contengono differenti tipi di informazione. 
 
 
 
I Database multipli aggiungono flessibilità al sistema 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
125
 
E’ possibile usare simultaneamente database multipli aprendo più di un database 
contemporaneamente o riferendosi alle tabelle collegate ad un database chiuso. Una volta che i 
database multipli sono aperti, è possibile scegliere il database corrente e selezionare le tabelle in 
esso contenute. 
Aprire più di un Database 
Quando un database è aperto, le tabelle e le relazioni fra le tabelle sono controllate nelle 
informazioni memorizzate nel database aperto. E’ possibile avere più di un database aperto 
contemporaneamente. Per esempio, è possibile usare database multipli aperti quando si lavora su 
più applicazioni, ognuna basata su un differente database. E’ possibile anche aprire database 
multipli per utilizzare informazioni, come ad esempio controlli personalizzati che sono memorizzati 
in database separati da quelli dell’applicazione corrente. 
Per aprire più di un database 
?? Nel Project Manager, selezionare un database e scegliere Modify oppure Open. 
-oppure- 
?? Usare il commando OPEN DATABASE 
Aprendo un nuovo database non si chiudono gli altri database che precedentemente erano stati 
aperti. Gli altri database rimangono aperti, e il database appena aperto diventa il database corrente. 
Assegnare il Corrente Database 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
126
Quando si aprono database multipli, Visual FoxPro predispone il database aperto per ultimo come il 
database corrente. Ogni tabella o altri oggetti che vengono creati o aggiunti al database diventano 
parte del corrente database per convenzione. I comandi e le funzioni che manipolano database 
aperti, come ADD TABLE e DBC( ), operano nel corrente database. 
E’ possibile scegliere un differente database come corrente database attraverso l’interfaccia o con il 
comando SET DATABASE. 
Per assegnare il corrente database 
?? Sulla barra degli strumenti standard, selezionare un database dal riquadro Databases. 
-oppure- 
?? Usare il comando SET DATABASE. 
Per esempio, il seguente codice apre tre database, assegnando il primo database come il corrente 
database, poi usa la funzione DBC( ) per visualizzare il nome del corrente database: 
OPEN DATABASE testdata 
OPEN DATABASE tastrade 
OPEN DATABASE sample 
SET DATABASE TO testdata 
? DBC( ) 
 
Tip Visual FoxPro può aprire uno o più database automaticamente quando si esegue una query o 
un form che richiedono che i database siano aperti. Per essere sicuri che si sta operando sul corretto 
database, assegnare esplicitamente il corrente database prima che vengano utilizzati comandi che 
operano sul corrente database. 
Selezionare Tabelle nel Corrente Database 
E’ possibile scegliere da una lista di tabelle presenti nel corrente database attraverso il comando 
USE. 
Scegliere una tabella dal corrente database 
?? Utilizzare il comando USE con il simbolo “?” 
Verrà visualizzato il box di dialogo del comando Use in modo da poter selezionare una 
tabella da aprire. 
Per esempio, il seguente codice apre il database sales e attende che venga selezionata una tabella 
dalla lista delle tabelle presenti nel database. 
OPEN DATABASE SALES 
USE ? 
Se si vuole selezionare una tabella che non è associata con il database aperto, è possibile scegliere 
Other nel box di dialogo del comando Use. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
127
Chiudere un Database 
E’ possibile chiudere un database aperto attraverso il Project Manager oppure con il comando 
CLOSE DATABASE. 
Per chiudere un database 
?? Dal Project Manager, selezionare il database e scegliere Close. 
-oppure- 
?? Usare il comando CLOSE DATABASE 
Per esempio, il seguente codice chiude il database testdata : 
SET DATABASE TO testdata 
CLOSE DATABASE 
Entrambi le opzioni chiudono il database automaticamente. E’ possibile anche chiudere i database e 
tutti gli altri oggetti aperti con la clausola ALL del comando CLOSE . 
Utilizzando il comando CLOSE DATABASE dalla finestra Command non viene chiuso un 
database se il database era stato aperto: 
?? Dal Project Manager quando viene estesa la struttura per visualizzare il contenuto di un 
database. 
?? Da un form che sta lavorando proprio in quella data session. 
In queste circostanze, il database rimane aperto fino a che il Project Manager non chiude il 
database, o fino a che il database in uso nel form non venga chiuso. 
 
Area di validità 
Visual FoxPro usa il corrente database come area di validità per l’identificazione di oggetti, come 
le tabelle. Quando un database è aperto, Visual FoxPro per prima cosacerca all’interno del database 
aperto la presenza dell’oggetto richiesto, come tabelle, viste, connessioni, e così via. Se l’oggetto 
non è nel database, Visual FoxPro guarda nel percorso di ricerca predefinito. 
Per esempio, se la tabella customer è associata con il database sales, Visual FoxPro vuole sempre 
la presenza della tabella customer nel database quando vengono utilizzati i seguenti comandi: 
OPEN DATABASE SALES 
ADD TABLE F:\SOURCE\CUSTOMER.DBF 
USE CUSTOMER 
Se invece si utilizza il seguente comando, Visual FoxPro guarderà prima nel corrente database per 
la tabella products. 
USE PRODUCTS 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
128
Se products non è nel corrente database, Visual FoxPro ricercherà esternamente al database, 
usando il percorso di ricerca predefinito. 
Nota E’ possible specificare l’esatto percorso per una tabella se si vuole essere in grado di 
accedere all’interno o all’esterno di un database come, per esempio, nel caso si preveda un 
cambiamento nella locazione di una tabella. Comunque è possibile aumentare la prestazione 
indicando il solo nome della tabella, perché Visual FoxPro accede ai nomi delle tabelle nel database 
più velocemente indicando il solo nome della tabella che non specificando l’intero percorso. 
Trattamento degli Errori dei Database 
Gli errori dei Database, anche chiamati “engine errors,” avvengono nel momento in cui gli errori di 
run-time sono presenti nel codice contenuto a livello di record. Per esempio, un errore del database 
può avvenire quanto un Utente tenta di memorizzare un valore null in un campo che non accetta 
valori null. 
Quando avviene un errore in un database, la parte del database che rileva l’errore visualizza un 
messaggio di errore. Comunque, l’esatta natura del messaggio di errore dipende dal database al 
quale si sta accedendo. Per esempio, i messaggi di errore prodotti da un database remoto ( come 
Microsoft SQL Server) sarà probabilmente differente da quello prodotto se l’errore del database 
avviene in una tabella locale di Visual FoxPro. 
Inoltre, il livello degli errori è spesso generico, perché il gestore interno del database non ha 
informazioni riguardo al record che si sta aggiornando Di conseguenza, i messaggi di errore 
prodotti dal gestore interno del database sono spesso poco utili all’Utente finale di un’applicazione 
di Visual Fox Pro. 
Per curare gli errori dei database più specificatamente, è possibile creare attivazioni usando il 
comando CREATE TRIGGER. L’attivazione viene chiamata quando si tenta di aggiornare un 
record ( cancellazione, inserimento, modifica). Il codice personalizzatonell’attivazione può cercare 
una specifica condizione di errore per l’applicazione e relazionare su questa. 
Se si sta usando il proprio sistema di attivazione degli errori del database, dovrebbe essere attivo il 
buffering. In questo modo, quando un record è aggiornato la propria attivazione viene chiamata, ma 
il record non è immediatamente inviato al corrispondente database. Perciò si evita la possibilità di 
produrre due messaggi di errore: uno proveniente dall’attivazione e l’altro dal gestore interno del 
database. 
Come creare messaggi di errore personalizzati usando le attivazioni 
1. All’interno di una procedura definita dall’utente o nelle procedure memorizzare, scrivendo 
un proprio messaggio di testo personalizzato. 
2. Abilitando il buffering con la funzione CURSORSETPROP( ) per visualizzare il proprio 
personale testo. Se il buffering è off, l’utente vedrà sia il messaggio personalizzato che 
quello proveniente dal gestore interno dei messaggi di errore. 
	Introduzione alla programmazione
	Il meccanismo di programmazione di Visual FoxPro
	I concetti di base della programmazione
	Il processo di programmazione
	L’utilizzo delle Procedure e delle funzioni utente
	Sviluppare un’ applicazione
	Programmazione Object-Oriented
	Capire il modello a eventi
	Progettare i Database
	Creazione di un databasediverse operazioni.. 
Nell’esempio seguente, nel caso in cui il valore memorizzato nella variabile nWaterTemp sia 
inferiore a 100, non verrà eseguita alcuna operazione: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
13
* imposta una variabile logica a vero (.T.), nel caso in cui sia soddisfatta una 
* condizione (if). 
 
IF nWaterTemp >= 100 
 lBoiling = .T. 
ENDIF 
Nota L’asterisco posto all’inizio di una riga di programma indica che si tratta di un commento. Le 
righe di commento aiutano il programmatore a ricordare lo scopo di un determinato segmento di 
programma e sono completamente ignorate da Visual FoxPro. 
Nel caso in cui ci si trovi a dover valutare diverse possibilità di scelta, l’utilizzo del comando DO 
CASE ... ENDCASE può risultare più efficiente e semplice da verificare rispetto alla 
implementazione di molte istruzioni di tipo IF. 
I Cicli (Looping) 
Il Looping permette di eseguire una o più linee di codice in maniera ricorsiva. Esistono tre comandi 
in Visual FoxPro che permettono questo: 
?? SCAN ... ENDSCAN 
?? FOR ... ENDFOR 
?? DO WHILE ... ENDDO 
SCAN viene utilizzato nel caso in cui si debbano eseguire una serie di operazione per ogni record 
presente in una tabella, come nell’esempio appena descritto. Il ciclo di SCAN permette di scrivere 
del codice che verrà eseguito per ogni record, spostando ogni volta il puntatore del record in avanti 
di una posizione all’interno della tabella. 
E’ possibile utilizzare, invece, l’istruzione FOR nei casi in cui si sappia già quante volte è 
necessario eseguire un determinato blocco di istruzioni. Per esempio, nel caso in cui si sappia a 
priori quanti campi sono presenti in una determinata tabella. Siccome in Visual FoxPro la funzione 
FCOUNT( ) restituisce proprio questo valore, sarà possibile utilizzare un ciclo di tipo FOR per, ad 
esempio, stampare i nomi di tutti i campi presenti in una tabella: 
FOR nCnt = 1 TO FCOUNT( ) 
 ? FIELD(nCnt) 
ENDFOR 
Il DO WHILE, invece, è utilizzato nelle situazioni in cui si voglia eseguire una porzione di codice 
per tutto il periodo in cui venga rispettata una determinata condizione. Può darsi che non si sappia 
affatto quante volte verrà eseguito il codice, si deve solo decidere quando terminarne l’esecuzione. 
Per esempio, ammettiamo di avere una tabella contenente nomi ed iniziali di alcune persone e di 
avere la necessità di cercare un determinato nominativo attraverso le iniziali. 
La prima volta che ci troveremmo di fronte alla necessità di inserire il nominativo di una persona 
che ha le stesse iniziali di una già presente in tabella … inizieremmo ad avere i primi problemi. 
Per toglierci d’impaccio potremmo decidere di aggiungere un numero alle iniziali. Per esempio, il 
codice identificativo di Michael Suyama potrebbe essere MS. La prima persona con le stesse 
iniziali, Margaret Sun, potrebbe essere identificata con il codice MS1. Quando andremo ad 
aggiungere Michelle Smith alla tabella, il suo codice identificativo dovrebbe essere MS2. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
14
Un ciclo DO WHILE ci permetterà di trovare il giusto numero da aggiungere alle iniziali. 
Esempio di programma in grado di generare un identificativo univoco utilizzando un ciclo DO 
WHILE 
Codice Commenti 
NHere = RECNO() Salva il numero di record. 
cInitials = LEFT(firstname,1) + ; 
 LEFT(lastname,1) 
nSuffix = 0 
 
Desume le iniziali della persona in base alla prima 
lettera dei campi firstname e lastname. 
Crea una variabile dove memorizzare il numero da 
aggiungere alle iniziali, se necessario. 
LOCATE FOR person_id = cInitials Verifica se in tabella esistono altre persone con le 
stesse iniziali. 
DO WHILE FOUND( ) Nel cao in cui venga trovato un altro record 
contenente un person_id uguale al valore 
memorizzato in cInitials, la funzione 
FOUND( ) restituirà il valore vero (.T.) e verrà 
eseguito il codice contenuto all’interno del ciclo 
DO WHILE. In caso contrario la riga di codice 
eseguita sarà la prima presente dopo l’istruzione 
ENDDO. 
 nSuffix = nSuffix + 1 
 cInitials = ; 
 LEFT(cInitials,2); 
 + ALLTRIM(STR(nSuffix)) 
Prepara un nuovo suffisso e lo inserisce in coda 
alle iniziali. 
 CONTINUE CONTINUE riesegue l’ultimo comando 
LOCATE ed il programma verificherà 
nuovamente la presenza del valore contenuto in 
cInitials (appena calcolato) nel campo 
person_id di un altro record. In caso positivo, 
FOUND( ) riporterà un valore vero (.T.) e verrà 
eseguito nuovamente il codice presente all’interno 
del ciclo DO WHILE; in caso contrario FOUND( ) 
riporterà un valore falso(.F.) ed il programma 
potrà procedere nella esecuzione della riga 
successiva all’istruzione ENDDO. 
ENDDO Fine del ciclo DO WHILE. 
GOTO nHere 
REPLACE person_id WITH cInitials 
Torna al numero di record (memorizzato all’inizio 
del programma) e registra il codice identificativo 
univoco nel campo person_id. 
 
Ecco come, non sapendo a priori quante volte troveremo in tabella la corrispondenza ad un 
determinato valore, sia necessario utilizzare il ciclo DO WHILE. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
15
Il processo di programmazione 
Una volta compresi i concetti di base, programmare si riduce ad un processo iterativo. Sarà 
sufficiente eseguire i passi necessari tante volte quante ne necessiterà la messa a punto del 
programma. All’inizio si eseguiranno molte verifiche, spendendo molto tempo in prove ed errori; 
via che, però, si acquisirà familiarità con il linguaggio, si procederà sempre più speditamente e si 
imparerà ad eseguire a mente i test preliminari.. 
I passi necessari per eseguire un buon programma: 
?? Dichiarare il problema. 
?? Suddividere il problema nei suoi elementi fondamentali. 
?? Realizzare le varie parti del programma. 
?? Testare e mettere a punto ogni parte realizzata. 
?? Assemblare le varie parti. 
?? Testare tutto il programma. 
Ci sono però alcune cose che è necessario ricordare quando si inizia: 
?? Cercare di delineare chiaramente il problema prima di tentarne la risoluzione. In caso 
contrario rischieremmo di dover eseguire un sacco di modifiche, buttando via codice già 
scritto, ripartendo daccapo molte volte o dovendoci, alla fine, accontentarci di un prodotto di 
molto inferiore alle nostre aspettative. 
?? Suddividere il problema in parti più facilmente gestibili, invece di cercare di risolvere tutto 
in una volta. 
?? Testare e correggere (debug) il codice non appena scritto. Verificare sempre che il codice 
faccia esattamente quello per cui lo abbiamo scritto. Il debugging è il processo di ricerca e 
correzione dei problemi che impediscono ai programmi di fare quello per cui sono stati 
realizzati. 
?? Perfezionare la struttura dei dati ed i loro contenitori affinché il programma riesca a 
manipolarli agevolmente ed efficientemente. Questo spesso significa dover strutturare 
correttamente le proprie tabelle. 
Il rimanente di questa sezione mostrerà i vari passi necessari a costruire un piccolo applicativo in 
Visual FoxPro. 
Asserire il Problema 
Prima di tentare di risolvere un problema, è necessario formularlo in maniera corretta. Qualche 
volta, trovando il giusto modi di formulare un problema, si è in grado di individuare strade migliori 
o diversificate per poterlo risolvere. 
Supponiamo di ricevere molti dati da diverse sorgenti. Benché la maggior parte di questi dati sia 
strettamente numerica, alcuni di questi contengono, insieme ai numeri, trattini e spazi. Abbiamo la 
necessità di rimuovere tutti i trattini e gli spazi dai campi e salvare solo i dati numerici. 
Invece di partire tentando subito di rimuovere i caratteri indesiderati dai dati originali, si può 
cercare di formulare l’obiettivo del programma come segue: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’sGuide” Microsoft Press © 
www.foxitaly.com - 
16
Obiettivo (Goal) Sostituire i valori esistenti in un campo con altri contenenti tali valori epurati 
dagli spazi e dai trattini. 
Questa formulazione evita di scontrarsi con la difficoltà di manipolare stringhe di caratteri la cui 
lunghezza può cambiare durante la nostra elaborazione. 
Suddividere il problema 
Siccome abbiamo la necessità di fornire specifiche istruzioni a Visual FoxPro in termini di 
operazioni, comandi e funzioni, è necessario suddividere il problema in elementi discreti. Il passo 
più semplice per affrontare il problema che ci siamo posti è quello di verificare ogni caratteri 
presente nella stringa. Finché non valuteremo ogni carattere individualmente non saremo in grado di 
decidere se salvarlo o meno. 
Una volta individuato un carattere, sarà necessario verificare se si tratta di un trattino ad uno spazio. 
A questo punto, saremo in grado di rifinire la dichiarazione del problema. E se, in futuro, si 
ricevessero dati contenenti parentesi aperte o chiuse? E come fare per sbarazzarsi di simboli di 
valuta, virgole e punteggiatura? Più ampio sarà il campo di azione del programma, più lavoro ci 
potremo risparmiare in futuro. Allora possiamo riformulare gli obiettivi in maniera da poter 
lavorare, in futuro, con una maggiore varietà di dati: 
Ridefinizione dell’obiettivo Sostituire i valori esistenti in un campo con altri contenenti tali valori 
epurati da tutti i caratteri diversi da cifre. 
Con questo nuovo obiettivo si è in grado di riformulare il problema a livello di carattere: se il 
carattere è numerico, va salvato; se il carattere non è numerico si passa al successivo. Una volta 
costruita la stringa contenente solo i caratteri numerici di quella di partenza, sarà possibile salvarla e 
procedere con il record successivo fino alla completa elaborazione di tutti i dati. 
Per riassumere, il problema può essere suddiviso nelle seguenti parti: 
1. Valutare ogni carattere. 
2. Verificare se rappresenta un numero oppure no. 
3. Se numerico, copiarlo nella seconda stringa. 
4. Una volta valutati tutti i caratteri della stringa originale, sostituirla con la seconda generata 
5. Ripetere le operazioni per tutti i records dell’archivio. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
17
Costruire le varie parti 
Una volta che abbiamo ben chiaro quello che esattamente si intende realizzare, si può finalmente 
iniziare a costruire le varie parti del programma, assemblando i comandi, le funzioni e gli operatori 
che Visual FoxPro mette a disposizione. 
Dal momento che i comandi e le funzioni saranno utilizzati per manipolare dati, sarà necessario 
realizzare delle basi dati di prova sulle quali eseguire le simulazioni. Naturalmente sarà opportuno 
realizzare basi dati le più somiglianti possibili a quelle su cui il programma dovrà in futuro lavorare. 
Nell’esempio successivo vediamo come immagazzinare una stringa di caratteri all’interno di una 
variabile, utilizzando l’istruzione direttamente dalla finestra dei comandi di FoxPro: 
cTest = "123-456-7 89 0" 
Lavorare sul singolo carattere 
Per valutare ogni singolo carattere di una stringa è necessario utilizzare alcune particolari funzioni 
che possiamo trovare elencate nel paragrafo relativo, funzioni di manipolazione dei caratteri 
(Character Functions). 
Le funzioni in grado di restituire specifiche sezioni di una stringa sono tre, e precisamente: 
LEFT( ), RIGHT( ), e SUBSTR( ). 
La funzione SUBSTR( ) restituisce i caratteri di una qualsiasi porzione di stringa. SUBSTR( ) 
necessita dei seguenti tre argomenti (o parametri): la stringa, la posizione dalla quale si intende 
partire ed il numero di caratteri che intendiamo estrarre, ad iniziare dalla prima posizione a sinistra. 
Per verificare il funzionamento della funzione SUBSTR( ) sulla variabile appena realizzata, 
proviamo a scrivere le seguenti istruzioni dalla finestra dei comandi: 
? SUBSTR(cTest, 1, 1) 
? SUBSTR(cTest, 3, 1) 
? SUBSTR(cTest, 8, 1) 
In uscita avremo … 
1 
3 
- 
Si può notare come il primo, il terzo e l’ottavo carattere siano stati visualizzati nella finestra 
principale di Visua l FoxPro. 
Per eseguire lo stesso tipo di operazione possiamo ricorrere alla tecnica del loop. Siccome 
conosciamo la lunghezza della stringa di testo (14 caratteri), possiamo utilizzare un loop di tipo 
FOR. Il contatore che controlla il ciclo viene incrementato ogni volta che viene rieseguito il loop 
stesso, così siamo in grado di utilizzarlo come parametro della funzione SUBSTR( ). E’ possibile 
provare il funzionamento del loop all’interno della finestra dei comandi, ma a questo punto 
potremmo sentire la necessità di salvare il nostro lavoro per poterlo riutilizzare successivamente. E’ 
arrivato il momento di realizzare il nostro primo programma ! 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
18
Creare un programma 
1. All’interno della finestra dei comandi, digitare le seguenti righe di istruzione: 
2. MODIFY COMMAND numonly 
3. All’interno della nuova finestra, digitare le seguenti linee di codice: 
4. FOR nCnt = 1 TO 14 
5. ? SUBSTR(cTest, nCnt, 1) 
6. ENDFOR 
Adesso che abbiamo realizzato il nostro programma, possiamo mandarlo in esecuzione. 
Eseguire un programma 
1. Dalla finestra del programma, premere CTRL+E. 
2. All’interno della finestra di dialogo (Save dialog box), scegliere OK. 
In fase di esecuzione del programma, i singoli caratteri estratti dalla stringa di partenza, verranno 
visualizzati uno ad uno in linee separate, all’interno della finestra principale di Visual FoxPro (main 
Visual FoxPro window). 
Testare una parte di programma 
 
La prima operazione è compiuta. Adesso è possibile visualizzare ogni carattere della stringa. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
19
Verificare se il carattere è numerico o meno. 
Una volta estratto un carattere dalla stringa, si può verificare se si tratti di un numero o no. Questa 
verifica la possiamo eseguire utilizzando la funzione ISDIGIT( ). 
Proviamo a digitare i seguenti comandi dalla Command window: 
? ISDIGIT('2') 
? ISDIGIT('-') 
? ISDIGIT(SUBSTR(cTest, 3, 1)) 
In uscita avremo … 
.T. 
.F. 
.T. 
I risultati ottenuti testimoniano che ‘2’ è un numero, ‘– ’ non è un numero, mentre il terzo carattere 
della stringa cTest, 3, è nuovamente un numero. 
Se il carattere è numerico, lo possiamo copiare nella Seconda Stringa 
Una volta appurato che il carattere è di tipo numerico, avremo bisogno di una nuova variabile 
all’interno della quale poterlo memorizzare: la nuova variabile si chiamerà, ad esempio, cNumOnly. 
Per creare cNumOnly, sarà sufficiente assegnarle come valore iniziale una stringa di lunghezza pari a 
zero: 
cNumOnly = "" 
Mentre il nostro ciclo FOR si sposta all’interno della nostra stringa di partenza, può risultare utile 
creare una nuova variabile per memorizzare ogni nuovo carattere estratto dalla stringa al fine di 
poterlo valutare: 
cCharacter = SUBSTR(cTest, nCnt, 1) 
Suggerimento: spesso è consigliabile memorizzare il risultato di un calcolo, di una scelta 
(valutazione) o di una funzione all’interno di una variabile, in maniera da poterlo elaborare e 
modificare senza dovere ogni volta ripetere l’operazione di calcolo. 
La seguente linea di codice può essere utilizzata ogni volta che troviamo un carattere di tipo 
numerico all’interno della stringa (e che dobbiamo trasferire nella nuova): 
cNumOnly = cNumOnly + cCharacter 
Il programma scritto fino ad ora, quindi, è: 
cNumOnly = "" 
FOR nCnt = 1 TO 14 
 cCharacter = SUBSTR(cTest, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
ENDFOR 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
20
Testare le varie partiAggiungendo un paio di comandi alla fine del programma, si può vedere come esso lavori via via 
con la nostra stringa: 
cNumOnly = "" 
FOR nCnt = 1 TO 14 
 cCharacter = SUBSTR(cTest, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
ENDFOR 
? cTest 
? cNumOnly 
In uscita avremo … 
123-456-7 89 0 
1234567890 
Il risultato sembra corretto. Però cambiando la stringa di prova durante il collaudo si può incappare 
in qualche problema … 
Digitiamo il seguente comando nella finestra dei comand i: 
cTest = "456-789 22" 
(Command window) e lanciamo nuovamente l’esecuzione del programma. 
Il programma mostrerà un messaggio di errore. Il ciclo FOR proverà, infatti, ad eseguire 14 cicli 
anche se la nuova stringa contiene solo 10 caratteri. Per ovviare al problema è necessario trovare un 
sistema per poter adattare l’esecuzione del programma a stringhe di diversa lunghezza. Per fare 
questo è necessario ricorrere alla funzione LEN( ), in grado di restituire proprio la lunghezza di una 
stringa di caratteri. Inserendo questa funzione nel ciclo FOR, si potrà verificare la correttezza 
dell’esecuzione con ambedue le stringhe: 
cNumOnly = "" 
FOR nCnt = 1 TO LEN(cTest) 
 cCharacter = SUBSTR(cTest, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
ENDFOR 
? cTest 
? cNumOnly 
Assemblare le varie parti 
Per completare la soluzione del problema si può impostare la lettura dei dati, invece che da una 
variabile, direttamente da una tabella. Infatti, una volta selezionata la tabella da utilizzare, sarà 
possibile leggere i vari record che la compongono, prelevando da essi le stringhe da elaborare. 
Per iniziare, occorre creare una tabella temporanea contenente una certa varietà di stringhe di 
esempio. Una tabella siffatta può contenere anche un solo campo di tipo carattere chiamato, ad 
esempio, TestField e quattro o cinque record: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
21
Contenuto del campo TestField 
123-456-7 89 0 -9221 9220 94321 99- 
456-789 22 000001 98-99-234 
 
Sostituendo il nome del campo a quello della stringa, creeremo un nuovo programma che avrà la 
seguente struttura: 
FOR nCnt = 1 TO LEN(TestField) 
 cCharacter = SUBSTR(TestField, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
ENDFOR 
? TestField 
? cNumOnly 
E’ possibile posizionarsi manualmente su di un certo record scorrendo la tabella (browsing) sui vari 
records. Quando il puntatore si trova su di un certo record, il programma può eseguire le proprie 
istruzioni sulla base dei dati che, via via, vi trova. E’ possibile anche istruire il programma in 
maniera tale da fargli effettuare automaticamente la scansione della tabella: 
SCAN 
 cNumOnly = "" 
 FOR nCnt = 1 TO LEN(TestField) 
 cCharacter = SUBSTR(TestField, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
 ENDFOR 
? TestField 
? cNumOnly 
? 
ENDSCAN 
In uscita avremo … 
123-456-7 89 0 
1234567890 
 
456-789 22 
45678922 
 
 -9221 9220 94321 99- 
922192209432199 
 
000001 98-99-234 
0000019899234 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
22
Testare tutto il programma 
Invece di stampare la stringa generata, si può voler salvare il contenuto all’interno della tabella 
stessa. Per fare ciò si può utilizzare la seguente linea di codice: 
REPLACE TestField WITH cNumOnly 
Quindi il nuovo programma diventa: 
SCAN 
 cNumOnly = "" 
 FOR nCnt = 1 TO LEN(TestField) 
 cCharacter = SUBSTR(TestField, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + cCharacter 
 ENDIF 
 ENDFOR 
 REPLACE TestField WITH cNumOnly 
ENDSCAN 
Una volta completato il programma, prima di iniziare ad utilizzarlo, è necessario testarlo su un 
modello di prova della futura base dati. 
Rendere il programma più affidabile. 
Un programma affidabile, oltre a fare ciò per cui è stato progettato, deve anche essere in grado di 
prevedere, ed eventualmente gestire, eventuali errori. Il programma utilizzato nell’esempio 
precedente esegue effettivamente tutte le elaborazioni necessarie, ma da per scontate alcune 
condizioni che devono necessariamente verificarsi affinché tutto possa procedere senza errori. 
Le condizioni necessarie sono le seguenti: 
?? La tabella deve essere già aperta nell’area di lavoro corrente. 
?? La tabella deve contenere un campo di tipo carattere chiamato TestField. 
Se nell’area di lavoro corrente la tabella non fosse già presente o quest’ultima non avesse un campo 
di tipo carattere con il nome specificato, il programma genererebbe un messaggio di errore e non 
potrebbe proseguire con le operazioni. 
Esempio di programma in grado di eliminare, per tutti i records di una tabella, i caratteri non 
numerici presenti all’interno di un campo 
Codice Commenti 
LFieldOK = .F. Questa variabile è necessaria per determinare se 
esistono le condizioni necessarie per far 
funzionare correttamente il programma. La 
variabile viene inizializzata a falso (.F.), 
assumendo quindi che le condizioni necessarie 
al funzionamento del programma non sono 
rispettate. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
23
FOR nCnt = 1 TO FCOUNT( ) 
 IF FIELD(nCnt) = ; 
 UPPER("TestField") 
 IF TYPE("TestField") = "C" 
 lFieldOK = .T. 
 ENDIF 
 EXIT 
 ENDIF 
ENDFOR 
In questa porzione di codice si procede alla 
verifica di ogni campo della tabella corrente alla 
ricerca di un campo di tipo carattere chiamato 
TestField. Una volta trovato il campo, la 
variabile lFieldOK viene settata a vero (.T.) e, 
tramite l’istruzione EXIT, il ciclo si 
interromperà (Infatti non ci sarebbe motivo di 
continuare una ricerca che ha già dato esiti 
positivi). Nel caso in cui, invece, non si trovi il 
campo specificato, la variabile lFieldOK resterà 
settata al valore falso (.F.). 
IF lFieldOK La porzione di codice deputata alla conversione 
verrà eseguita solo se sarà stato precedentemente 
trovato il campo di tipo carattere (chiamato 
TestField) all’interno della tabella nell’area di 
lavoro corrente. 
SCAN 
 cNumOnly = "" 
 FOR nCnt = 1 TO LEN(TestField) 
 cCharacter = ; 
 SUBSTR(TestField, nCnt, 1) 
 IF ISDIGIT(cCharacter) 
 cNumOnly = cNumOnly + ; 
 cCharacter 
 ENDIF 
 ENDFOR 
 
Questa è la porzione di codice deputata alla 
conversione. 
 REPLACE TestField WITH ; 
 cNumOnly 
ENDSCAN 
 
 
ENDIF Fine della condizione (IF) applicata al contenuto 
della variabile lFieldOK. 
 
La caratteristica più limitativa di questo programma è data dal fatto che può essere utilizzato solo 
per operare su di uno specifico campo di una tabella. Nel caso si volesse estenderne la funzionalità 
ad un campo diverso da TestField , saremmo obbligati a riscrivere il programma sostituendo tutte 
le istruzioni relative al campo TestField con altre contenenti il nome del nuovo campo. 
Convertendo il programma appena visto in una funzione, come vedremo in seguito, potremo 
renderne il campo di applicazione più generico, rendendolo riutilizzabile in vari altri casi, 
risparmiandoci in futuro del nuovo lavoro. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
24
L’utilizzo delle Procedure e delle funzioni utente 
Le Procedure e le Funzioni hanno il grosso vantaggio di poter accorpare, all’interno di una singola 
porzione di codice, le funzionalità più comunemente utilizzate nel nostro programma, 
richiamandole al momento opportuno. Questo dà la possibilità di scrivere programmi più leggibili e 
più facili da manutenere in quanto la modifica di una routine può essere fatta una volta per tutte 
all’interno della Procedura e resa automaticamente disponibile a tutte le nostre applicazioni..In Visual FoxPro, una procedura viene scritta con la seguente sintassi: 
PROCEDURE myproc 
 * This is a comment, but it could be executable code 
ENDPROC 
Normalmente una procedura contiene del codice che viene scritto per eseguire delle operazioni e 
delle funzioni che restituiscono dei valori. In Visual FoxPro, le Funzioni sono simili alle Procedure: 
FUNCTION myfunc 
 * This is a comment, but it could be executable code 
ENDFUNC 
Si possono includere Procedure e Funzioni in un programma a sé stante oppure, indifferentemente, 
alla fine di un normale programma che contiene già del codice. Nel secondo caso, però, Procedure e 
Funzioni devono necessariamente essere poste alla fine del file di programma, ovvero dopo di esse 
non è consentito scrivere altre istruzioni. 
Nel caso in cui si decida di includere Procedure e Funzioni all’interno di un file a sé stante è 
necessario, per renderle accessibili agli altri programmi, utilizzare il comando SET PROCEDURE 
TO. Per esempio, nel caso in cui si accorpino le nostre funzioni nel file FUNPROC.PRG, dovremo 
utilizzare la seguente sintassi: 
SET PROCEDURE TO funproc.prg 
Richiamare una Procedura od una Funzione 
Ci sono due modi per richiamare una procedura od una funzione dal nostro programma: 
?? Utilizzare il comando DO. Per esempio: 
?? DO myproc 
-oppure- 
?? Inserire una coppia di parentesi dopo il nome della funzione. Per esempio: 
?? myfunc( ) 
Ognuno di questi due metodi può essere impostato in maniera tale da inviare o ricevere valori dalla 
Procedura o dalla Funzione chiamate. 
Inviare valori ad una Procedura o ad una Funzione 
Per inviare valori alle procedure od alle funzioni, è necessario utilizzare l’istruzione parameters . 
La procedura mostrata di seguito, per esempio, accetta un singolo parametro: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
25
PROCEDURE myproc( cString ) 
 * The following line displays a message 
 MESSAGEBOX ("myproc" + cString) 
ENDPROC 
 
Nota Inserendo i parametri tra parentesi nella riga di definizione di una funzione o di una 
procedura, per esempio PROCEDURE myproc(cString), indica che il parametro è una variabile 
locale, cioè accessibile solo dall'interno della procedura/funzione stessa. 
E’ anche possibile fare accettare dalla funzione o dalla procedura parametri locali utilizzando 
l’istruzione LPARAMETERS. 
I Parametri funzionano allo stesso modo in una funzione. Per inviare un valore come parametro alla 
procedura o alla funzione si può utilizzare una stringa od una variabile che la contiene, come 
mostrato nell’esempio seguente: 
Passare i parametri 
Codice Commenti 
DO myproc WITH cTestString 
DO myproc WITH "test string" 
Chiama una procedura e le passa una stringa 
di caratteri o una variabile. 
myfunc("test string") 
myfunc( cTestString ) 
Chiama una funzione e le passa la copia di una 
variabile contenente caratteri ed una stringa di 
caratteri. 
 
Nota Richiamando una procedura od una funzione senza utilizzare il comando DO, il settaggio di 
UDFPARMS determinerà come tali parametri saranno passati. Per default, UDFPARMS è settato a 
‘VALUE’, in questo modo viene trasferita una copia dei parametri. Utilizzando l’istruzione DO, 
viene utilizzato il parametro attuale (trasferimento per referenza), ed ogni modifica all’interno della 
procedura o della funzione, viene applicata al valore originale, in base al indipendentemente 
dall’impostazione di UDFPARMS. 
E’ possibile trasferire alla funzione o alla procedura più parametri contemporaneamente, 
separandoli l’uno dall’altro tramite delle virgole. Per esempio, la seguente procedura si aspetta di 
ricevere tre parametri: una data, una stringa di caratteri, ed un numero. 
PROCEDURE myproc( dDate, cString, nTimesToPrint ) 
 FOR nCnt = 1 to nTimesToPrint 
 ? DTOC(dDate) + " " + cString + " " + STR(nCnt) 
 ENDFOR 
ENDPROC 
Questa procedura può essere chiamata utilizzando la seguente linea di codice: 
DO myproc WITH DATE(), "Hello World", 10 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
26
Ricevere valori da una Funzione 
Il valore restituito di default da una funzione è vero (.T.), ma utilizzando l’istruzione RETURN si 
può restituire valori di qualsiasi genere. Per esempio, la seguente funzione restituirà una data di due 
settimane successiva a quella passatale come parametro. 
FUNCTION plus2weeks 
PARAMETERS dDate 
 RETURN dDate + 14 
ENDFUNC 
La seguente riga di codice memorizza il valore restituito dalla funzione, all’interno di una variabile: 
dDeadLine = plus2weeks(DATE()) 
La tabella successiva elenca le varie modalità con cui si possono memorizzare o visualizzare i 
valori restituiti da una funzione: 
Gestire i valori restituiti 
Codice Commenti 
var = myfunc( ) Memorizza in una variabile il valore restituito 
dalla funzione 
? myfunc( ) Visualizza, nella finestra attiva, il valore restituito 
dalla funzione. 
 
Verificare i parametri di una Procedura o di una Funzione 
E’ buona abitudine verificare che i parametri inviati alla nostra procedura o alla nostra funzione 
siano effettivamente come ce li aspettiamo. A tale scopo si può utilizzare la funzione TYPE( ) e la 
funzione PARAMETERS( ) per verificare il tipo ed il numero di parametri inviati alla funzione (o 
procedura). 
Nell’esempio appena visto, si richiede di ricevere un parametro di tipo Data. Utilizzando la 
funzione TYPE( ) è possibile effettivamente verificare se tale parametro sia del tipo specificato. 
FUNCTION plus2weeks( dDate ) 
 IF TYPE("dDate") = "D" 
 RETURN dDate + 14 
 ELSE 
 MESSAGEBOX( "You must pass a date!" ) 
 RETURN { - - } && Return an empty date 
 ENDIF 
ENDFUNC 
Nel caso in cui una procedura si aspetti un numero minore di parametri rispetto a quanti 
effettivamente ne riceve, Visual FoxPro genererà un messaggio di errore. Per esempio, nel caso si 
specifichino due parametri, ma si chiami la funzione con tre parametri, si otterrà un messaggio di 
errore. Nel caso in cui, invece, la procedura riceva meno parametri di quanti ne possa accettare, 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
27
semplicemente inizializzerà a falso (.F.) quelli non esplicitamente ricevuti. Siccome non c’è sistema 
per vedere se l’ultimo parametro è stato settato a falso(.F.) od omesso, possiamo utilizzare la 
seguente procedura per verificare se sono stati inviati tutti i parametri richiesti: 
PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable ) 
 IF PARAMETERS( )più semplicemente: 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
28
REPLACE ALL FieldName WITH NumbersOnly(FieldName) 
Come procedere 
L’utilizzo della programmazione di tipo procedurale (procedural programming), insieme a quella 
orientata agli oggetti (object-oriented programming) ed agli strumenti di sviluppo di Visual FoxPro 
può permettere la realizzazione di applicazioni Visual FoxPro assai versatili. Il rimanente di questo 
libro si soffermerà sui vari argomenti che incontrerete durante lo sviluppo di applicazioni Visual 
FoxPro. 
Per maggiori informazioni sull’approccio alla programmazione orientata agli oggetti (object-
oriented), si può consultare il Capitolo 3, mentre per vedere l’utilizzo della utility Form Designer, 
si può consultare il Capitolo 9, 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
29
Capitolo 2: Sviluppare un’ applicazione 
Traduzione di Alessandro Panighi 
Una tipica applicazione in Visual FoxPro include uno o più DATABASE, un programma principale (main) 
che imposta l’ambiente di sistema dell’applicazione e genera l’interfaccia utente composta di Maschere 
(FORM) Barre strumenti (TOOLBARS) e Menu (MENU). Le Interrogazioni (QUERY) e le Stampe 
(REPORT) consentono agli utenti di ottenere le informazioni estrapolate dai loro dati. 
In questo capitolo verranno trattati: 
?? Pianificazione dell’applicazione 
?? Creazione di un database 
?? Creazione di classi 
?? Fornire accesso alla funzionalità 
?? Fornire accesso alle informazioni 
?? Fare test e debugging 
 
Pianificare l’applicazione 
Pianificare attentamente serve per risparmiare tempo, sforzi, denaro e giudizio. Con più viene coinvolto 
l’utilizzatore finale nel processo di pianificazione meglio è. Non ha importanza quanto attentamente 
pianificate, perché mentre procederete tornerete spesso sul progetto e i vostri consumatori finali vi forniranno 
un feedback. 
Alcune delle decisioni che prenderete avranno un forte impatto sulla creazione degli elementi della 
applicazione. Chi utilizzerà questa applicazione? Qual è il centro della attività dell’utilizzatore? Quanto sarà 
grande il campo dati sul quale lavorerete? Saranno utilizzati i back-end data o saranno ad uso esclusivo di un 
singolo utilizzatore o di molteplici utenti in un network? Tenete conto di questi fattori prima di addentrarvi 
troppo nella stesura del progetto. 
 
Attività di uso comune 
Anche se gli utenti finali stanno lavorando con clienti, ordini e parti, il modo in cui lavoreranno con questi 
informazioni determinerà il modo in cui la vostra applicazione dovrà elaborare i dati. Un formulario per 
l’immissione di dati, come quello in Tastraded.app (in Visual Studio…\Samples\Vfp98\Tastrade directory) 
potrebbe essere necessario per alcune applicazioni, ma potrebbe non essere un buon strumento per trattare 
inventari, vendite, etc 
 
Dimensioni del Database 
Sicuramente vorrete soffermarvi più a lungo sulle performance se state trattando con una grande quantità di 
dati. Il Capitolo 15 Optimizing Applications spiega il modo in cui si possono ottimizzare le perfomance. 
Potreste anche voler aggiustare le modalità in cui permettere all’utilizzatore di usare i dati. Se avete 20 o 30 
records in una tabella, va bene lasciar spostare all’utilizzatore il pointer dei record in una tabella un record 
alla volta. Se avete invece 20 o 30 mila records, dovrete fornire un altro tipo di gestione per ottenere i dati 
desiderati: aggiungendo liste di ricerca o dialogs, filtri, ricerche e così via. Il capitolo 10, Using Controls , 
spiega come usare una lista per selezionare specifici records. Il capitolo 8, Creating Views, spiega il modo 
per creare ricerche per parametri. 
 
Monoutente o Multiutente 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
30
E’ una buona idea quella di creare una applicazione con la possibilità di prevedere che più utenti potranno 
accedere ai dati nello stesso momento. Visual Fox Pro facilita la programmazione per accessi condivisi. Il 
Capitolo 17, Programming for shared Access, descrive le tecniche per permettere a più utenti di accedere 
contemporaneamente al vostro database. 
 
Considerazioni Internazionali 
Se sapete che la vostra applicazione sarà utilizzata da utenti di una sola lingua, non dovete preoccuparvi 
dell’internazionalizzazione. Se invece volete espandere il vostro mercato, o se i vostri utenti potrebbero 
avere a che fare con dati o ambienti internazionali, dovrete prendere in considerazioni questi aspetti nella 
creazione della vostra applicazione. Il Capitolo 18, Developing International Applications , prende in 
considerazione le problematiche che potrete incontrare mentre sviluppate delle applicazioni per uso 
internazionale. 
 
Dati Locali o Dati Remoti 
Se la vostra applicazione tratta con dati remoti, dovrete immaginarli in maniera diversa rispetto al Native 
Visual Fox Pro data. Il Capitolo 8, Creating Views, spiega come creare views da dati locali o remoti. La 
parte 6 del Programmer’s Guide, Creating Client/Server Solutions, tratta come disegnare delle applicazioni 
che trattino similmente i dati interni con quelli remoti. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
31
Panoramica di una procedura 
La procedura per creare una applicazione è molto iterativa. Poiché non ci sono due applicazioni che 
siano uguali tra loro, probabilmente svilupperete dei prototipi e ridefinirete alcune componenti 
parecchie volte prima di completare un lavoro. Le aspettative dell’utilizzatore finale o di chi 
commissiona il lavoro possono anche cambiare, richiedendovi di ridefinire alcuni aspetti 
dell’applicazione. E nessuno scrive codice senza errore (bug-free), così fare prove e debugging 
solitamente porta a delle revisioni e modifiche. 
La procedura per creare una applicazione 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Oltre a prendere in considerazione le parti principali nella fase di pianificazione, dovrete decidere quale 
funzionalità è necessaria, quali dati sono coinvolti, e come dovrebbe essere strutturato il database. Avrete la 
necessità di disegnare una interfaccia per fornire all’utente un accesso alle funzioni della applicazione. Potete 
creare stampe (reports) e interrogazioni (queries) in modo che l’utente possa estrapolare informazioni utili da 
questi dati. 
 
Iniziare a sviluppare 
Dopo avere pianificato di quali componenti avete bisogno per la vostra applicazione, potreste voler disegnare 
una struttura di cartelle e progettare i files che volete creare per la vostra applicazione. Potete costruirvi la 
struttura (framework) da soli in Windows Explorer e il progetto in Project Manager, o utilizzare Application 
Wizard per farli entrambi nello stesso momento. Application Wizard apre l’ Application Builder in modo 
che possiate adattare ulteriormente un progetto e i componenti che avviate con Wizard. Per una compatibilità 
a ritroso, potete anche scegliere Application Wizard (5.0). 
 
 
Utilizzare Project Manager 
Progetto del database 
Definizione dei requisiti 
Creazione del database 
Tabelle 
Viste 
Relazioni 
Fornire all’utente l’accesso alle 
funzioni del programma 
?? ?? Form (Maschere) 
?? ?? Menu 
?? ?? Toolbars (Barre 
strumenti) 
 
Fornire all’utente l’accesso alle 
informazioni 
?? ?? Query (interrogazioni 
) 
?? ?? Report (stampe) 
?? ?? Graphs (grafici ) Verifica e Collaudo Applicazione 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
32
Il Projetc Manager vi permette di compilare la vostra applicazione completata, ma nella fase di sviluppo 
della applicazione, Project Manager facilita la progettazione, la modifica e l’esecuzione dei singoli 
componenti della vostra applicazione. 
 
Project ManagerQuando utilizzate Project Manager potete: 
I. Modificare e far avanzare parti della vostra applicazione (maschere, menu, programmi) con 
pochi click 
II. Trascinare classi, tabelle e campi da Project Manager in Form Designer o Class Designer. 
III. Trascinare classi tra librerie di classi. 
IV. Visualizzare e modificare facilmente le vostre tabelle e database. 
V. Aggiungere descrizioni ai componenti nella vostra applicazione. 
VI. Trascinare e togliere elementi tra I progetti. 
Per informazioni dettagliate sul modo di utilizzo di Project Manager vedi il Capitolo 1, Getting Started, nella 
User’s Guide. Per informazioni su come compilare applicazioni, vedi il Capitolo 13, Compiling an 
Application, in questo volume. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
33
 
Creare Databases 
Poiché una applicazione di database è fortemente dipendente dai dati principali, il modo migliore per iniziare 
a definire la vostra applicazione è di iniziare con i dati. Potete formare il vostro database e determinare quali 
relazioni ci sono tra le tabelle, quali regole volete implementare e così via, prima di disegnare qualsiasi 
interfaccia o componenti per la manipolazione dei dati. Un database solido rende molto più semplice lo 
sviluppo del lavoro. 
Il Capitolo 5, Designing Databases, Capitolo 6, Creating Databases, e Capitolo 7, Working with Tables, 
trattano gli argomenti di progettazione e spiegano come usare Visual FoxPro per disegnare tabelle e database 
efficienti. 
Creare classi 
Potete creare una applicazione solida, orientata all’oggetto, usando solamente classi base di Visual FoxPro. 
Potreste anche non dover mai creare una classe, ma potreste volerne creare una. Oltre a creare un codice più 
maneggevole e facile da mantenere, una libreria di classi solida vi permette di creare rapidamente prototipi e 
di aggiungere velocemente funzionalità ad una applicazione. Potete creare classi in un file di programma, nel 
Form Designer, (utilizzando il comando Save as a class dal File menu) o nel Class Designer. 
Il capitolo 3, Object-Oriented Programming, tratta di alcuni vantaggi nel creare classi e dettagli di come 
crearli sia con il Class Designer che attraverso la codifica. 
 
Accedere alla Funzionalità 
La soddisfazione del cliente sarà fortemente influenzata dall’interfaccia che voi fornirete per la funzionalità 
della vostra applicazione. Potete avere un modello molto chiaro di classe, un codice elegante, e anche 
soluzioni ad hoc per problemi difficili nella vostra applicazione, ma questi sono quasi sempre sconosciuti al 
vostro cliente. Ciò che risulta visibile è l’interfaccia che voi gli fornite. Fortunatamente gli strumenti di 
Visual FoxPro facilitano la creazione di interfaccia attraenti e caratteristiche. 
L’interfaccia dell’utente consiste in particolare di maschere, barre strumenti, menu a tendina. Potete 
associare il funzionamento della vostra applicazione a controlli o comandi di menu nell’interfaccia. Il 
capitolo 9, Creating Forms, descrive come scrivere form sets. Come utilizzare i controlli di Visual FoxPro 
nelle vostre maschere è trattato nel Capitolo 10, Using Controls. Vedi Capitolo 11, Designing Menus and 
Toolbars, per dare gli ultimi ritocchi alla vostra applicazione. 
Accedere alle informazioni 
Probabilmente mostrerete alcune informazioni per I vostri utenti nelle maschere, ma vorrete anche dare la 
possibilità ai vostri utenti di specificare esattamente quali informazioni vogliono vedere e l’opzione per 
stamparli sotto forma di report o etichette. Le queries, specialmente le queries che accettano parametri di 
definizione da parte dell’utente, permettono all’utente di avere un controllo maggiore sui dati. I reports 
permettono agli utenti di stampare completamente o parzialmente i dati. 
 
IL Query Designer e il Report Designer sono trattati dal Capitolo 4 al Capitolo 7 della User’s Guide. Il 
Capitolo 12 di questo libro, Adding Queries e Reports, discute l’integrazione delle queries e i rapporti 
nell’applicazione. Il capitolo 16, Adding OLE, descrive l’integrazione OLE in una applicazione. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
34
 
Testing and Debugging 
La verifica, l’individuazione e correzione degli errori (Testing e Debugging) è qualcosa che molti 
programmatori fanno ad ogni passo del procedimento di sviluppo. E’ una buona idea fare un test e debug a 
mano a mano che si prosegue nello sviluppo. Se create una maschera, vorrete essere sicuri che faccia quello 
che voi volete, prima di passare ad un altro elemento della vostra applicazione. 
 
Il Capitolo 14, Testing and Debugging Applications, spiega come usare gli strumenti di debugging di Visual 
FoxPro per fare il debug delle vostre applicazioni e fornisce consigli su come rendere più veloce il 
procedimento di debugging. 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
35
 Capitolo 3: Programmazione Object-Oriented 
Traduzione di Baldarelli Gian-Carlo 
Mentre Visual FoxPro mantiene il supporto per la programmazione strutturale, sono state introdotte 
nuove estensioni al linguaggio che consentono di ottenere la potenza e flessibilità offerta dalla 
programmazione orientata agli oggetti. 
La progettazione orientata agli oggetti e la programmazione orientata agli oggetti rappresenta una 
variazione dalla metodo standard di programmazione procedurale. Al posto di pensare ad un 
programma che scorre dalla prima riga di codice fino all’ultima, dovete pensare come creare degli 
oggetti: contenitori di componenti di una applicazione che hanno funzionalità interne così come 
funzionalità che possono essere esposte all’utente 
Questo capitolo tratta: 
?? Capire gli oggetti in VFP 
?? Capire le classi in VFP 
?? Far corrispondere una classe allo scopo 
?? Creare una classe 
?? Aggiungere una classe ad una maschera ( form ) 
?? Definizione di classe attraverso il codice 
Gli Oggetti in Visual FoxPro 
In VFP, Maschere e controlli sono oggetti che vengono inclusi nelle vostre applicazioni. Voi 
manipolate questi oggetti attraverso le loro proprietà, eventi e metodi 
Le estensione del linguaggio orientato agli oggetti di VFP, forniscono un elevato grado di controllo 
sugli oggetto nelle vostre applicazioni. Queste estensioni rendono semplice la creazione e la 
manutenzione delle librerie di codice riutilizzabile, fornendovi: 
?? Codice più compatto. 
?? Semplicità nell’incorporare codice nelle applicazioni senza complessi processi di rinomina 
degli schemi. 
?? Minore complessità nell’integrazione di codice da differenti file in una applicazione. 
La programmazione OOP è principalmente un modo di impacchettare il codice in modo che possa 
essere riutilizzato e mantenuto in modo più semplice. Il pacchetto principale è chiamato classe. 
Classi e Oggetti: I mattoni principali delle applicazioni 
Classi e Oggetti sono in stretta relazione, ma non sono la stessa cosa. Una classe contiene 
informazioni sul come un oggetto deve apparire e su come si deve comportare. Una classe è la 
fotocopia dello schema di un oggetto. Lo schema elettrico e di design di un telefono, ad esempio, 
può rappresentare una classe. L’oggetto, o una istanza di una classe, sarà l’apparecchio telefonico. 
 
Traduzione dal Manulale “ Microsoft Visual FoxPro Programmer’s Guide” Microsoft Press © 
www.foxitaly.com - 
36
 
Le classi determinano le caratteristiche di un oggetto. 
 
Gli oggetti hanno proprietà 
Un oggetto possiede alcune proprietà o attributi. Ad esempio, un telefono è di un certo colore e 
forma. Quando inserite un telefono in un ufficio, esso avrà una certa posizione sulla scrivania. La 
cornetta potrà essere sollevata o abbassata. 
Gli oggetti che create in VFP hanno anche proprietà che vengono determinate dalla classe su cui si 
basano. Queste proprietà possono essere impostate

Mais conteúdos dessa disciplina