Conoscere il nome del Componente di appartenenza di una Classe mediante i sorgenti di Gambas

Da Gambas-it.org - Wikipedia.

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.
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.
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