Differenze tra le versioni di "Conoscere il nome del Componente di appartenenza di una Classe mediante i sorgenti di Gambas"
Riga 34: | Riga 34: | ||
Print String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 6))) | Print String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 6))) | ||
− | <Font Color=gray>' '' | + | <Font Color=gray>' ''Verifica la corrispondenza mediante le risorse specifiche di Gambas:''</font> |
Print Class.Load("Image").Component.Name | Print Class.Load("Image").Component.Name | ||
End | End |
Versione delle 04:32, 7 lug 2024
Per conoscere il nome del Componente, al quale appartiene una Classe, è sufficiente usare questa riga di comando contenente specifiche risorse di Gambas:
Class.Load("Nome_della_Classe").Component.Name As String
In questa pagina, però, sarà mostrato come ottenere il medesimo risultato utilizzando direttamente talune risorse contenute in alcuni file sorgente di Gambas.
Il nome di un Componente è contenuto nel 5° membro della Struttura chiamata COMPONENT, contenuta nel file header gbx_component.h dei file sorgenti di Gambas.
Una Classe è definita dalla Struttura chiamata CLASS, contenuta nel file header gbx_class.h, nella quale il membro, chiamato component è un Puntatore alla Struttura COMPONENT, sopra descritta, posto al byte di numero 208 di indice.
Detta Struttura CLASS rappresenta a sua volta il primo membro nella Struttura GB_BASE, contenuta nel file header gambas.h dei file sorgenti di Gambas.
Pertanto, procedendo a ritroso e penetrando nelle Strutture sorgenti predette, e in particolare nei membri di queste, è possibile ricavare il nome del Componente di appartenenza di una Classe.
Innanzitutto si accederà, usando il Metodo "Object.Address()", nella Struttura base (GB_BASE) dell'oggetto appartenente alla Classe prescelta.
Dereferenziando il Puntatore, ottenuto dal predetto Metodo, si accederà alla Struttura (CLASS), che rappresenta la Classe prescelta, ottenendo così un nuovo Puntatore.
Quindi, avanzando di 208 byte nell'area puntata dal nuovo Puntatore, si accederà alla Struttura (COMPONENT), che rappresenta il Componente, al quale appartiene la Classe prescelta e del quale si vuole conoscere il nome.
Il membro di tipo Puntatore, che punta all'area di memoria contenente il nome del Componente, è posto al 48° byte nell'area di memoria della Struttura del Componente. Pertanto si dereferenzierà detto Puntatore, avanzando di 48 byte, mediante la specifica funzione "String@()".
Mostriamo un esempio pratico, nel quale si otterrà il nome del Componente, al quale appartiene la Classe "Image":
Public Sub Button1_Click() Dim im As Image Dim p1, p2, p3 As Pointer ' Crea un Oggetto "Image": im = New Image(100, 100, Color.Red, Image.Standard) p1 = Object.Address(im) ' in Struttura GB_BASE (gambas.h) p2 = Pointer@(p1) ' in Struttura CLASS (gbx_class.h) ' Mostra il nome della Classe prescelta: Print String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) p3 = Pointer@(p2 + (SizeOf(gb.Pointer) * 26)) ' in Struttura COMPONENT (gbx_component.h) ' Mostra il nome del Componente di appartenenza della Classe prescelta: Print String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 6))) ' Verifica la corrispondenza mediante le risorse specifiche di Gambas: Print Class.Load("Image").Component.Name End