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