Conoscere il nome del Componente di appartenenza di una Classe mediante i sorgenti di Gambas
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 200 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.</br>
Quindi, avanzando di 200 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.</br>
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 Main() 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 + 24)) p3 = Pointer@(p2 + 200) ' in Struttura COMPONENT (gbx_component.h) ' Mostra il nome del Componente di appartenenza della Classe prescelta: Print String@(Pointer@(p3 + 48)) ' Verifichiamo la corrispondenza mediante le risorse specifiche di Gambas: Print Class.Load("Image").Component.Name End
Pagina in costruzione !