Programmazione Object-Oriented 3


 

 

Tratto da Programmer's Guide Traduzione di Baldarelli Gian-Carlo

Precedenti:

 

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]
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.
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 dentro il codice del 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

Assegnare codice per metodi ed 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:

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
          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

Codice Commento
DEFINE CLASS Navbutton ASCOMMANDBUTTON
     Height = 25
     Width = 25
     TableAlias = ""
Definisce la classe genitrice dei tasti di navigazioneFornisce alla classe alcune dimensioni. Include una proprietà personale, TableAlias, per memorizzare l'alias in cui navigare.
     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

Codice Commento
DEFINE CLASS navTop AS Navbutton Caption = "|<" Definisce il tasto principale e imposta la proprietà Caption ( nome che appare sul tasto ).
    PROCEDURE Click Crea il codice per gestire il metodo quando accade l'evento click del controllo.

            DODEFAULT( )

            GO TOP

            THIS.RefreshForm

Richiama il codice dell'evento click della classe genitrice., Navbutton, in modo che l'appropriato alias venga selezionato se la proprietà TableAlias è stata selezionata. Include il codice per impostare il puntatore dei record sul primo record della tabella: GO TOP.Chiama il metodo RefreshForm nella classe genitrice. Non è necessario utilizzare l'operatore scope resolution (::) in questa classe perché non esiste alcun metodo nella sottoclasse con lo stesso nome della classe genitrice. D'altra parte, sia la classe genitrice che la sottoclasse hanno metodi per gestire l'evento click.
     ENDPROC Termina la procedura Click.
ENDDEFINE Termina la definizione della classe.

Gli altri tasti di navigazione hanno una definizione della classe simile.
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 Prior (precedente) ed imposta la proprietà didascalia.
      PROCEDURE Click
         DODEFAULT( )
         SKIP -1
         IF BOF( )
             GO TOP
         ENDIF
         THIS.RefreshForm
      ENDPROC
ENDDEFINE
Include il codice per impostare il puntatore al record precedente nella tabella.Termina la definizione della classe.
DEFINE CLASS navBottom ASNavbutton Caption = ">|" Definisce la classe del tasto Bottom (ultimo) ed imposta la proprietà didascalia.
   PROCEDURE Click
        DODEFAULT( )
        GO BOTTOM
        THIS.RefreshForm
   ENDPROC
ENDDEFINE
Include il codice per impostare il puntatore 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

Codice Commento
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


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.
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

Definizione di una classe griglia con una casella di controllo in una colonna della griglia



Procedure Init THIS.Column1.Width = 175 THIS.Column2.Width = 68 THIS.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 = ""ENDPROC 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 chk1.Imposta il CurrentControl della clonna 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.

Codice Commento

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 ="discontinued"
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 = 68             THIS.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 = ""
       ENDPROC
Il metodo AddObject vi consente di aggiungere un oggetto ad un container. In questo caso, una casella di controllo di nome chk1.Imposta il CurrentControl della clonna 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.

 

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.

Creare un 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
*--restituisce una referenza ad una nuova maschera invoice.
frmInv = CREATEOBJECT("InvoiceForm")
RETURN frmInv

DEFINE CLASS InvoiceForm AS FORM
ADD OBJECT txtCompany AS TEXTBOX
* codice per impostare proprità, aggiungere oggetti ecc.
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() && memorizza il riferimento all'oggetto in una variabile
frmInvoice.SHOW
Potete anche creare riferimenti ad oggetto in una maschera, come nel seguente esempio:
txtCustName = frmInvoice.txtCompany
txtCustName.Value = "Fox User"

Suggerimento 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

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)
* L'ggetto esiste
ELSE
* L'oggetto non esiste
ENDIF

Nota 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
                     * codice ...
              CASE nIndex = 2
                     * codice ...
              CASE nIndex = 3
                     * codice ...
              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:

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 tabella la 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:

DEFINE CLASS NewUser AS CUSTOM
  PROTECTED LogonTime, AccessLevel
  UserId = ""
  PassWord = ""
  LogonTime = { - - : : }
  AccessLevel = 0
  PROCEDURE Init
          DO FORM LOGON WITH ; && assumento che abbiate creato questa maschera
          This.UserId, ;
          This.PassWord, ;
          This.AccessLevel
          This.LogonTime = DATETIME( )
  ENDPROC
  * create metodi che restituiscono valori protetti di proprietà.
  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

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.


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

 

 

Febbraio 2002
 

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

Fonte: "Programmers Guide Visual FoxPro®" di Microsoft© in lingua inglese.
Questa guida ha il solo scopo di fornire le indicazioni
per muovere i primi passi con questo bellissimo strumento.

 


dal 22 Giugno 1999
webmaster@foxitaly.com