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