Migrazione di applicazioni xBase/Clipper

 

Articolo di Mimmo Micelli (riproduzione vietata) 07/Luglio/2001

 

VFP è figlio di xBase per cui è il miglior strumento per gli sviluppatori di codice xBase e in particolare di Clipper per poter trasferire le proprie applicazioni in un ambiente Windows a 32 bit.

 

Scartiamo a priori la possibilità di importare o tradurre codice sorgente Clipper nell’ambiente applicativo di VFP. Nonostante una quasi totale compatibilità dei comandi e delle funzioni non dimentichiamo che stiamo migrando verso una piattaforma OOP e quindi bisogna tener conto dell’utilizzo e dell’interazione con gli oggetti e il sistema di gestione degli eventi ad essi associato.

 

Gran parte del codice originario potrà sicuramente essere riutilizzato ma messo nel posto giusto una volta che avremo capito la filosofia di un simile ambiente di sviluppo.

 

 

Il sistema degli eventi

 

Il sistema degli eventi è la chiave di tutto e attorno ad esso si sviluppa l’intera applicazione di VFP.

Innanzitutto dobbiamo tener conto che dovremo iniziare a lavorare con delle interfacce grafiche e che ogni cosa che vedremo o disegneremo sul nostro schermo dell’ambiente di sviluppo sarà un oggetto.

 

In Clipper solitamente si iniziava con il pulire lo schermo (Clear) e con lo scriverci sopra con dei comandi del tipo @ x,y say “cTesto” e magari attendere degli input da parte dell’utente con dei comandi del tipo Get Read in eventuali schermate delimitate da box e linee; in seguito si facevano tutte le elaborazioni con il resto del codice. Ci basterà tradurre qualcosa del genere nell’ambiente di sviluppo di VFP per iniziare a capire come strutturare un’applicazione OOP.

Ad esempio immaginiamo di dover riscrivere una procedura per la gestione di un semplice database “Clienti” così strutturato:

 

CODICE                     

NOME

INDIR

CITTA

NUMTEL

Numerico

Carattere

Carattere

Carattere

Carattere

4

25

25

20

10

 

Vorrei ricordare che questo documento è strettamente rivolto ai neofiti e a chi volesse riscrivere del codice xbase nel modo più indolore possibile in un ambiente nuovo e sconosciuto, quindi procederemo con delle metodiche molto simili al vecchio linguaggio in modo da rendere il più possibile incoraggiante il lavoro di migrazione.

Innanzitutto per scrivere la nostra applicazione dovremo iniziare un nuovo “Progetto” quindi dal menù principale di VFP selezioniamo new e poi project, assegnamo un nome al progetto (ad esempio “prgClienti”) aprendo in questo modo il project manager.

 

 

Con nostra grande soddisfazione vedremo che possiamo riscrivere un codice di procedura con le stesse istruzioni di Clipper per aprire e gestire un archivio dbf che cominceremo a chiamare nel gergo di VFP “tabella”.

 

Genericamente si dovrebbero visualizzare i campi della tabella Clienti e permettere tramite alcune funzioni di andare avanti e indietro nell’archivio. A nostro tempo avremmo scritto una serie di say e get del tipo @ x,y say cCampo1 get vCampo1 per visualizzare e modificare i campi del record corrente e avremmo programmato alcuni tasti per permettere l’avanzamento all’interno dell’archivio. Generalmente si usava assegnare il valore di un campo cCampo1 in una variabile vCampo1 per permetterne l’input e la convalida.

 

Vediamo come si sviluppa regolarmente in Fox qualcosa del genere

 

Dalla sezione Code/Program selezioniamo New. Nella finestra dell’editor possiamo scrivere le nostre semplici istruzioni per aprire la tabella e inizializzare le variabili.

 

USE Clienti in 0

SELECT Clienti

SET INDEX TO Cli-Cod,Cli-Nom

Set Order to 2

set filter to .not. deleted()

go top

 

v_codice = clienti.codice

v_nome = clienti.nome

v_indir = clienti.indir

