Visual FoxPro: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
|||
Riga 35:
== Caratteristiche ==
{{...|informatica}}
== Esempi di codice ==
Il linguaggio FoxPro contiene comandi simili ad altri linguaggi di programmazione quali il Basic.
Alcuni esempi di comandi base:
<syntaxhighlight lang="visualfoxpro">
FOR i = 1 to 10
x = x + 6.5
NEXT && Al posto di "NEXT" si può usare anche "ENDFOR"
IF i = 25
i = i + 1
ELSE
i = i + 3
ENDIF
x = 1
DO WHILE x < 50
x = x + 1
ENDDO
x = 1
DO WHILE .T.
x = x + 1
IF x < 50
LOOP
ELSE
EXIT
ENDIF
ENDDO
nMonth = MONTH(DATE())
DO CASE
CASE nMonth <= 3
MESSAGEBOX("Q1")
CASE nMonth <= 6
MESSAGEBOX("Q2")
CASE nMonth <= 9
MESSAGEBOX("Q3")
OTHERWISE
MESSAGEBOX("Q4")
ENDCASE
FOR EACH oControl IN THISFORM.Controls
MESSAGEBOX(oControl.Name)
ENDFOR
f = Factorial(10)
FUNCTION Factorial(n)
LOCAL i, r
r = 1
FOR i = n TO 1 STEP -1
r = r * i
NEXT && Anche qui si può usare "ENDFOR" al posto di "NEXT"
RETURN r
ENDFUNC
</syntaxhighlight>
Esempi Hello World:
<syntaxhighlight lang="visualfoxpro">
* Stampa alla locazione corrente
? "Hello World"
* Stampa in una specifica locazione
@ 1,1 SAY "Hello World"
* Stampa in una finestra differente
WAIT WINDOW "Hello World"
* Stampa in un dialog box standard, cancellato all'OK
MESSAGEBOX("Hello World")
</syntaxhighlight>
=== Oggetti ===
[[Image:VFPHelloWorld.png|thumb|right|Output of the ''Hello World'' program.]]
<syntaxhighlight lang="visualfoxpro">
* Stampa in una finestra specifica
loForm = CREATEOBJECT("HiForm")
loForm.Show(1)
DEFINE CLASS HiForm AS Form
AutoCenter = .T.
Caption = "Hello, World"
ADD OBJECT lblHi as Label ;
WITH Caption = "Hello, World!"
ENDDEFINE
</syntaxhighlight>
<syntaxhighlight lang="visualfoxpro">
loMine = CREATEOBJECT("MyClass")
? loMine.cProp1 && Questo funziona (la doppia e commerciale indica un commento fino a fine riga)
? loMine.cProp2 && Errore: la proprietà CPROP2 è nascosta esternamente.
? loMine.MyMethod1() && Questo funziona
? loMine.MyMethod2() && Errore: la proprietà MYMETHOD2 è nascosta esternamente.
DEFINE CLASS MyClass AS Custom
cProp1 = "My Property" && Questa è una proprietà pubblica
HIDDEN cProp2 && Questa è una proprietà privata (nascosta)
dProp3 = {} && Un'altra proprietà pubblica
PROCEDURE Init() && Costruttore della classe
This.cProp2 = "This is a hidden property."
PROCEDURE dProp3_Access && Il Getter è identificato dal tag "_Access" nel nome
RETURN DATE()
PROCEDURE dProp3_Assign(vNewVal) && Il Setter è identificato da tag "_Assign" nel nome
IF VARTYPE(vNewVal) = "D"
THIS.dProp3 = vNewVal
ENDIF
PROCEDURE MyMethod1()
* Metodo pubblico che chiama un metodo nascosto che restituisce
* il valore di una proprietà nascosta.
RETURN This.MyMethod2()
HIDDEN PROCEDURE MyMethod2() && Questo è un metodo privato (nascosto)
RETURN This.cProp2
ENDDEFINE
</syntaxhighlight>
* VFP ha una libreria estesa di classi predefinite ed oggetti visuali che sono accessibili nel [[Integrated development environment|IDE]] da un foglio di proprietà (inclusi i [[Metodo_(programmazione)|Metodi]]),<ref>{{cite web|title=Visual FoxPro Development Productivity Tools|url=http://msdn.microsoft.com/en-US/library/4x2ecwzz%28v=vs.80%29.aspx/|publisher=Microsoft|access-date=20 December 2014}}</ref> in modo che sia necessario scrivere un codice completo che definisca una classe ed i suoi oggetti solamente in casi molto particolari e la scrittura di [[Framework|framework]] di grandi sistemi.
=== Gestione dei Dati ===
Il linguaggio offre un nutrito gruppo di comandi dedicati alla manipolazione di un database.
L'indice dei comandi in VFP9 accessibile dal menù "Aiuto" contiene centinaia e centinaia di comandi e funzioni.
Gli esempi in basso mostrano come scrivere codice per la creazione e l'indicizzazione di tabelle, comunque VFP ha schermate di creazione visuale di tabelle e database che creano tutto senza la necessità di scrivere codice.
[[Image:VFPDataHandling.png|thumb|right|Output of the ''Data handling'' program.]]
<syntaxhighlight lang="visualfoxpro">
* Crea una tabella
CREATE TABLE randData (iData I)
* Popola con dati random usando xBase e comandi SQL DML
FOR i = 1 TO 50
APPEND BLANK
REPLACE iData WITH (RAND() * 100)
INSERT INTO randData (iData) VALUES (RAND() * 100)
ENDFOR
* Crea un indice sui dati
INDEX ON iData TAG iData
CLOSE DATA && Chiude la tabella
* Mostra dati ordinati usando comandi in stile xBase
USE randData
SET ORDER TO iData
LOCATE && Al posto di GO TOP. Forza l'uso di indici per trovare TOP
LIST NEXT 10 && I primi 10
GO BOTTOM
SKIP -10
LIST REST && Gli ultimi 10
CLOSE DATA
* Seleziona i dati ordinati usando i comandi SQL DML
SELECT * ;
FROM randData ;
ORDER BY iData DESCENDING
</syntaxhighlight>
=== Accesso ODBC usando SQL passthrough ===
<syntaxhighlight lang="visualfoxpro">
PRIVATE cAuthorID, cAuthorName && Variabili private che ridefiniscono eventuali precedenti variabili globali i private con lo stesso nome
LOCAL nHnd, nResult && Variabili locali visibili solo in questa sezione
* Connessione ad una sorgente ODBC
nHnd = SQLCONNECT ("ODBCDSN", "user", "pwd")
* Ciclo infinito (l'uscita viene forzata nel codice in caso di errore o al termine delle operazioni)
DO WHILE .T.
* Esegue un comando SQL
nResult = SQLEXEC (nHnd, "USE master")
IF nResult < 0
MESSAGEBOX ("MASTER database does not exist!")
EXIT && Esce dal ciclo
ENDIF
* Recupera i dati dal server remoto e li inserisce nel cursore locale
nResult = SQLEXEC (nHnd, "SELECT * FROM authors", "QAUTHORS")
IF nResult < 0
MESSAGEBOX ("Unable to execute remote SQL SELECT command!")
EXIT && Esce dal ciclo
ENDIF
* Aggiorna un record nella tabella remota usando una query parametrica
cAuthorID = "1001"
cAuthorName = "New name"
nResult = SQLEXEC (nHnd, "UPDATE authors SET auth_name = ?cAuthorName WHERE auth_id = ?cAuthorID")
IF nResult < 0
MESSAGEBOX ("Unable to execute remote SQL UPDATE command!")
EXIT && Esce dal ciclo
ENDIF
* Se arriva a questo punto, abbiamo effettuato tutti i passaggi correttamente
EXIT && Esce dal ciclo incondizionatamente
ENDDO
* Chiude la connessione
SQLDISCONNECT(nHnd)
</syntaxhighlight>
== Bibliografia ==
|