Conoscere le risorse possedute da una Classe: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
(Creata pagina con 'Per conoscere tutti i ''simboli'' relativi alle risorse (''Proprietà'', ''Metodi'' e ''Eventi''), che una Classe mette a disposizione del programmatore, si può utilizzare il...')
 
Nessun oggetto della modifica
 
(11 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per conoscere tutti i ''simboli'' relativi alle risorse (''Proprietà'', ''Metodi'' e ''Eventi''), che una Classe mette a disposizione del programmatore, si può utilizzare il seguente codice con la Classe ''Class''.
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'':
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
   
   
  For Each s In Class.Load("Button").Symbols
  For Each s In Class.Load("Button").Symbols <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
    Print s
    Print s
  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''.


 
Poniamo il caso di aver creato nel nostro progetto una specifica ''Classe'', chiamata ''Class1'', e che il suo codice sia il seguente:
Ugualmente è possibile conoscere i simboli delle risorse possedute da una classe specifica da noi creata, purché tali risorse siano dichiarate ''Pubbliche''.
  <FONT Color=red>Public</font> alfa As Integer
 
Poniamo il caso di aver creato nel nostro progetto una specifica classe, chiamata ''Class1'', e che il suo codice sia il seguente:
  <FONT Color=#B22222>Public</font> alfa As Integer
   
   
  Event Evento()    <FONT Color=gray>' ''La risorsa ''Event'' è di per sé "Pubblica"''</font>
  Event Evento()    <FONT Color=gray>' ''La risorsa ''Event'' è di per sé "Pubblica"''</font>
   
   
   
   
  <FONT Color=#B22222>Public</font> Procedure Prova()
  <FONT Color=red>Public</font> Procedure Prova()
    
    
  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:
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 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.


Ebbene, il codice della Classe principale per conoscere i simboli delle risorse della Classe secondaria ''Class1'' sarà semplicemente:
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
 
  cl = Class.Load("Color")
 
  Print <FONT Color=red>cl[</font>"RGB"<FONT Color=red>].Type</font>
 
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", procedendo come segue:
<BR>1) Accesso alla Struttura "OBJECT" dell'Oggetto, dichiarata nel file header ''gbx_object.h'' dei sorgenti di Gambas.
<BR>2) Accesso alla Struttura "_CLASS" dell'Oggetto, dichiarata nel file header ''gbx_class.h'' dei sorgenti di Gambas.
<BR>2) Accesso al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS" dei sorgenti di Gambas.
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 im As New Image
   Dim p1, p2, p3 As Pointer
   Dim s As String
   Dim s As String
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) alla Struttura "OBJECT" dell'Oggetto "Image":''</font>
  p1 = Object.Address(im)
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) alla Struttura "_CLASS" dell'Oggetto "Image":''</font>
  p2 = Pointer@(p1)
  Print "\e[1mClasse: "; String@(Pointer@(p2 + SizeOf(gb.Pointer) * 3))
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS":''</font>
  p3 = Pointer@(p2 + SizeOf(gb.Pointer) * 5)
<FONT Color=gray>' ''Dereferenzia il membro di tipo 'Puntatore' "char *name;":''</font>
  For i As Integer = 0 To 2100
    s = String@(Pointer@(p3 + i))
    If (Not IsNull(s)) And IsAlnum(s) Then Print "\e[0m  " & s
  Next
    
    
  For Each s In Class.Load("Class1").Symbols
End
    Print s
o <U>più brevemente</u> così: <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  Next
Public Sub Form_Open()
   
   
  '''End'''
  Dim p1, p2 As Pointer
  Dim s As String
   
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) alla 'Struttura' "_CLASS" relativa alla Classe "Label":''</font>
  p1 = Object.Address(Image)
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS":''</font>
  p2 = Pointer@(p1 + SizeOf(gb.Pointer) * 5)
<FONT Color=gray>' ''Dereferenzia il membro di tipo 'Puntatore' "char *name;":''</font>
  For i As Integer = 0 To 2100
    s = String@(Pointer@(p2 + i))
    If (Not IsNull(s)) And IsAlnum(s) Then Print "\e[0m  " & s
  Next
 
End
 
 
 
=Note=
[1] Class.Load() può caricare una Classe solo dal Componente in cui viene chiamata.
 
[2] Vedere anche la seguente pagina: [[Sapere quante istanze di una Classe sono state create]]

Versione attuale delle 17:39, 1 mag 2025

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 [nota 1]
   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", procedendo come segue:
1) Accesso alla Struttura "OBJECT" dell'Oggetto, dichiarata nel file header gbx_object.h dei sorgenti di Gambas.
2) Accesso alla Struttura "_CLASS" dell'Oggetto, dichiarata nel file header gbx_class.h dei sorgenti di Gambas.
2) Accesso al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS" dei sorgenti di Gambas.

Public Sub Form_Open()

 Dim im As New Image
 Dim p1, p2, p3 As Pointer
 Dim s As String

' Accede (ottiene l'indirizzo di memoria) alla Struttura "OBJECT" dell'Oggetto "Image":
 p1 = Object.Address(im)

' Accede (ottiene l'indirizzo di memoria) alla Struttura "_CLASS" dell'Oggetto "Image":
 p2 = Pointer@(p1)
 Print "\e[1mClasse: "; String@(Pointer@(p2 + SizeOf(gb.Pointer) * 3))

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

' Dereferenzia il membro di tipo 'Puntatore' "char *name;":
 For i As Integer = 0 To 2100
   s = String@(Pointer@(p3 + i))
   If (Not IsNull(s)) And IsAlnum(s) Then Print "\e[0m  " & s
 Next
 
End

o più brevemente così: [nota 2]

Public Sub Form_Open()

 Dim p1, p2 As Pointer
 Dim s As String

' Accede (ottiene l'indirizzo di memoria) alla 'Struttura' "_CLASS" relativa alla Classe "Label":
 p1 = Object.Address(Image)

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

' Dereferenzia il membro di tipo 'Puntatore' "char *name;":
 For i As Integer = 0 To 2100
   s = String@(Pointer@(p2 + i))
   If (Not IsNull(s)) And IsAlnum(s) Then Print "\e[0m  " & s
 Next
 
End


Note

[1] Class.Load() può caricare una Classe solo dal Componente in cui viene chiamata.

[2] Vedere anche la seguente pagina: Sapere quante istanze di una Classe sono state create