Differenze tra le versioni di "Conoscere le risorse possedute da una Classe"

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
  
  
 +
===Conoscere i simboli posseduti da una Classe nativa===
 
Poniamo il caso di voler conoscere i ''simboli'' posseduti dalla Classe ''Button'':
 
Poniamo il caso di voler conoscere i ''simboli'' posseduti dalla Classe ''Button'':
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   Dim s As String
 
   Dim s As String
Riga 11: Riga 12:
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
 
 
  
 +
===Conoscere i simboli posseduti da una Classe specifica creata===
 
Ugualmente è possibile conoscere i simboli delle risorse possedute da una ''Classe'' specifica da noi creata, purché tali risorse siano dichiarate ''Pubbliche''.
 
Ugualmente è possibile conoscere i simboli delle risorse possedute da una ''Classe'' specifica da noi creata, purché tali risorse siano dichiarate ''Pubbliche''.
  
Riga 26: Riga 27:
 
   Print "Testo qualsiasi"
 
   Print "Testo qualsiasi"
 
    
 
    
  '''End'''
+
  End
 
 
 
Ebbene, il codice della ''Classe'' principale per conoscere i simboli delle risorse della ''Classe'' secondaria "Class1" sarà semplicemente:
 
Ebbene, il codice della ''Classe'' principale per conoscere i simboli delle risorse della ''Classe'' secondaria "Class1" sarà semplicemente:
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   Dim cl As New Class1  <FONT Color=gray>' ''Dichiariamo la variabile della Classe secondaria "Class1", anche se ai fini dell'argomento di questa pagina non è necessario''</font>
 
   Dim cl As New Class1  <FONT Color=gray>' ''Dichiariamo la variabile della Classe secondaria "Class1", anche se ai fini dell'argomento di questa pagina non è necessario''</font>
Riga 38: Riga 38:
 
   Next
 
   Next
 
   
 
   
  '''End'''
+
  End
  
  
Riga 45: Riga 45:
  
 
Per disporre di tali Proprietà bisognerà porre il nome della Classe da caricare tra due parentesi quadre:
 
Per disporre di tali Proprietà bisognerà porre il nome della Classe da caricare tra due parentesi quadre:
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim cl As Class
 
   Dim cl As Class
Riga 53: Riga 53:
 
   Print <FONT Color=#B22222>cl[</font>"RGB"<FONT Color=#B22222>].Type</font>
 
   Print <FONT Color=#B22222>cl[</font>"RGB"<FONT Color=#B22222>].Type</font>
 
    
 
    
  '''End'''
+
  End
 
Di seguito un esempio più completo, nel quale vengono esclusi gli eventuali ''Metodi'' della Classe:
 
Di seguito un esempio più completo, nel quale vengono esclusi gli eventuali ''Metodi'' della Classe:
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   Dim cl As Class
 
   Dim cl As Class
Riga 70: Riga 70:
 
   Me.Close
 
   Me.Close
 
    
 
    
  '''End'''
+
  End
  
  
Riga 77: Riga 77:
 
  typedef struct _CLASS
 
  typedef struct _CLASS
 
dichiarata nel file header "gbx_class.h".
 
dichiarata nel file header "gbx_class.h".
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
Riga 86: Riga 86:
 
   Functio(p)
 
   Functio(p)
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Private''' Function Functio(po As Pointer)
+
  Private Function Functio(po As Pointer)
 
   
 
   
 
   Dim p1, p2 As Pointer
 
   Dim p1, p2 As Pointer
Riga 108: Riga 109:
 
   Next
 
   Next
 
    
 
    
  '''End'''
+
  End

Versione delle 17:07, 30 nov 2023

Per conoscere tutti i simboli relativi alle risorse (Proprietà, Metodi ed Eventi), che una Classe mette a disposizione del programmatore, si può utilizzare il seguente codice con la Classe "Class".


Conoscere i simboli posseduti da una Classe nativa

Poniamo il caso di voler conoscere i simboli posseduti dalla Classe Button:

Public Sub Form_Open()

 Dim s As String

 For Each s In Class.Load("Button").Symbols
   Print s
 Next

End

Conoscere i simboli posseduti da una Classe specifica creata

Ugualmente è possibile conoscere i simboli delle risorse possedute da una Classe specifica da noi creata, purché tali risorse siano dichiarate Pubbliche.

Poniamo il caso di aver creato nel nostro progetto una specifica Classe, chiamata Class1, e che il suo codice sia il seguente:

Public alfa As Integer

Event Evento()    ' La risorsa Event è di per sé "Pubblica"


Public Procedure Prova()
 
 Print "Testo qualsiasi"
 
End

Ebbene, il codice della Classe principale per conoscere i simboli delle risorse della Classe secondaria "Class1" sarà semplicemente:

Public Sub Form_Open()

 Dim cl As New Class1   ' Dichiariamo la variabile della Classe secondaria "Class1", anche se ai fini dell'argomento di questa pagina non è necessario
 Dim s As String

 For Each s In Class.Load("Class1").Symbols
   Print s
 Next

End


Le Proprietà della Classe virtuale ".Symbol"

La Classe "Class" possiede una Classe virtuale, chiamata ".Symbol", che fornisce alcune Proprietà sui simboli della Classe principale.

Per disporre di tali Proprietà bisognerà porre il nome della Classe da caricare tra due parentesi quadre:

Public Sub Form_Open()
 
 Dim cl As Class
 
 cl = Class.Load("Color")
 
 Print cl["RGB"].Type
 
End

Di seguito un esempio più completo, nel quale vengono esclusi gli eventuali Metodi della Classe:

Public Sub Form_Open()
 
 Dim cl As Class
 Dim s As String
 
 cl = Class.Load("Color")
 
 For Each s In cl.Symbols
   If cl[s].Kind = Class.Method Then Continue
   Print Hex(Object.GetProperty(cl, s), 8), s
   Wait 0.3
 Next
 
 Me.Close
 
End


Usando i Puntatori per accedere alla Struttura "_CLASS" dei sorgenti di Gambas

Una modalità più complessa e per conoscere elementi più generici, si può accedere al membro "CLASS_DESC_SYMBOL *table" della Struttura

typedef struct _CLASS

dichiarata nel file header "gbx_class.h".

Public Sub Main()

 Dim p As Pointer

' Accede (ottiene l'indirizzo di memoria) alla Struttura "_CLASS":
 p = Object.Address(Me)

 Functio(p)

End


Private Function Functio(po As Pointer)

 Dim p1, p2 As Pointer
 Dim i As Integer

' Accede (ottiene l'indirizzo di memoria) al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS":
 p1 = Pointer@(po + SizeOf(gb.Pointer) * 5)

' Accede (ottiene l'indirizzo di memoria) al primo membro di tipo "Puntatore" "char *name;" della Struttura "CLASS_DESC_SYMBOL *table":
 p2 = Pointer@(p1)

' Dereferenzia (legge i sigoli dati-byte) del predetto membro di tipo "Puntatore" "char *name;":
 For i = 0 To 123
   If Byte@(p2 + i) == 0 Then
     Print
     Continue
   Endif
   Print Chr(Byte@(p2 + i));
 Next
 
End