Ho l'impressione di non essermi spiegato bene. Il problema principale di questo programmino di esempio é:
In FMain.Class
PUBLIC SUB Button1_Click()
DIM Frm1 AS Form1
DIM $_Param AS NEW String[]
$_Param.add("Chiamata per la Form1")
$_Param.Add("INVIO")
Frm1 = NEW Form1($_Param)
PRINT "Button1_Click Ritorno in Fmain dopo il richiamo di Form1"
Message.Info(Frm1.$_TbParF1[2])
END
Le istruziooni delle righe 7 e 8 vengono eseguite subito dopo quella della riga 8, mentre mi aspetto che incontrando la riga 6 il controllo passi alla Form1.class e riprenda in FMain, al rientro dalla stessa. Ciò determina che la tabella "Frm1.$_TbParF1[2]" non contiene ancora l'elemento che dovrebbe essere aggiunto durante l'esecuzione della Form1.Class.
Vorrei capire perché Gambas si comporta secondo me anomalmente.
Spero di essere stato più chiaro.
:(
@ md9327:
Nella prova che ho svolto, ho tenuto conto di quanto hai scritto nel wiki, relativamente al metodo nascosto _new() - il costruttore. Nel wiki é infatti riportato solamente il codice della procedura -new, nel nuovo Form, subordinato alla chiamata del precedente avente focus e precisamente:
PRIVATE $arr AS String[]
...
...
PUBLIC SUB _new( arr AS String[] )
...
$arr = arr
...
END
Perciò nella mia prova ho pensato a passare alla nuova Form un'array, così come indicato nel wiki e mi sono inventato la parte di codice da scrivere dentro una procedura della Form Chiamante(FMain in questo caso). Se cortesemente vuoi dare una guardata, mi potresti dare un'indicazione mirata a correggere miei eventuali errori di impostazione; errori che probabilmente inducono Gambas a comportarsi anomalmente.
:( :(
Ho ripreso oggi il programma ed ho cercato di capire il meccanismo, ma ahimé c'é ancora qualche meccanismo logico che non riesco a mettere a fuoco. Nel codice di esempio che mi hai restitutito
DIM Frm1 AS Form1
DIM ret AS Integer
DIM $_Param AS NEW String[]
$_Param.add("Chiamata per la Form1")
$_Param.Add("INVIO")
Frm1 = NEW Form1($_Param)
ret = Frm1.ShowModal() 'la finestra deve essere modale, altrimenti la form1 l'attiva ma non aspetta il ritorno
leggo in sequenza: la chiamata di una nuova classe " Frm1 = NEW Form1($_Param)" e la chiamata di un nuova Form " ret = Frm1.ShowModal()". ???
A me sembra che la 2^ riga sia in un certo qual modo il duplicato della prima; infatti il primo stile, diciamo così, si usa ordinariamnete per richiamare una classe dinamica, mentre il secondo si usa per richiamare una form (classe statica di un progetto). Ho visto però anche che, con la suddetta disposizione, la chiamata della Form-showmodal funziona, se tolgo una delle due istruzioni non funziona più.
Potresti meglio chiarirmi il perché? :-[
Ciao.
Ho provato a completare il programma "provametodinascosti" e, a parte i dubbi già espressi nel post n.12, sono riuscito a farlo funzionare. ;D
Allora ho pensato di applicare il metodo nel mio programma "ContabFam". Pur avendo rispettato i criteri già adottati nel programmino di prova, ho beccato un errore per me incomprensibile:
type mismatch: wanted Control, got string[] instead
il codice incriminato é:
PUBLIC SUB PulsFineMovv_Click()
DIM i_SwReturn AS Integer
DIM Frm3 AS Form3
DIM $_FrmParam AS NEW String[]
Frm3 = NEW Form3($_FrmParam)
i_SwReturn = Form3.Showmodal()
IF i_SwReturn = 2 THEN 'La giornata é stata chiusa con lo stato di "GIORNATA APERTA"
ME.Close
ENDIF
END
L'errore riportato sopra si manifesta nell'esecuzione della riga 6. Ho provato allora a valorizzare l'array $_FrmParam, ma l'errore é sempre lì.
Sembrerebbe un problema legato al type, ma, pur avendovi successivamente caricato una stringa con , il messaggio d'errore é sempre lo stesso. Da che cosa può dipendere? ???
Ciao.
Ma nella classe del Form3 hai fatto richiesta di passargli dei dati nel metodo speciale _new:
PUBLIC SUB _new(Parametri AS String[])
END
?
Si hai ragione; avevo dimenricato ad inserire l'array nella procedura -new della Form3 chiamata; però dopo la correzione il messaggio di errore non é scomparso, é solamente cambiato nel seguente:
Not enough arguments
Ecco la riga di dichiarazione della procedura _new:
PUBLIC SUB _new(TbParF3 AS String[])
Si, effettivamente é stata una mia svista. Ho corretto l'istruzione errata e con
Frm3 = NEW Form3($_FrmParam)
i_SwReturn = Frm3.ShowModal()
ha funzionato tutto benissimo e finalmente ho potuto gestire nella Form chiamante il ritorno alla FMain. :2birre:
Resta da chiarire il concetto già espresso nel mio post n.12. Se poteste spiegarmi in maniera elementare come si combinano le due istruzioni, può darsi che riesca a capire l'uso applicativo del metodo _New. :D
Ciao
Perchè dici che non può esserti utile?
Nell'esempio ci sono parametri e gestione eventi, un pò di tutto insomma...
Premetto, come ho detto nel mio ultimo post, che ho assunto praticamente il codice che mi hai suggerito, sia dentro la Form chiamante, sia in quella chiamata, cercando di capire, per quello che ho potuto. Il valore di ritorno inserito nell'istruzione me.close(x) della form chiamata mi é stato molto utile perhé mi ha permesso di testarlo subito dopo il rientro alla Form chiamante ed ho potuto riconoscerlo per ritornare da quel punto alla Form Fmain per l'ulteriore scelta.
Perciò, quello che ho potuito fare col tuo suggerimeneto é proprio quello che volevo, quindi meriti un :-*
Penso che sia anche chiaro il concetto sul passaggio dei parametri tramite l'array che viene intercettato dentro la procedura _New della Form chiamata; ritengo però non essere cresciuto in esperienza e conoscenza logica relativamente alle istruzioni di chiamata tramite metodo _new nella Form chiamante:
DIM Frm3 AS Form3
DIM ret AS Integer
DIM $Param AS NEW String[]
Frm3 As Form3 --> somiglia molto alla dichiarazione di una classe o contenitore(come lo chiami tu);
Frm3 = NEW Form3($Param) --> somiglia molto alla chiamata di una nuova ricorrenza della classe dichiarata sopra;
iRet = Frm3.ShowModal() --> sembrerebbe inutile, in quanto dà l'impressione di essere una seconda chiamata della stessa classe della riga superiore.
É codesto il concetto che non ho capito e cercavo una spiegazione nella lettura diretta del codice in uno dei tuoi esempi, ma non sono riescito a farlo perché non ho trovato un codice simile.
Sto cercando di impossessarmi del concetto e per questo parto da i seguenti capisaldi, almeno credo:
- La Form é una classe statica e va chiamata con l'istruzione show o showmodal (quest'ultima obbligatoria per potere utilizzare il metodo -new);
- L'oggetto Frm3(nell'esempio) dovrebbe costituire il contenitore dell'indirizzo della Form3 a cui viene agganciata la lista dei parametri contenuta nell'array $Param.
- La variabile iRet(nell'esempio) é destinataria del valore di ritorno fornito dalla Form chiamata a fine lavoro.
Se é così come ho descritto qui sopra, penso di averne capito a grosse spanne il meccanismo; se invece non é così posso partecipare ad un corso di "Caccia al Metodo nascosto" che potresti tenere in occasione del prossimo Natale a Roma con offerta di panettone per tutti i partecipanti. :rotfl:
A parte gli scherzi, quello che ho scritto relativamente ai capisaldi, é scivolato così come lo leggi mentre scrivevo; non esisteva assolutamente all'inizio del post.
Ciao.