Differenze tra le versioni di "Gestire Funzioni come oggetti"

Da Gambas-it.org - Wikipedia.
 
(8 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
''Funzioni'' e ''Procedure'', presenti in Moduli o in Classi specifiche, possono essere gestite e chiamate come ''oggetti'', siano esse interne alla medesima ''Classe'' (o ''Modulo'') di quella della funzione chiamante, oppure poste in una ''Classe'' (o ''Modulo'') diversa da quella della funzione chiamante.
+
''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>&#091;[[#Note|nota 1]]&#093;</sup>
 
 
  
 +
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 ''Funzione'' o della ''Procedura'' ad una variabile di tipo ''Oggetto'', con la quale effettuare la chiamata con il metodo ''Object.Clall()'' .
+
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====
 
Mostriamo un semplice esempio con applicazione in ambiente ''grafico'':
 
Mostriamo un semplice esempio con applicazione in ambiente ''grafico'':
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim ob As Object
 
   Dim ob As Object
 
      
 
      
  ob = FMain  <FONT Color=gray>' ''E' possibile usare anche "Me" anziché FMain''</font>
+
  ob = <FONT Color=#B22222>FMain</font>   <FONT Color=gray>' ''E' possibile usare anche "Me" anziché FMain''</font>
 
    
 
    
  i = Object.Call(ob, "Somma", [3, 4])
+
  i = Object.Call(ob, "Somma", [3, 4])
 
   
 
   
  Print i
+
  Print i
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' 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>
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  i = a + b
+
  i = a + b
 
    
 
    
  Return i
+
  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.
  
 +
====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".
  
====Esempio con applicazione ''a riga di comando''====
+
Mostriamo un semplice esempio:
Mostriamo un semplice esempio con applicazione''a riga di comando'':
+
  Public Sub Main()
  '''Public''' Sub Main()
 
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
  Dim ob As Object
 
   
 
  ob = Me
 
 
    
 
    
  i = Object.Call(ob, "Somma", [3, 4])
+
  i = Object.Call(<FONT Color=#B22222>Me</font>, "Somma", [3, 4])
 
   
 
   
  Print i
+
  Print i
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' 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>
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  i = a + b
+
  i = a + b
 
    
 
    
   Return i
+
  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
 +
 +
 +
<FONT Color=#B22222>'''Public'''</font> Function Funzione_Chiamata(c As Integer) As Integer
 
    
 
    
  '''End'''
+
  Return c * 100
 
+
 
 +
  End
  
  
Riga 72: Riga 104:
 
Mostriamo un esempio, nel quale si avrà un applicativo composto anche da un Modulo e da una Classe specifica, ciascuno contenente una funzione.
 
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:
+
Il ''Modulo'', che chiameremo ''Module1'', sarà così scritto:
 
  Create
 
  Create
 
   
 
   
Riga 78: Riga 110:
 
  '''Public''' Function _call(i As Integer) As Integer
 
  '''Public''' Function _call(i As Integer) As Integer
 
    
 
    
  Return i * 10
+
  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 89: Riga 119:
 
  '''Public''' Function _call(s As String) As String
 
  '''Public''' Function _call(s As String) As String
 
    
 
    
  Return s & " 10 = "
+
  Return s & " 10 = "
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
 
  '''Public''' Procedure ClSub()
 
  '''Public''' Procedure ClSub()
 
    
 
    
  Print "Procedura chiamata con 'Object.Call()'"
+
  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)
+
  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 i As Integer
  Dim s As String
+
  Dim s As String
 
    
 
    
    s = obCl("7 x")
+
  s = obCl("7 x")
 
      
 
      
    i = obMod(7)
+
  i = obMod(7)
    Print s; i
+
  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)
+
  Object.Call(obCl, "ClSub", Null)
 
      
 
      
  '''End'''
+
  End
 
 
 
 
  
 
====Esempio con applicazione ''a riga di comando''====
 
====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.
 
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:
 
Mostriamo un esempio, nel quale il ''Modulo'', assegnato alla variabile di tipo ''Oggetto'' e contenente la Funzione da richiamare, sia il seguente:
Riga 135: Riga 160:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  i = a + b
+
  i = a + b
 
    
 
    
  Return i
+
  Return i
 
    
 
    
  '''End'''
+
  End
 
Mentre Il ''Modulo'' principale è il seguente:
 
Mentre Il ''Modulo'' principale è il seguente:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim ob As Object
 
   Dim ob As Object
 
    
 
    
  ob = <FONT Color=#B22222>Module1</font>
+
  ob = <FONT Color=#B22222>Module1</font>
 
    
 
    
  i = Object.Call(ob, "Somma", [3, 4])
+
  i = Object.Call(ob, "Somma", [3, 4])
 
      
 
      
  Print i
+
  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 165: Riga 188:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  i = a + b
+
  i = a + b
 
    
 
    
  Return i
+
  Return i
 
    
 
    
  '''End'''
+
  End
 
Mentre Il ''Modulo'' principale è il seguente:
 
Mentre Il ''Modulo'' principale è il seguente:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim ob As Object
 
   Dim ob As Object
 
    
 
    
  ob = <FONT Color=#B22222>Class1</font>
+
  ob = <FONT Color=#B22222>Class1</font>
 
    
 
    
  i = Object.Call(ob, "Somma", [3, 4])
+
  i = Object.Call(ob, "Somma", [3, 4])
 
      
 
      
  Print i
+
  Print i
 
    
 
    
  '''End'''
+
  End
 +
 
 +
 
 +
 
 +
=Note=
 +
[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 attuale delle 15:51, 21 giu 2024

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.

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