Introduzione.
La scorsa settimana abbiamo creato una classe derivata ClsVolume Object, utilizzando Class ClsArea come classe base. Abbiamo creato procedure di proprietà nella classe derivata per esporre le proprietà e la funzione della classe base ai programmi utente dell'oggetto. Questo metodo richiede la ripetizione di tutte le procedure di proprietà della Classe Base anche nella classe derivata. Qui, esploriamo come creare la stessa classe ClsVolume derivata senza ripetere le procedure di proprietà della classe ClsArea di base.
Abbiamo imparato l'uso di Ottieni e Lascia Procedure di proprietà nelle classi. C'è un'altra procedura di proprietà usata nelle classi:il Set Procedura di proprietà. La Procedura Set Property assegna direttamente un Oggetto a un Oggetto Classe dello stesso Tipo.
Prima di continuare oltre puoi visitare le pagine precedenti su questo argomento, se non l'hai già fatto, i link sono riportati di seguito:
- Modulo di classe MS-Access e VBA
- Matrici di oggetti di classe VBA MS-Access
- Classe base MS-Access e oggetti derivati
ClsVolume Class, il Makeover.
Creeremo una variante diversa dello stesso ClsVolume Class Module, che abbiamo creato la scorsa settimana, utilizzando ClsArea come Classe Base, con un approccio diverso e con meno codice.
Crea un nuovo modulo di classe e modifica il valore della proprietà Name in ClsVolume2 .
Copia e incolla il seguente codice nel modulo della classe ClsVolume2 e salva il modulo:
Option Compare Database Option Explicit 'Method two-1 Private p_Height As Double Private p_Area As ClsArea Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) p_Height = dblNewValue End Property Public Function Volume() As Double Volume = p_Area.dblLength * p_Area.dblWidth * p_Height End Function
"Nuovo Ottieni e Imposta Procedura di proprietà per la proprietà ClsArea ObjectsPublic Ottieni CArea() As ClsArea Imposta CAArea =p_AreaEnd PropertyPublic Imposta proprietà CArea(ByRef AreaValue As ClsArea) Imposta p_Area =Proprietà AreaValueEnd
Seleziona Compila Nome progetto da Debug Menu per compilare il codice VBA nel database per garantire che tutto il codice del progetto VBA sia privo di errori. Se hai riscontrato un errore negli altri tuoi programmi VBA, rintraccia l'errore, correggilo e ricompila il tuo progetto. In caso contrario, VBA IntelliSense che visualizza un elenco di proprietà e funzioni di Oggetti non funzionerà. Ciò non ci impedirà di assegnare/recuperare valori a/da Proprietà oggetto. Ma, durante l'apprendimento, è importante vedere le proprietà di un oggetto che si apre e mostra l'elenco, come assistente in Coding.
Ottieni/Imposta invece della procedura Get/Let Property.
Abbiamo omesso tutte le procedure di proprietà di ClsArea, creata nell'ultima versione di ClsVolume Class, e le abbiamo sostituite con un Get/Set Procedure di proprietà, invece di Ricevi/Consenti . Controlla l'Area di dichiarazione dove abbiamo dichiarato p_Area è dichiarato come oggetto classe ClsArea.
Quando un oggetto viene dichiarato in questo modo, normalmente dovremmo creare un'istanza di questo oggetto nella procedura Class_Initialize() nel codice sopra. Non l'abbiamo fatto qui perché prevediamo di farlo nel Programma utente e riempire le sue Proprietà con i valori appropriati e quindi passarlo alla Classe ClsVolume2, prima della fase di calcolo finale per utilizzare i loro valori.
Prendi nota di Set CArea() procedura. Il parametro ByRef AreaValue viene dichiarato come ClsArea Object. Accetterà l'oggetto classe ClsArea quando passato a Property Set CAa(ByRef AreaValue as ClsArea) , nella variabile oggetto AreaValue, e assegna alla p_Area Proprietà di ClsVolume2 Oggetto.
Ottieni CArea() La procedura di proprietà restituisce l'Oggetto al programma chiamante.
Nei nostri programmi precedenti, abbiamo scritto procedure di proprietà per i singoli elementi (Lunghezza, Larghezza, Altezza) di un oggetto da assegnare/restituire valori A/Da loro. Qui, la differenza è che stiamo passando un intero oggetto come parametro alla procedura Set. Per recuperare il valore della proprietà di questo oggetto (diciamo lblHeight) dobbiamo indirizzarlo come CArea.dblLength . Il Ottieni/Imposta Proprietà Nome procedura CArea diventa l'oggetto figlio dell'oggetto principale quando dichiarato nel programma principale e le relative procedure di proprietà sono accessibili direttamente tramite l'indirizzo dell'oggetto Vol.CArea.dblLength.
Un programma di test in modulo standard.
Scriveremo un piccolo programma nel modulo standard per testare il nostro nuovo oggetto classe derivato ClsVolume2.
Inserisci un nuovo Modulo Standard nel tuo Progetto. Copia e incolla il seguente codice nel modulo e salva il codice:
Public Sub SetNewVol2_1() 'Method 1/2 Dim Vol As New ClsVolume2 'ClsArea Object instantiated and passed to the 'Property Procedure Set CArea in ClsVolume2. Set Vol.CArea = New ClsArea 'declare and instantiate the object in one statement Stop Vol.CArea.strDesc = "Bed Room" Vol.CArea.dblLength = 90 Vol.CArea.dblWidth = 10 Vol.dblHeight = 10 'assign height to ClsVolume2 Stop Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" Debug.Print Vol.CArea.strDesc, Vol.CArea.dblLength, Vol.CArea.dblWidth, Vol.CArea.Area, Vol.dblHeight, Vol.Volume Set Vol.CArea = Nothing Set Vol = Nothing End Sub
Revisione del codice riga per riga.
Diamo una rapida occhiata al codice VBA sopra. La prima riga istanzia la classe ClsVolume2 con il nome Vol. Dopo le due righe di commento successive, il Set dichiarazione con il Vol.CArea La procedura di proprietà viene chiamata e passa il Nuovo ClsArea istanziata Oggetto come parametro.
Metto uno Stop istruzione nella riga successiva per fare una pausa nel Programma per vedere come l'oggetto viene assegnato al Set Carea Oggetto. Come? lo esploreremo tra un minuto?
Le quattro righe successive assegnano valori all'oggetto ClsArea e alla proprietà Height dell'oggetto ClsVolume2.
Il prossimo Stop crea una pausa nel Programma in modo da poter ispezionare la memoria di come i valori vengono mantenuti in memoria.
La riga successiva stampa le intestazioni nella finestra di debug per i valori stampati nella riga successiva.
La riga successiva stampa i valori delle proprietà dell'oggetto dalla memoria nella finestra di debug.
Esegui il codice fino all'istruzione Next Stop
Eseguiamo il codice e ispezioniamo la memoria per vedere cosa succede in ogni fase, in cui ho inserito l'istruzione Stop.
- Fai clic da qualche parte nel mezzo del codice e premi F5 per eseguire il codice e mettere in pausa il programma alla prima istruzione Stop.
- Seleziona Finestra Locali da Visualizza Menu per aprire una nuova finestra sotto la finestra del codice, per visualizzare come vengono mantenuti in memoria gli oggetti ClsArea e ClsVolume2, le loro proprietà e le relative procedure di proprietà dei membri. Un'immagine di esempio della Finestra Locals è riportato di seguito.
La Finestra Locali Visualizza.
Trascina le maniglie di ridimensionamento di altre finestre verso l'alto per ridurne l'altezza per dare più spazio per la visualizzazione di Locals Finestra. Meglio, chiudi la finestra di debug, per il momento usa Ctrl+G per riportarla indietro quando necessario in un secondo momento.
Possiamo avere una vista grafica di tutti gli oggetti e le loro proprietà in Locals Finestra. Il nome con il simbolo più [+] mostra il nome del Modulo Standard, da cui è in esecuzione il nostro programma.
Il successivo simbolo più [+] con il nome Vol è l'oggetto istanziato ClsVolume2 in memoria.
- Fai clic sui simboli [+] per espandere e visualizzare i dettagli.
Troverai il livello successivo di Oggetti e Proprietà.
L' [+]Carea indica che questo Oggetto ha il livello successivo di Proprietà e relativi Valori.
Il dblHeight Ottieni proprietà La procedura rientra direttamente nell'oggetto Vol.
L'[+]p_Area è la proprietà privata dichiarata come ClsArea Classe nella classe ClsVolume2.
La p_Height è anche la Proprietà Privata dichiarata nel ClsVolume2.
- Fai clic sul segno più [+] simboli per espandere gli oggetti per mostrare le loro proprietà e valori.
L'espansione di [+]CArea ci dà la vista dell'oggetto ClsArea che abbiamo passato alla procedura della proprietà Set CArea().
L'espansione di [+]p_Area fornisce la visualizzazione della Proprietà ClsArea dichiarata come Privata.
Nota la p_Area Proprietà Privata, di ClsVolume2 Class Object, e tutti i suoi elementi sono accessibili solo attraverso la CArea Proprietà dell'oggetto Ottieni/Imposta Procedure verso il mondo esterno.
La seconda colonna della finestra Locali mostrerà i valori assegnati alle Proprietà dell'oggetto e attualmente nessun valore in esse.
La terza colonna mostra il tipo di dati o i nomi dei moduli delle classi di oggetti.
- Premere F5 per eseguire ulteriormente il programma, fino a quando non viene messo in pausa alla successiva istruzione Stop, per assegnare alcuni valori nelle proprietà dell'oggetto. Il programma si fermerà alla prossima Stop dichiarazione. Controllare la finestra Locals per la modifica dei valori.
All'interno dell'CArea Object le prime due righe con valori 90, 10 e l'ultima strDesc con valore "Bed Room" sono Get Procedure di proprietà. p_Desc, p_Length e p_width sono valori assegnati tramite Set Procedure di proprietà per p_Area Proprietà dell'oggetto classe ClsVolume2.
L'p_Area L'oggetto della classe ClsArea dichiarato come proprietà privata di ClsVolume2 viene visualizzato con il suo Get/Set Proprietà Procedure e valori assegnati.
Controlla il Tipo Colonna di [-]CArea e [-]p_Area entrambi gli oggetti sono derivati dalla classe base ClsArea.
Utilizzo degli oggetti di classe ClsArea e ClsVolume2 in modo diverso.
La prossima settimana proveremo un altro approccio con gli stessi due oggetti. Se vuoi provarlo tu stesso, ecco l'indizio su come provarlo tu stesso.
- Crea un'istanza ClsVolume2 e ClsArea Class come due oggetti diversi nel programma del modulo standard.
- Assegna valori a entrambe le proprietà dell'oggetto.
- Assegna l'oggetto istanziato ClsArea alla CArea Oggetto nell'oggetto classe ClsVolume2, prima di stampare i valori nella finestra di debug.
In questo esempio, possiamo ottenere lo stesso risultato dell'esempio precedente, senza ripetere le procedure della proprietà Get/Let come abbiamo fatto nel modulo della classe ClsVolume.
I link di tutte le pagine su questo argomento.
- Modulo di classe MS-Access e VBA
- Matrici di oggetti di classe VBA MS-Access
- Classe base MS-Access e oggetti derivati
- Classe base VBA e oggetti derivati-2
- Classe base e varianti di oggetti derivati
- Recordset Ms-Access e modulo di classe
- Accedi al modulo di classe e alle classi wrapper
- Trasformazione della funzionalità della classe wrapper
- Nozioni di base su Ms-Access e Collection Object
- Modulo di classe Ms-Access e oggetto Collection
- Record di tabella nell'oggetto e nella forma della raccolta
- Nozioni di base sugli oggetti del dizionario
- Nozioni di base sugli oggetti del dizionario-2
- Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
- Visualizza record dal dizionario al modulo
- Aggiungi oggetti classe come elementi del dizionario
- Aggiungi oggetti classe come elementi del dizionario
- Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo