Differenze tra le versioni di "Uso delle Strutture tra Classi e Moduli"

Da Gambas-it.org - Wikipedia.
Riga 8: Riga 8:
  
 
Come esempio, poniamo di avere in un progetto una Classe principale ed una Classe secondaria.
 
Come esempio, poniamo di avere in un progetto una Classe principale ed una Classe secondaria.
  '''Public''' classe2 As New Classe2  <FONT color=#006400>' ''Istanziamo la Classe secondaria''</font>
+
  '''Public''' classe2 As New Classe2  <FONT color=gray>' ''Istanziamo la Classe secondaria''</font>
 
   
 
   
 
   
 
   
  <FONT color=#006400>' ''Dichiariamo la Struttura:''</font>
+
  <FONT color=gray>' ''Dichiariamo la Struttura:''</font>
 
  '''Public''' Struct <FONT color=#B22222>structura</font>
 
  '''Public''' Struct <FONT color=#B22222>structura</font>
 
   a As Byte
 
   a As Byte
Riga 17: Riga 17:
 
  '''End''' Struct
 
  '''End''' Struct
 
   
 
   
  <FONT color=#006400>' ''Quindi dichiariamo ed istanziamo la relativa variabile del tipo della Struttura:''</font>
+
  <FONT color=gray>' ''Quindi dichiariamo ed istanziamo la relativa variabile del tipo della Struttura:''</font>
 
  '''Private''' <FONT color=blue>variabilis</font> As New <FONT color=#B22222>Structura</font>
 
  '''Private''' <FONT color=blue>variabilis</font> As New <FONT color=#B22222>Structura</font>
 
   
 
   
  <FONT color=#006400>' ''Per comodità creiamo un'altra variabile del medesimo tipo della "Struttura".''
+
  <FONT color=gray>' ''Per comodità creiamo un'altra variabile del medesimo tipo della "Struttura".''
 
  ' ''Questa nuova variabile ci servirà per raccogliere i valori ritrasmessi dalla Classe secondaria:</font>
 
  ' ''Questa nuova variabile ci servirà per raccogliere i valori ritrasmessi dalla Classe secondaria:</font>
 
  '''Private''' <FONT color=#FF0055>ritorno</font> As New <FONT color=#B22222>Structura</font>
 
  '''Private''' <FONT color=#FF0055>ritorno</font> As New <FONT color=#B22222>Structura</font>
Riga 27: Riga 27:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  <FONT color=#006400>' ''Assegnamo i valori agli elementi che formano la Struttura:''</font>
+
  <FONT color=gray>' ''Assegnamo i valori agli elementi che formano la Struttura:''</font>
 
     With <FONT color=blue>variabilis</font>
 
     With <FONT color=blue>variabilis</font>
 
       .a = 2
 
       .a = 2
Riga 43: Riga 43:
 
         Print "--->"; .a
 
         Print "--->"; .a
 
         Print "--->"; .b
 
         Print "--->"; .b
  <FONT color=#006400>' ''li modifichiamo ulteriormente...'':</font>
+
  <FONT color=gray>' ''li modifichiamo ulteriormente...'':</font>
 
         .a = .a + 2
 
         .a = .a + 2
 
         .b = .b + 1000
 
         .b = .b + 1000
  <FONT color=#006400>' ''...e li riverifichiamo come modificati:''</font>
+
  <FONT color=gray>' ''...e li riverifichiamo come modificati:''</font>
 
         Print
 
         Print
 
         Print "--->"; .a
 
         Print "--->"; .a
Riga 56: Riga 56:
  
 
Nella Classe secondaria avremo il seguente codice:
 
Nella Classe secondaria avremo il seguente codice:
  <FONT color=#006400>' ''Dichiariamo una "Struttura" avente i medesimi campi della "Struttura" presente nella Classe principale.''
+
  <FONT color=gray>' ''Dichiariamo una "Struttura" avente i medesimi campi della "Struttura" presente nella Classe principale.''
 
  ' ''Sia tali campi che la "Struttura" stessa avranno i nomi uguali''
 
  ' ''Sia tali campi che la "Struttura" stessa avranno i nomi uguali''
 
  ' ''a quelli rispettivi della "Struttura" presente nella Classe principale:''</font>
 
  ' ''a quelli rispettivi della "Struttura" presente nella Classe principale:''</font>
Riga 72: Riga 72:
 
   
 
   
 
     With <FONT color=purple>var2</font>
 
     With <FONT color=purple>var2</font>
  <FONT color=#006400>' ''Vediamo i valori ora contenuti negli elementi della variabile di tipo "Struttura":''</font>
+
  <FONT color=gray>' ''Vediamo i valori ora contenuti negli elementi della variabile di tipo "Struttura":''</font>
 
       Print "Elemento a = "; .a
 
       Print "Elemento a = "; .a
 
       Print "Elemento b = "; .b
 
       Print "Elemento b = "; .b
  <FONT color=#006400>' ''Li modifichiamo...:''</font>
+
  <FONT color=gray>' ''Li modifichiamo...:''</font>
 
       .a = .a + 2
 
       .a = .a + 2
 
       .b = .b + 1000
 
       .b = .b + 1000
 
     End With
 
     End With
 
   
 
   
  <FONT color=#006400>' ''...e li ripassiamo alla funzione chiamante della Classe principale:''</font>
+
  <FONT color=gray>' ''...e li ripassiamo alla funzione chiamante della Classe principale:''</font>
 
     Return <FONT color=purple>var2</font>
 
     Return <FONT color=purple>var2</font>
 
   
 
   
Riga 96: Riga 96:
  
  
 +
===1° esempio===
 
Facciamo un esempio, nel quale abbiamo una Classe principale ed una Classe secondaria. Nella Classe principale dichiareremo ed istazieremo sia la Struttura da passare alla Classe secondaria, sia, ovviamente, la relativa variabile:
 
Facciamo un esempio, nel quale abbiamo una Classe principale ed una Classe secondaria. Nella Classe principale dichiareremo ed istazieremo sia la Struttura da passare alla Classe secondaria, sia, ovviamente, la relativa variabile:
  '''Public''' classe2 As New Classe2  <FONT color=#006400>' ''Istanziamo la Classe secondaria''</font>
+
  '''Public''' classe2 As New Classe2  <FONT color=gray>' ''Istanziamo la Classe secondaria''</font>
 
   
 
   
 
   
 
   
  <FONT color=#006400>' ''Dichiariamo la Struttura:''</font>
+
  <FONT color=gray>' ''Dichiariamo la Struttura:''</font>
 
  '''Public''' Struct structura
 
  '''Public''' Struct structura
 
   a As Byte
 
   a As Byte
Riga 106: Riga 107:
 
  '''End''' Struct
 
  '''End''' Struct
 
   
 
   
  <FONT color=#006400>' ''Quindi dichiariamo come ''Globale'' (Publica)'' ed istanziamo''
+
  <FONT color=gray>' ''Quindi dichiariamo come ''Globale'' (Publica)'' ed istanziamo''
 
  ' ''la relativa variabile del tipo della precedente Struttura:''</font>
 
  ' ''la relativa variabile del tipo della precedente Struttura:''</font>
 
   '''<FONT color=#B22222>Public</font>''' variabilis As New Structura
 
   '''<FONT color=#B22222>Public</font>''' variabilis As New Structura
Riga 113: Riga 114:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  <FONT color=#006400>' ''Assegnamo i valori agli elementi che formano la Struttura:''</font>
+
  <FONT color=gray>' ''Assegnamo i valori agli elementi che formano la Struttura:''</font>
 
     With variabilis
 
     With variabilis
 
       .a = 2
 
       .a = 2
Riga 119: Riga 120:
 
     End With
 
     End With
 
    
 
    
  <FONT color=#006400>' ''Chiamiamo una routine della Classe secondaria:''</font>
+
  <FONT color=gray>' ''Chiamiamo una routine della Classe secondaria:''</font>
 
     class2.prova()
 
     class2.prova()
 
   
 
   
Riga 128: Riga 129:
 
  '''Public''' Sub prova()
 
  '''Public''' Sub prova()
 
   
 
   
  <FONT color=#006400>' ''Richiamiamo ed utilizziamo la Struttura dichairata nella Classe principale:''</font>
+
  <FONT color=gray>' ''Richiamiamo ed utilizziamo la Struttura dichairata nella Classe principale:''</font>
 
     With FMain.variabilis
 
     With FMain.variabilis
 
       Print "Elemento a = "; .a
 
       Print "Elemento a = "; .a
