Autore Topic: [RISOLTO]Chiamata dui una classe dinamica con passaggio dati in andata e ritorno  (Letto 983 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
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:
Codice: [Seleziona]
$Classex = NEW ClasseX($StriMia) 
La Classe chiamata ClasseX  riceve in input la Stringa $StriMia con:
Codice: [Seleziona]
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.:
Codice: [Seleziona]
$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
Codice: [Seleziona]
RETURN $StriInOut

Ho provato a farlo, ma non funziona. Sbaglio l'istruzione di restituzione  (non la RETURN, ma la ....) ?
 :( :(

« Ultima modifica: 19 Luglio 2010, 21:51:37 da Picavbg »
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
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:

Codice: gambas [Seleziona]
' GAMBAS class file
' Dichiaro la variabile pubblica e la inizializzo
PUBLIC $Stringa AS String = "Sono pubblica"


Se nel form scrivo una cosa del tipo

Codice: gambas [Seleziona]

' Creo una classe sulla base di quella precedente
nClass = NEW myClass
' stampo la variabile pubblica
PRINT nClass.$Stringa


Allora nel terminale avrò scritto

Codice: gambas [Seleziona]
Sono pubblica


Spero che il mio esempio ti sia servito per capire come accedere agli elementi della classe. Se sono andato fuori strada ti chiedo scusa.


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Quindi, nel codice della Form
Codice: [Seleziona]
 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
Codice: [Seleziona]
 nClass = NEW myClass 
Ho capito bene?
 :( :(
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Non c'è bisogo. Nel momento in cui istanzi una nuova classe con

Codice: gambas [Seleziona]
nClass = NEW myClass


e come se creassi un figlio di myClass tale e quale al padre....questo vuol dire che dal momento in cui crei nClass essa eredità dal padre (myClass) tutto quello che c'è dentro (funzioni, sub, variabili)....quindi se myClass aveva una variabile pubblica di nome di nome $Stringa allora anche nClass avrà una variabile pubblica di nome $Stringa che potrai richiamare ogni qual volta vuoi, senza problemi con

Codice: gambas [Seleziona]
nClass.$Stringa


Mi rendo conto che sono argomenti un pò ostici ma se hai capito questi allora la programmazione ad oggetti sarà come pane morbido... ;)
Comunque se non hai capito o non ti è ben chiero sono qui pronto a rispiegartelo in 1000 modi ma ci tengo che alla fine tu sappia queste cose... :)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
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
Codice: gambas [Seleziona]
'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:
Codice: gambas [Seleziona]

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
Codice: gambas [Seleziona]
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.
 :( :(



:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
:-*

Bravissimo!!! Hai compreso appieno il significato! Come vedi le nuove classi non sono altro che figli uguali spiaccicati al padre! Ne ereditano tutto tutto, pregi e difetti!

Una classe infatti ha proprio lo scopo di creare uno stampo standard dal quale tirare fuori tante volte delle "sagome" sempre uguali.

Immagina che io sono gli Stati Uniti e creo una classe di nome Sergente....mi basterà ogni volta creare una classe figlia di nome Soldato per avere un esercito di tizi tutti uguali, in tutto e per tutto, a Sergente.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Bello il tuo esempio! Ma, ...  se soldati=sergente e sergente=soldati, come farai carissimo Stati Uniti ad impostare un piano di battaglia per vincere la guerra se sergente e soldati, essendo tutti uguali, vorranno tutti dare ordini? :rotfl:

A parte gli scherzi, grazie, penso di che oggi sono cresciuto. Domani farò domanda per diventare sergente anch'io. ;D ;D
Ciao.
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Bello il tuo esempio! Ma, ...  se soldati=sergente e sergente=soldati, come farai carissimo Stati Uniti ad impostare un piano di battaglia per vincere la guerra se sergente e soldati, essendo tutti uguali, vorranno tutti dare ordini? :rotfl:

A parte gli scherzi, grazie, penso di che oggi sono cresciuto. Domani farò domanda per diventare sergente anch'io. ;D ;D
Ciao.

L'esercito è mio e me lo gestisco io..... 8)

A parte gli scherzi spero di averti insegnato qualcosa di nuovo....se hai risolto il tuo dubbio sai cosa fare.... ;)

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
grazie chesko ho capito pure io. Penso che questo esempio sia utile nel mio caso per dichiarare dei percorsi che mi serviranno in varie classi.
Matteo DoubleMM Mion

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
credo che questo possa servire a quello che sto facendo ma fore non ho capito bene per metterlo in pratica.
Ho creato un form con all'interno un dirview e un fileview. Vorrei chiamare il form da vari punti del programma e mettere il percorso ogni volta in un variabile diversa.

supponiamo che il form con i view si chiami FormFile

da Form1 chiamo:
Codice: gambas [Seleziona]

stringa=FormFile.Show ()


nella class di FormFile dove devo mettere il RETURN ?

o forse devo usare un altro modo?
Matteo DoubleMM Mion

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
credo che questo possa servire a quello che sto facendo ma fore non ho capito bene per metterlo in pratica.
Ho creato un form con all'interno un dirview e un fileview. Vorrei chiamare il form da vari punti del programma e mettere il percorso ogni volta in un variabile diversa.

supponiamo che il form con i view si chiami FormFile

da Form1 chiamo:
Codice: gambas [Seleziona]

stringa=FormFile.Show ()


nella class di FormFile dove devo mettere il RETURN ?

o forse devo usare un altro modo?

Gambas propone degli strumenti già pronti per fare ciò che vuoi tu...Sono tutti membri di Dialog. Cerca nella documentazione e nel forum Dialog e vedrai che risolverai presto presto...

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Grazie Ceskho ho risolto in maniera molto semplice come hai detto tu. Mi sa che stai diventando il mio mito  :2birre:
Matteo DoubleMM Mion

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Grazie Ceskho ho risolto in maniera molto semplice come hai detto tu. Mi sa che stai diventando il mio mito  :2birre:

Ed io che pensavo di essere doppiamente il tuo mito... :'(

:rotfl:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Ehi, Ehi; ragazzi, che facciamo? Ceskho non é e non può essere un mito personale, ma appartiene a tutta la comunità. Per favore non mi togliete la mia parte di Ceskho.  ;D ;D
:ciao: