Ho letto qualcosa sull'argomento "Passaggio dati fra Form" ed ho già utilizzato il passaggio di dati all'atto della chiamata di una classe dinamica con:
$Classex = NEW ClasseX($StriMia)
La Classe chiamata ClasseX riceve in input la Stringa $StriMia con:
PUBLIC SUB _new($StriInOut AS String)
Rilevando così il contenuto di $StriInOut la classe chiamata può svolgere il suo compito, valorizzando alla fine del suo lavoro, $StriInOut col nuovo dato.
Es.:
$StriMia= "INPUT"
$Classex = NEW ClasseX($StriMia)
PUBLIC SUB _new($StriInOut AS String)
$StriInOut="OUTPUT"
END
Quando la classe chiamante riprende il controllo del programma non conosce il nuovo valore di $StriMia. Per poterlo rilevare, per quello che ho capito, la classe ClasseX( avrebbe dovuto scrivere il valore da restituire alla classe chiamante in:
1) una variabile globale, definita in un modulo esterno;
2) una variabile "PUBLIC" della classe chiamante
3) in un supporto esterno, come un file di testo di cui conoscono il path sia la classe chiamante che la classe chiamata.
Più semplice sarebbe se si potesse scrivere alla fine delle istruzione della ClasseX un'istruzione del tipo
Ho provato a farlo, ma non funziona. Sbaglio l'istruzione di restituzione (non la RETURN, ma la ....) ?
:( :(
La cosa in realtà è molto facile e basta pensarci un pò su; vediamo di capirlo insieme ok?
Una variabile PUBLIC è accessibile non solo all'interno del suo contenitore (form, class, module) ma è visibile anche all'esterno. Questo ci fa capire come, se vogliamo conoscere una variabile di una classe in un altro contenitore allora dobbiamo usare una variabile pubblica. Ad esempio immaginiamo di avere una classe di nome myClass del tipo:
' GAMBAS class file
' Dichiaro la variabile pubblica e la inizializzo
PUBLIC $Stringa AS String = "Sono pubblica"
Se nel form scrivo una cosa del tipo
' Creo una classe sulla base di quella precedente
nClass = NEW myClass
' stampo la variabile pubblica
PRINT nClass.$Stringa
Allora nel terminale avrò scritto
Spero che il mio esempio ti sia servito per capire come accedere agli elementi della classe. Se sono andato fuori strada ti chiedo scusa.
Quindi, nel codice della Form
nClass = NEW myClass
PRINT nClass.$Stringa
nClass contiene l'indirizzo di memoria della variabile $Stringa, dichiarata pubblica, nella classe myClass. Ma ciò significa che, qualora dovessi richioamarla successivament, dovrei sempre richiamare la classe myClass con
Ho capito bene?
:( :(
Effettivamente il concetto di classe, naturale per la programmazione ad oggetti, non é semplicissimo da capire e, forse, nemmeno da spiegare.
Vediamo un pò:
genero una
'Class_padre nella quale dichiaro una variabile
PUBLIC $Stringa AS String = "Sono pubblica"
Nel mio passo di programma, nella classe, diciamo, principale, creo un oggetto figlio della classe da richiamare con:
DIM Class_figlio as Class_padre
'..................................................
'
Class_figlio = New Class_padre (scusa se ho cambiato i nomi del tuo esempio, ma mi serve per capire)
Detta ultima istruzione copia nell'oggetto Class_figlio tutto il contenuto dell'oggetto Class_padre e ne esegue il codice
La riga successiva della classe principale
PRINT Class_figlio.$Stringa
esegue, sulla console di Gambas, la stampa della stringa copiata prima nell'oggetto Class_figlio, pertanto, anche più avanti, e fino ad un nuovo utilizzo della funzione Class_figlio = New Class_padre la Class_figlio.$Stringa manterrà inalterato il suo contenuto.
Se é così, come descritto sopra, allora ho capito.
:( :(