Riga 135: Riga 136:
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
===2° esempio===
 +
In quest'altro esempio avremo un Classe principale ed un Modulo, nel quale saranno semplicemente dichiarate la ''Struttura'', le variabili del tipo della ''Struttura'' e la variabile ''vettoriale'' del tipo della ''Struttura''. Tale variabile vettoriale raccoglierà nei suoi elementi le predette singole variabili del tipo della ''Struttura'' dichiarata.
 +
 +
Nella Classe principale avremo il sguente semplice codice:
 +
'''Public''' Sub Main()
 +
 +
 +
  With Module1
 +
    .a = [.l1, .l2, .l3]
 +
    .a[0].a = 10
 +
    .a[0].b = 1000
 +
    .a[1].a = 20
 +
    .a[1].b = 2000
 +
    .a[2].a = 30
 +
    .a[2].b = 3000
 +
  End With
 +
 
 +
 +
<FONT color=gray>' ''Effettuiamo la verifica:''</font>
 +
  With Module1
 +
    Print .a[0].a
 +
    Print .a[0].b
 +
    Print .a[1].a
 +
    Print .a[1].b
 +
    Print .a[2].a
 +
    Print .a[2].b
 +
  End With
 +
 +
'''End'''
 +
 +
 +
Mentre nel ''Modulo'' avremo il seguente codice:
 +
<FONT color=gray>' ''Gambas module file''</font>
 +
 +
 +
'''<FONT color=#B22222>Public</font>''' Struct Struttura
 +
  a As Byte
 +
  b As Short
 +
'''End''' Struct
 +
 +
 +
'''<FONT color=#B22222>Public</font>''' a As New Struttura[3]
 +
 +
'''<FONT color=#B22222>Public</font>''' l1 As New Struttura
 +
'''<FONT color=#B22222>Public</font>''' l2 As New Struttura
 +
'''<FONT color=#B22222>Public</font>''' l3 As New Struttura

Versione delle 09:05, 3 dic 2013

Una Struttura, o più precisamente una variabile di tipo "Struttura", dichiarata ed istanziata in una Classe o in un Modulo, può essere utilizzata anche in altre Classi ed in altri Moduli.
Tale utilizzo potrà avvenire o passando la variabile di tipo Struttura tramite i parametri di una chiamata a funzione, oppure mediante l'uso di una variabile globale di tipo Struttura.


Passaggio della variabile attraverso i parametri di una chiamata a funzione

I valori, contenuti in una variabile del tipo della Struttura dichiarata, possono essere passati ad un'altra Classe passando ad quest'ultima la variabile medesima. Si dovrà, però, avere l'accortezza di ripetere la medesima Struttura - come già dichiarata nella Classe principale - anche nelle Classi ove questa dovrà essere richiamata, confermandone precisamente anche il nome. Il nome della variabile del tipo della Struttura della Classe secondaria potrà, invece, essere diverso dalla variabile della Classe principale.
Poiché tutte le classi sono in realtà completamente indipendenti durante il processo di compilazione, l'interprete verificherà in fase di esecuzione che la stessa Struttura è sempre dichiarata nello stesso modo in tutte le classi.

Come esempio, poniamo di avere in un progetto una Classe principale ed una Classe secondaria.

Public classe2 As New Classe2  ' Istanziamo la Classe secondaria


' Dichiariamo la Struttura:
Public Struct structura
  a As Byte
  b As Integer
End Struct

' Quindi dichiariamo ed istanziamo la relativa variabile del tipo della Struttura:
Private variabilis As New Structura

' Per comodità creiamo un'altra variabile del medesimo tipo della "Struttura".
' Questa nuova variabile ci servirà per raccogliere i valori ritrasmessi dalla Classe secondaria:
Private ritorno As New Structura


Public Sub Form_Open()

' Assegnamo i valori agli elementi che formano la Struttura:
    With variabilis
      .a = 2
      .b = 1000
    End With
 
' Chiamiamo una routine della Classe secondaria.
' e le passiamo la variabile Struttura.
' Prevediamo anche un ritorno di valori dalla "Struttura" presente nella Classe secondaria:
    ritorno = classe2.prova(variabilis)

     With ritorno
' Verifichiamo i valori ricevuti dalla "Struttura" presente nella Classe secondaria:
       Print "Ritorno:"
       Print "--->"; .a
       Print "--->"; .b
' li modifichiamo ulteriormente...:
       .a = .a + 2
       .b = .b + 1000
' ...e li riverifichiamo come modificati:
       Print
       Print "--->"; .a
       Print "--->"; .b
     End With

End


Nella Classe secondaria avremo il seguente codice:

' Dichiariamo una "Struttura" avente i medesimi campi della "Struttura" presente nella Classe principale.
' Sia tali campi che la "Struttura" stessa avranno i nomi uguali
' a quelli rispettivi della "Struttura" presente nella Classe principale:
Public Struct structura
   a As Byte
   b As Integer
End Struct 


' La routine, che viene richiamata dalla funzione chiamante presente nella Classe principale,
' riceve la variabile dalla Classe principale e la assegna alla variabile di tipo "Struttura" della corrente Classe secondaria.
' Detta variabile può avere un nome anche diverso dalla variabile di tipo "Struttura" presente nella Classe principale.
' E' previsto, inoltre, in questo esempio che sarà restituita alla funzione chiamante una variabile di tipo della "Struttura":
Public Sub prova(var2 As Structura) As Structura

    With var2
' Vediamo i valori ora contenuti negli elementi della variabile di tipo "Struttura":
      Print "Elemento a = "; .a
      Print "Elemento b = "; .b
' Li modifichiamo...:
      .a = .a + 2
      .b = .b + 1000
    End With

' ...e li ripassiamo alla funzione chiamante della Classe principale:
    Return var2

End


Uso di una variabile Globale

L'altra modalità è di utilizzare come Globale, dichiarandola publica, la variabile del tipo della Struttura da richiamare. Per fare ciò, come è noto, si dichiarerà tale variabile come Public.

V'è da precisare che:

  • è possibile chiamare da una Classe, sia essa principale o secondaria, una viariabile globale di tipo Struttura dichiarata ed instanziata in altra Classe o in un Modulo;
  • ugualmente è possibile chiamare da un Modulo una viariabile globale, di tipo Struttura, dichiarata ed istanziata in un altro Modulo o in un'altra Classe.


1° esempio

Facciamo un esempio, nel quale abbiamo una Classe principale ed una Classe secondaria. Nella Classe principale dichiareremo ed istazieremo sia la Struttura da passare alla Classe secondaria, sia, ovviamente, la relativa variabile:

Public classe2 As New Classe2  ' Istanziamo la Classe secondaria


' Dichiariamo la Struttura:
Public Struct structura
  a As Byte
  b As Integer
End Struct

' Quindi dichiariamo come Globale (Publica) ed istanziamo
' la relativa variabile del tipo della precedente Struttura:
 Public variabilis As New Structura


Public Sub Form_Open()

' Assegnamo i valori agli elementi che formano la Struttura:
    With variabilis
      .a = 2
      .b = 1000
    End With
 
' Chiamiamo una routine della Classe secondaria:
    class2.prova()

End


Nella Classe secondaria avremo il seguente codice:

Public Sub prova()

' Richiamiamo ed utilizziamo la Struttura dichairata nella Classe principale:
    With FMain.variabilis
      Print "Elemento a = "; .a
      Print "Elemento b = "; .b
    End With

End


2° esempio

In quest'altro esempio avremo un Classe principale ed un Modulo, nel quale saranno semplicemente dichiarate la Struttura, le variabili del tipo della Struttura e la variabile vettoriale del tipo della Struttura. Tale variabile vettoriale raccoglierà nei suoi elementi le predette singole variabili del tipo della Struttura dichiarata.

Nella Classe principale avremo il sguente semplice codice:

Public Sub Main()


 With Module1
   .a = [.l1, .l2, .l3]
   .a[0].a = 10
   .a[0].b = 1000
   .a[1].a = 20
   .a[1].b = 2000
   .a[2].a = 30
   .a[2].b = 3000
 End With
 

' Effettuiamo la verifica:
 With Module1
   Print .a[0].a
   Print .a[0].b
   Print .a[1].a
   Print .a[1].b
   Print .a[2].a
   Print .a[2].b
 End With

End


Mentre nel Modulo avremo il seguente codice:

' Gambas module file


Public Struct Struttura
 a As Byte
 b As Short
End Struct


Public a As New Struttura[3]

Public l1 As New Struttura
Public l2 As New Struttura
Public l3 As New Struttura