La cosa è legata, appunto, all'impostazione PUBLIC/PRIVATE dei simboli.
Come per gli altri linguaggi, anche se con construtti diversi, il puntamento fatto all'oggetto stesso, dall'interno dei suoi metodi, può essere fatto con la parola chiave "ME". In C++ si usa "this", in Python "self", e così via; la differenza stà nelle impostazioni che si danno a livello di compilazione, come ho descritto nel post precedente.
La parola "ME", però, deve puntare ad un'oggetto pubblico, ovvero visibile al mondo, per cui è necessario che il controllo che fà parte (ed è di proprietà) della Form, sia un nome PUBLIC; in caso contrario, l'unico modo per accedere ad oggetti privati, è quello di chiamarli direttamente con il proprio nome (come definito nella dichiarazione), ma dato che sono dichiarati automaticamente PRIVATE, sono visibili solo all'interno della classe che li contiene.
Un giochetto che, almeno per me, è venuto spontaneo, e solo nei casi di debba costruire qualcosa in modo dinamico, è quello di dichiarare una variabile privata, e di definire un metodo PUBLIC per la lettura di quell'oggetto:
'Classe Form1
PROPERTY READ MyCombo AS COMBOBOX
PRIVATE $combo1 AS COMBOBOX
PUBLIC SUB _new()
$combo1 = NEW ComboBox(ME)
END
PRIVATE FUNCTION MyCombo_Read()
RETURN $combo1
END
a) con la riga con Property dichiaro un metodo della form, che mi ritorna il puntatore all'oggetto combobox;
b) dichiaro una variabile privata, nella form, di tipo ComboBox;
c) nel metodo di costruzione della classe Form, creo dinamicamente una combobox, e il puntamento lo metto nella variabile precedente.
In questo modo, alternativo, e anche se con qualche riga di codice in più, ho un maggior controllo degli oggetti, perchè posso definirli in modo dinamico; inoltre, la possibilità di creare un metodo di lettura (MyCombo_Read), mi permette di fare anche altre cose, oltre al ritornare il valore della variabile.
Ad esempio, posso dichiarare una nuova proprietà della Form:
PROPERTY Contatore AS Integer
PRIVATE $contatore AS Integer
PUBLIC SUB _new()
$contatore = 0
END
PRIVATE FUNCTION Contatore_Read()
RETURN $contatore
END
PRIVATE SUB Contatore_Write(Value AS Integer)
$contatore = Value * 100
END
in questo caso Contatore ha due metodi virtuali, uno in lettura e uno in scrittura, e tutti e due agiscono sulla variabile nascosta $contatore; se noi usiamo questa classe, come ad esempio:
DIM oForm as NEW Form1
oForm1.Contatore = 10
PRINT oForm1.Contatore
> 1000
come puoi vedere, Contatore si comporta come se fosse una variabile della Form, però quando gli viene impostato un valore (10), nel metodo che si occupa della sua gestione (Write), questo valore viene moltiplicato (x100). Il metodo di lettura (Read) ti ritornerà il suo valore, però moltiplicato per 100.
Tutto ciò è avvenuto, utilizzando la variabile privata $contatore, non accessibile dall'esterno, per cui protetta da eventuali errori; questo per dire che, se vogliamo, possimo inserire nel metodo di scrittura un controllo sulla validità del dato immesso, prima che questo venga realmente memorizzato nella proprietà.
Io spero di non averti incasinato le idee; forse ho allungato un pò troppo la broda, ma mi sembrava il caso di portare il discorso ad un ragionamento, più che al seguire la sola logica sintattica.