v_citta = clienti.citta

v_numtel = clienti.numtel

 

Segnaliamo subito una piccola differenza del comando USE. In Clipper si utilizzava il parametro New per aprire la tabella in una nuova area di lavoro; Ora invece si utilizza la clausola “in 0” per dire a Fox di inizializzare una nuova area e inoltre bisogna selezionarla (SELECT) perché questo non avviene in automatico tramite USE contrariamente a quanto avveniva con Clipper.

Una volta aperta la tabella avremo bisogno di disegnare una schermata adatta alla navigazione dell’archivio e progettare tutte le funzioni che ci permettano quindi di spostare avanti e indietro i record della tabella, aggiungere e cancellare un record.

Iniziamo a chiamare le nostre schermate in un modo diverso; siano esse schermate per la visualizzazione e l’input di dati, schermate di avviso o semplici messaggi, ma in ogni caso qualsiasi forma sullo schermo nella quale sia visualizzato qualcosa, questa forma la chiameremo per l’appunto “Form”.

 

Un form è l’oggetto per eccellenza di un ambiente di sviluppo OOP come VFP; tramite i form potremo fare qualsiasi cosa, basta immaginare che la finestra principale di Fox è di per sé un form.

Quindi disegniamo subito un form sul nostro desktop: dalla sezione Documents/Forms selezioniamo New e poi New Form. A questo punto comparirà a video la finestra “Form Designer” con dentro un nuovo form vuoto.

 

 

Naturalmente questo Form1 è la nostra finestra nella quale andremo a disporre ,o disegnare, tutto quello che ci serve per permettere la navigazione della tabella Clienti. Per disegnare all’interno del form, il form designer ci mette a disposizione una serie di strumenti o Controlli localizzati nella toolbar Form Controls; basterà selezionare uno di questi controlli dalla barra dei controlli e dimensionarla sul nostro form.

 

I vecchi comandi di Clipper @ x,y say … get non esistono infatti ci sono strumenti analoghi per la visualizzazione e l’input dei dati, questi sono le cosiddette TextBox. Una TextBox è uno dei controlli più semplici di VFP e ci permette di visualizzare un’informazione sul form. Disegniamo una textbox sul nostro Form1 selezionandola dalla barra dei controlli. Automaticamente VFP attribuisce un nome al nuovo controllo sul form per cui chiamerà sicuramente la nostra textbox “text1”. Disegneremo una textbox per ognuno dei campi che vorremo visualizzare nel form; per etichettare le informazioni contenute nelle textbox cioè descriverne il significato, utilizziamo il controllo Label disegnandone uno accanto ad ogni textbox.

 

In questo modo si dovrebbe già riuscire a familiarizzare un po’ con il form designer e rendersi conto di quanto sia semplice e potente disegnare un’interfaccia utente.

 

Secondo la filosofia dell’ OOP ogni controllo o oggetto, possiede delle proprietà che ne definiscono l’aspetto e ne influenzano anche il comportamento. Per accedere e modificare le proprietà di uno degli oggetti visualizzati sul form si usa la finestra delle proprietà accessibile dal menù View/Properties. Nel nostro caso appare la finestra Properties – FormDoc1 che è il nome che VFP assegna provvisoriamente al file del nostro form.

 

Nel caso delle nostre textbox definiamo per ognuna di esse la propria lunghezza in modo da poterci visualizzare per intero il contenuto del campo corrispondente oppure semplicemente ai fini di migliorare l’aspetto del form. Basta quindi modificare la proprietà width dalla finestra delle proprietà di ciascuna textbox.

 

Ritornando al nostro progetto vediamo come visualizzare il contenuto dei campi all’interno delle text. Nella proprietà control source di ciascuna textbox andiamo a scrivere il nome della variabile che deve essere visualizzata. Esempio:

 

 

In questo modo, una volta che il form andrà in esecuzione, le textbox conterranno le variabili e potranno essere manipolate come se si intervenisse direttamente sulle variabili associate. Una volta preparato il form per la visualizzazione del record Clienti, lo salviamo e andiamo a scrivere il nostro codice.

 

