Differenze tra le versioni di "Gestire Funzioni come oggetti"
Riga 1: | Riga 1: | ||
''Funzioni'' e ''Procedure'', presenti sia in Moduli o in Classi principali sia in Moduli o Classi secondarie specifiche, possono essere gestite e chiamate mediante la Classe ''Object''. <SUP>[[[#Note|nota 1]]]</sup> | ''Funzioni'' e ''Procedure'', presenti sia in Moduli o in Classi principali sia in Moduli o Classi secondarie specifiche, possono essere gestite e chiamate mediante la Classe ''Object''. <SUP>[[[#Note|nota 1]]]</sup> | ||
− | Le Funzioni, da invocare mediante il metodo " | + | Le Funzioni, da invocare mediante il metodo "Object.Call()" e specificate con il loro nome identificatore, come stringa, nel suo secondo parametro, devono essere dichiarate come ''Pubbliche''. |
==''Funzioni'' e ''Procedure'' poste all'interno della medesima Classe o Modulo della funzione chiamante== | ==''Funzioni'' e ''Procedure'' poste all'interno della medesima Classe o Modulo della funzione chiamante== | ||
− | Si tratta di assegnare il nome identificativo della ''Classe'' principale, dunque ''FMain'' oppure ''Me'', ad una variabile di tipo ''Oggetto'', con la quale effettuare la chiamata della Funzione con il | + | Si tratta di assegnare il nome identificativo della ''Classe'' principale, dunque ''FMain'' oppure ''Me'', ad una variabile di tipo ''Oggetto'', con la quale effettuare la chiamata della Funzione con il Metodo "Object.Clall()" . |
====Esempio in ambiente grafico==== | ====Esempio in ambiente grafico==== | ||
Riga 14: | Riga 14: | ||
Dim ob As Object | Dim ob As Object | ||
− | + | ob = <FONT Color=#B22222>FMain</font> <FONT Color=gray>' ''E' possibile usare anche "Me" anziché FMain''</font> | |
− | + | i = Object.Call(ob, "Somma", [3, 4]) | |
− | + | Print i | |
'''End''' | '''End''' | ||
− | |||
<FONT Color=#B22222>'''Public'''</font> Function Somma(a As Integer, b As Integer) As Integer <FONT Color=gray>' ''<--- La Funzione deve essere dichiarata come "Pubblica"''</font> | <FONT Color=#B22222>'''Public'''</font> Function Somma(a As Integer, b As Integer) As Integer <FONT Color=gray>' ''<--- La Funzione deve essere dichiarata come "Pubblica"''</font> | ||
Riga 27: | Riga 26: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | i = a + b | |
− | + | Return i | |
'''End''' | '''End''' | ||
+ | Va fatto notare che il 3° parametro formale del Metodo "Object.Call()" richiede comunque che il tipo di dato o l'Oggetto passato sia ridotto a un array, e ciò anche se esso è già un array. In tal senso dunque, se si passa al 3° argomento un array, bisognerà inserire la variabile di tale Oggetto array nelle parentesi quadre per renderlo così un array di array. | ||
Riga 41: | Riga 41: | ||
Dim i As Integer | Dim i As Integer | ||
− | |||
− | |||
− | |||
− | + | i = Object.Call(<FONT Color=#B22222>Me</font>, "Somma", [3, 4]) | |
− | + | Print i | |
'''End''' | '''End''' | ||
− | |||
<FONT Color=#B22222>'''Public'''</font> Function Somma(a As Integer, b As Integer) As Integer <FONT Color=gray>' ''<--- La Funzione deve essere dichiarata come "Pubblica"''</font> | <FONT Color=#B22222>'''Public'''</font> Function Somma(a As Integer, b As Integer) As Integer <FONT Color=gray>' ''<--- La Funzione deve essere dichiarata come "Pubblica"''</font> | ||
Riga 56: | Riga 52: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | i = a + b | |
− | + | Return i | |
'''End''' | '''End''' | ||
− | |||
− | |||
Vediamo un altro esempio: | Vediamo un altro esempio: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 69: | Riga 63: | ||
Dim ris As Integer | Dim ris As Integer | ||
− | + | ob = Me | |
− | + | ris = PrimaFunzione(2, ob) | |
− | + | Print ris | |
'''End''' | '''End''' | ||
− | |||
'''Private''' Function PrimaFunzione(i As Integer, fnz As Object) As Integer | '''Private''' Function PrimaFunzione(i As Integer, fnz As Object) As Integer | ||
Riga 83: | Riga 76: | ||
Dim v As Variant | Dim v As Variant | ||
− | + | n = i * 100 | |
− | + | v = Object.Call(fnz, "Funzione_Chiamata", [n]) | |
− | + | Return CInt(v) | |
'''End''' | '''End''' | ||
− | |||
<FONT Color=#B22222>'''Public'''</font> Function Funzione_Chiamata(c As Integer) As Integer | <FONT Color=#B22222>'''Public'''</font> Function Funzione_Chiamata(c As Integer) As Integer | ||
− | + | Return c * 100 | |
'''End''' | '''End''' | ||
− | |||
Riga 118: | Riga 109: | ||
'''Public''' Function _call(i As Integer) As Integer | '''Public''' Function _call(i As Integer) As Integer | ||
− | + | Return i * 10 | |
'''End''' | '''End''' | ||
− | |||
− | |||
La Classe specifica, che chiameremo ''Class1'', sarà così scritta: | La Classe specifica, che chiameremo ''Class1'', sarà così scritta: | ||
Create | Create | ||
Riga 129: | Riga 118: | ||
'''Public''' Function _call(s As String) As String | '''Public''' Function _call(s As String) As String | ||
− | + | Return s & " 10 = " | |
'''End''' | '''End''' | ||
− | + | ||
− | |||
'''Public''' Procedure ClSub() | '''Public''' Procedure ClSub() | ||
− | + | Print "Procedura chiamata con 'Object.Call()'" | |
'''End''' | '''End''' | ||
− | |||
− | |||
Mentre la Classe principale dell'applicativo sarà la seguente: | Mentre la Classe principale dell'applicativo sarà la seguente: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | + | Chiamata(Class1, Module1) | |
'''End''' | '''End''' | ||
− | |||
'''Public''' Procedure Chiamata(obCl <FONT color=#B22222>As Object</font>, obMod <FONT color=#B22222>As Object</font>) | '''Public''' Procedure Chiamata(obCl <FONT color=#B22222>As Object</font>, obMod <FONT color=#B22222>As Object</font>) | ||
− | + | Dim i As Integer | |
− | + | Dim s As String | |
− | + | s = obCl("7 x") | |
− | + | i = obMod(7) | |
− | + | Print s; i | |
<FONT Color=gray>' ''Chiamata di Funzione qui con il metodo "Object.Call()":''</font> | <FONT Color=gray>' ''Chiamata di Funzione qui con il metodo "Object.Call()":''</font> | ||
− | + | Object.Call(obCl, "ClSub", Null) | |
'''End''' | '''End''' | ||
− | |||
− | |||
====Esempio con applicazione ''a riga di comando''==== | ====Esempio con applicazione ''a riga di comando''==== | ||
Riga 175: | Riga 158: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | i = a + b | |
− | + | Return i | |
'''End''' | '''End''' | ||
Riga 186: | Riga 169: | ||
Dim ob As Object | Dim ob As Object | ||
− | + | ob = <FONT Color=#B22222>Module1</font> | |
− | + | i = Object.Call(ob, "Somma", [3, 4]) | |
− | + | Print i | |
'''End''' | '''End''' | ||
− | |||
− | |||
Nel caso, invece, si abbia una ''Classe'' secondaria, sarà necessario semplicemente aggiungere all'interno di detta ''Classe'' specifica secondaria la parola chiave ''Create''. | Nel caso, invece, si abbia una ''Classe'' secondaria, sarà necessario semplicemente aggiungere all'interno di detta ''Classe'' specifica secondaria la parola chiave ''Create''. | ||
Riga 205: | Riga 186: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | i = a + b | |
− | + | Return i | |
'''End''' | '''End''' | ||
Riga 216: | Riga 197: | ||
Dim ob As Object | Dim ob As Object | ||
− | + | ob = <FONT Color=#B22222>Class1</font> | |
− | + | i = Object.Call(ob, "Somma", [3, 4]) | |
− | + | Print i | |
'''End''' | '''End''' | ||
Riga 228: | Riga 209: | ||
=Note= | =Note= | ||
[1] Vedere anche queste pagine analoghe: | [1] Vedere anche queste pagine analoghe: | ||
− | * [[ | + | * [[Usare una Classe come fosse una Funzione]] |
− | * [[ | + | * [[Emulare i Puntatori a Funzione del linguaggio C mediante gli Oggetti]] |
Versione delle 13:44, 10 ott 2022
Funzioni e Procedure, presenti sia in Moduli o in Classi principali sia in Moduli o Classi secondarie specifiche, possono essere gestite e chiamate mediante la Classe Object. [nota 1]
Le Funzioni, da invocare mediante il metodo "Object.Call()" e specificate con il loro nome identificatore, come stringa, nel suo secondo parametro, devono essere dichiarate come Pubbliche.
Indice
Funzioni e Procedure poste all'interno della medesima Classe o Modulo della funzione chiamante
Si tratta di assegnare il nome identificativo della Classe principale, dunque FMain oppure Me, ad una variabile di tipo Oggetto, con la quale effettuare la chiamata della Funzione con il Metodo "Object.Clall()" .
Esempio in ambiente grafico
Mostriamo un semplice esempio con applicazione in ambiente grafico:
Public Sub Form_Open() Dim i As Integer Dim ob As Object ob = FMain ' E' possibile usare anche "Me" anziché FMain i = Object.Call(ob, "Somma", [3, 4]) Print i End Public Function Somma(a As Integer, b As Integer) As Integer ' <--- La Funzione deve essere dichiarata come "Pubblica" Dim i As Integer i = a + b Return i End
Va fatto notare che il 3° parametro formale del Metodo "Object.Call()" richiede comunque che il tipo di dato o l'Oggetto passato sia ridotto a un array, e ciò anche se esso è già un array. In tal senso dunque, se si passa al 3° argomento un array, bisognerà inserire la variabile di tale Oggetto array nelle parentesi quadre per renderlo così un array di array.
Esempio con applicazione a riga di comando
Nel caso di applicazione a riga di comando alla variabile di tipo Oggetto andrà assegnata la parola chiave "Me".
Mostriamo un semplice esempio:
Public Sub Main() Dim i As Integer i = Object.Call(Me, "Somma", [3, 4]) Print i End Public Function Somma(a As Integer, b As Integer) As Integer ' <--- La Funzione deve essere dichiarata come "Pubblica" Dim i As Integer i = a + b Return i End
Vediamo un altro esempio:
Public Sub Main() Dim ob As Object Dim ris As Integer ob = Me ris = PrimaFunzione(2, ob) Print ris End Private Function PrimaFunzione(i As Integer, fnz As Object) As Integer Dim n As Integer Dim v As Variant n = i * 100 v = Object.Call(fnz, "Funzione_Chiamata", [n]) Return CInt(v) End Public Function Funzione_Chiamata(c As Integer) As Integer Return c * 100 End
Funzioni e Procedure poste in altra Classe o Modulo
Vediamo ora il caso in cui la Funzione da richiamare, sia posta in una Classe o in un Modulo diverso da quelli principali. In ogni caso alle rispettive variabili di tipo Oggetto dovranno essere assegnati i Moduli e le Classi secondarie.
Esempio in ambiente grafico
In un'applicazione in ambiente grafico il Modulo o la Classe specifica deve avere, come intestazione, la parola chiave "Create". Inoltre, le Funzioni e le Procedure, presenti in Moduli o in Classi specifiche, saranno rappresentate dal metodo speciale _call(), che viene appunto dichiarato quando l'oggetto è usato per richiamare una funzione.
Le Funzioni e Procedure presenti in una Classe specifica possono essere chiamate anche mediante il metodo Object.Call(). In tal caso non si utilizzerà il metodo speciale _call() . La chiamata di Funzioni e Procedure possono essere effettuate con il metodo Object.Call() anche se esse sono presenti in un Modulo; ma in tal caso non deve essere presente nel Modulo la parola chiave "Create".
Mostriamo un esempio, nel quale si avrà un applicativo composto anche da un Modulo e da una Classe specifica, ciascuno contenente una funzione.
Il Modulo, che chiamaremo Module1, sarà così scritto:
Create Public Function _call(i As Integer) As Integer Return i * 10 End
La Classe specifica, che chiameremo Class1, sarà così scritta:
Create Public Function _call(s As String) As String Return s & " 10 = " End Public Procedure ClSub() Print "Procedura chiamata con 'Object.Call()'" End
Mentre la Classe principale dell'applicativo sarà la seguente:
Public Sub Form_Open() Chiamata(Class1, Module1) End Public Procedure Chiamata(obCl As Object, obMod As Object) Dim i As Integer Dim s As String s = obCl("7 x") i = obMod(7) Print s; i ' Chiamata di Funzione qui con il metodo "Object.Call()": Object.Call(obCl, "ClSub", Null) End
Esempio con applicazione a riga di comando
In un'applicazione a riga di comando, invece, il Modulo secondario, contenente la Funzione da richiamare, non necessita della parola chiave Create. Inoltre, nel Modulo principale alla variabile di tipo Oggetto andrà assegnato il Modulo secondario.
Mostriamo un esempio, nel quale il Modulo, assegnato alla variabile di tipo Oggetto e contenente la Funzione da richiamare, sia il seguente:
Public Function Somma(a As Integer, b As Integer) As Integer ' <--- La Funzione deve essere dichiarata come "Pubblica" Dim i As Integer i = a + b Return i End
Mentre Il Modulo principale è il seguente:
Public Sub Main() Dim i As Integer Dim ob As Object ob = Module1 i = Object.Call(ob, "Somma", [3, 4]) Print i End
Nel caso, invece, si abbia una Classe secondaria, sarà necessario semplicemente aggiungere all'interno di detta Classe specifica secondaria la parola chiave Create.
Supponiamo che la Classe secondaria sia chiamata "Class1", e sia la seguente:
Create Public Function Somma(a As Integer, b As Integer) As Integer ' <--- La Funzione deve essere dichiarata come "Pubblica" Dim i As Integer i = a + b Return i End
Mentre Il Modulo principale è il seguente:
Public Sub Main() Dim i As Integer Dim ob As Object ob = Class1 i = Object.Call(ob, "Somma", [3, 4]) Print i End
Note
[1] Vedere anche queste pagine analoghe: