Differenze tra le versioni di "Conoscere le risorse possedute da una Classe"
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
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". |
+ | ===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() | |
Dim s As String | Dim s As String | ||
Riga 11: | Riga 12: | ||
Next | 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: | |
− | |||
− | Poniamo il caso di aver creato nel nostro progetto una specifica | ||
<FONT Color=#B22222>Public</font> alfa As Integer | <FONT Color=#B22222>Public</font> alfa As Integer | ||
Riga 26: | Riga 27: | ||
Print "Testo qualsiasi" | Print "Testo qualsiasi" | ||
− | + | 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() | |
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 | |
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() | |
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 | |
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() | |
Dim cl As Class | Dim cl As Class | ||
Riga 70: | Riga 70: | ||
Me.Close | Me.Close | ||
− | + | End | |
==Usando i Puntatori per accedere alla ''Struttura'' "_CLASS" dei sorgenti di Gambas== | ==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 " | + | 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 | + | Dim im As New Image |
+ | Dim p1, p2, p3 As Pointer | ||
+ | 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 | ||
+ | |||
+ | End | ||
+ | o <U>più brevemente</u> così: <SUP>[[[#Note|nota 1]]]</sup> | ||
+ | Public Sub Form_Open() | ||
Dim p1, p2 As Pointer | Dim p1, p2 As Pointer | ||
− | Dim | + | 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) | |
− | |||
− | For i = 0 To | + | <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 | Next | ||
− | + | ||
− | + | End | |
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] vedere anche la seguente pagina: [[Sapere quante istanze di una Classe sono state create]] |
Versione attuale delle 19:05, 13 nov 2024
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".
Indice
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", 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 1]
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] vedere anche la seguente pagina: Sapere quante istanze di una Classe sono state create