USE Clienti in 0
SELECT Clienti
SET INDEX TO Cli-Cod,Cli-Nom
Set Order to 2
set filter to .not. deleted()
go top
 
v_codice = clienti.codice
v_nome = clienti.nome
v_indir = clienti.indir
v_citta = clienti.citta
v_numtel = clienti.numtel

 

A questo punto il programma dovrà avviare l’interfaccia che abbiamo disegnato:

 
DO FORM Form1

 

Possiamo eseguire il programma e iniziare a vedere qualcosa, quindi selezioniamo il nostro program1 e il pulsante Run.

 

Effettivamente abbiamo solo visualizzato il form ma questo non ci permette di fare alcuna operazione sull’archivio, per questo dobbiamo dotare il form degli strumenti necessari per farlo e scrivere di conseguenza il codice per ogni procedura.

 

In genere per eseguire delle funzioni da un form si utilizzano i pulsanti o command button. Ad ogni command button è associato un codice di procedura che viene eseguito ogni volta che il pulsante viene premuto.

 

Per quanto riguarda le funzioni del nostro form, abbiamo bisogno dei pulsanti per scorrere avanti e indietro i record dell’archivio, un pulsante per aggiungere un nuovo record e un altro per la convalida.

Disegniamoli quindi sul form scegliendo lo strumento Command Button dalla toolbar Form Control e assegniamo un nome ad ognuno di essi, ad esempio cmdAvanti, cmdIndietro, cmdNuovo, cmdConferma.

 

 

Ora, dovremo programmare ognuno di questi pulsanti con le funzioni che a nostro tempo avremmo assegnato ai famosi tasti funzione. Per far questo bisogna scrivere l’evento click del pulsante.

 

Facciamo doppio click sulla proprietà Click Event del pulsante e scriviamo nella finestra del codice la procedura corrispondente, quindi:

 

evento cmdAvanti.click

If .not. eof()
            Skip
v_codice = clienti.codice
v_nome = clienti.nome
v_indir = clienti.indir
v_citta = clienti.citta
v_numtel = clienti.numtel
Endif

 

Naturalmente ogni volta che il valore dei controlli cambia, bisogna aggiornare il form e quindi operare un refresh del form affinché questo visualizzi i valori aggiornati.

 

thisform.refresh

 

 

evento cmdIndietro.click

 

If .not. bof()
            Skip –1
v_codice = clienti.codice
v_nome = clienti.nome
v_indir = clienti.indir
v_citta = clienti.citta
v_numtel = clienti.numtel
Endif
thisform.refresh
 
evento cmdNuovo.click
 
Append blank
v_codice = clienti.codice
v_nome = clienti.nome
v_indir = clienti.indir
v_citta = clienti.citta
v_numtel = clienti.numtel
thisform.refresh
 
evento cmdConferma.click
 
Replace clienti.codice with v_codice
Replace clienti.nome with v_nome
Replace clienti.indir with v_indir
Replace clienti.citta with v_citta
Replace clienti.numtel with v_numtel

 

Ora possiamo salvare il form ed eseguire il programma, vedremo il risultato di un semplicissimo sforzo di programmazione in questo ambiente di sviluppo.

Abbiamo adottato tecniche assolutamente spartane ma sicuramente efficaci per rendere comprensibile la facilità con cui si può scrivere un applicazione VFP con metodi e comandi ereditati da xbase.

 

Sta ora alla capacità e alla passione del nuovo collega “volpacchiotto” l’impegno di migliorare ed imparare a scrivere codice più complesso e sfruttare le numerose potenzialità del linguaggio avvalendosi magari dell’aiuto di un importante e fantastico strumento quale è FoxItaly.

 

 

Suggerimenti, buchi, pugni, palme e tutte le altre cose :-)) -->> Mimmo Micelli

© FoxPro e Visual FoxPro sono un marchi registrati da Microsoft Corporation

 



Data: 21/07/2001
webmaster@foxitaly.com

dal 22 Giugno 1999