Conoscere le risorse possedute da una Classe: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 1: | Riga 1: | ||
Per conoscere tutti i ''simboli'' relativi alle risorse (''Proprietà'', ''Metodi'' | 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". | ||
| Riga 14: | Riga 14: | ||
Ugualmente è possibile conoscere i simboli delle risorse possedute da una | 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 | 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 | <FONT Color=#B22222>Public</font> alfa As Integer | ||
| Riga 81: | Riga 81: | ||
Dim p As Pointer | Dim p As Pointer | ||
<FONT Color=gray>' ''Accede alla Struttura "_CLASS":''</font> | <FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) alla Struttura "_CLASS":''</font> | ||
p = Object.Address(Me) | p = Object.Address(Me) | ||
| Riga 93: | Riga 93: | ||
Dim i As Integer | Dim i As Integer | ||
<FONT Color=gray>' ''Accede al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS":''</font> | <FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) al membro "CLASS_DESC_SYMBOL *table" della Struttura "_CLASS":''</font> | ||
p1 = Pointer@(po + SizeOf(gb.Pointer) * 5) | p1 = Pointer@(po + SizeOf(gb.Pointer) * 5) | ||
<FONT Color=gray>' ''Accede (ottiene l'indirizzo di memoria) al primo membro di tipo "Puntatore" "char *name;" della Struttura "CLASS_DESC_SYMBOL *table":''</font> | |||
p2 = Pointer@(p1) | p2 = Pointer@(p1) | ||
For i = 0 To | <FONT Color=gray>' ''Dereferenzia (legge i sigoli dati-byte) del predetto membro di tipo "Puntatore" "char *name;":''</font> | ||
For i = 0 To 123 | |||
If Byte@(p2 + i) == 0 Then | If Byte@(p2 + i) == 0 Then | ||
Print | Print | ||
| Riga 104: | Riga 107: | ||
Print Chr(Byte@(p2 + i)); | Print Chr(Byte@(p2 + i)); | ||
Next | Next | ||
'''End''' | '''End''' | ||
Versione delle 18:45, 8 set 2022
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".
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
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