Autore Topic: Impiego dei "Metodi nascosti"  (Letto 3312 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Impiego dei "Metodi nascosti"
« il: 09 Agosto 2010, 16:42:06 »
Vedo che é faticoso seguire un ragionamento in un programma gìa abbastanza avanti nella fase di sviluppo. Perciò ho decuiso di partire da un esempio elementare con un programmino formato da pochi oggetti, ma utili a farmi capire il meccanismo dei metodi nascosti, col passaggio di parametri in andata e ritorno e, dulcis in fundo, iniziando da FMain, ritornare, alla fine, proprio a FMain.

Il  programma che ho realizzato contiene tre Form:
Fmain
Form1
Form2.

Lo scopo é:
Citazione
FMain parte e chiama la Form1 tramite metodo _new, passandole 2 parametri;
Poi la Form1 dovrebbe chiamare la Form2, sempre tramite metodo _new, passandole 3 parametri, i 2 precedenti, più un terzo
A sua volta la Form2 dovrebbe comandare un return alla Form1 o alla FMain, modificando opportunamente i parametri ricevuti.
Mi sono fermato al primo passaggio, per capire se ho fatto bene; infatti, sono riuscito a chiamare la classe Form1, ma non sono sicuro di avere percorso la strada giusta. Ho tentato poi in  questa prima fase di eseguire un RETURN ad FMMain, ma ottengo sempre errore.
Per maggiore chiarezza, allego un file ".tar.gz"

Dei due passi appena citati ho eseguito solo il primo, perché ho voluto subito provare come era andata prima di proseguire.
:ciao:

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #1 il: 09 Agosto 2010, 19:38:11 »
Con una piccola modifica sembra funzionare. Ti allego il file modificato.
Cmq per me si dovrebbe cambiare ancora qualcosina.
Ciao.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #2 il: 09 Agosto 2010, 22:39:53 »
Ho guardato la tua modifica, ma non é quello che volevo; infatti, nella prova che ho fatto dopo la tua modifica, ho ottenuto l'emissione del messaggio
Citazione
Lavoro eseguito correttamente
contemporaneamente alla compilazione della Form1, mentre la sequenza dovrebbe essere
Emissione FMain
--> pressione del pulsante "INVIO"
       Emissione della Form1
       --> pressione del pulsante "INVIO"
             Ritorno alla FMain
       Chiusura della Form1
FMain:
Emissione del messaggio: Lavoro eseguito correttamente[

Ciò significa che il programmino non funziona!
Secondo me non funziona perché Gambas continua a svolgere le istruzioni successive alla chiamata della classe Form1 e cede il controllo alla Form1.Class, solo dopo avere incontrato l'istrruzione END.

A me non interessa in questa fase fare funzionare a tutti i costi il programmino, ma capire se la chiamata della Form1, col metodo _new é fatta bene. Da quello che succede penso proprio che non é così.
Il quesito allora é:
Perché? ...... ???
 :(

:ciao:

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #3 il: 09 Agosto 2010, 23:10:41 »
A mio avviso il programma funziona perfettamente. Una volta caricato il form1 gambas ha concluso l'evento click lanciato da fmain, quindi non ha a chi ritornare i dati.
Quindi per ottenere quello che vuoi tu devi usare il retur all'interno dell'evento scaturito da fmain, oppure usare una variabile pubblica nell'fmain che puoi manipolare anche dal form1.
Ovviamente la mia risposta è circoscritta alle mie conoscenze di gambas (molto poche direi) quindi lascio la parola agli esperti per smentire o meno quanto ho scritto.
Ciao.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #4 il: 14 Agosto 2010, 09:30:16 »
Ho l'impressione di non essermi spiegato bene. Il problema principale di questo programmino di esempio é:
In FMain.Class
Codice: gambas [Seleziona]
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.
 :(
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #5 il: 15 Agosto 2010, 23:01:31 »
 @ 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:
 
Codice: [Seleziona]
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.
 :( :(
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #6 il: 17 Agosto 2010, 13:59:46 »
Certo, ma dove trovo il codice?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #7 il: 17 Agosto 2010, 15:10:17 »
Certo, ma dove trovo il codice?
Il codice é pazialmente riportato nel post di risposta n.4, mentre tutto il programmino di prova é allegato al post iniziale. :)
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #8 il: 18 Agosto 2010, 02:00:45 »
Ho scaricato, ma non ho ancora letto il codice dei due file.

Ad ogni modo, rileggendo i post precedenti, mi è venuto un dubbietto...

Vediamo se è corretta la mia ipotesi:

a) tu vuoi aprire la form2 dalla form1, tramite un pulsante
b) gli passi dei parametri, presumo...
c) alla chiusura della form2 ti aspetti un ritorno, è corretto?
d) se sì, tu non puoi averlo, dato che la form2 non è una finestra di dialogo.
e) l'unico modo per ritornare dei valori alla form1, è di passare un oggetto come parametro alla form2. Un oggetto, perchè questo assume un posto preciso in memoria, e viene tenuto dalla form1.

Se, ad esempio, vuoi che la form2 ritorni di un campo di edit alla form1, devi fornirgli un parametro di tipo String[] (array, String normale), creato nella form1 prima dell'aperura della form2.
Se, invece, vuoi che la form2 ritorni un valore Boolean, devi passargli un oggetto Boolean[], con un solo elemento Boolean[0]=FALSE, che la form2 può cambiare in TRUE o FALSE a seconda dei casi. La form1, dato che è proprietaria dell'oggetto in questione, si ritrova l'array modificato.
Se, ancora, vuoi che la form2 ritorni una serie di valori (es. stringa), devi sempre passargli un'array String[], in questo caso vuoto, che la form2 popola e che la form1 si ritroverà valorizzato di conseguenza.

Comunque, domani mi leggo il codice e ti saprò dire con maggior sicurezza.

'notte...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #9 il: 18 Agosto 2010, 02:17:02 »
Ho letto il codice, e ti ho fatto qualche modifica documentata.

Se hai dubbi chiedi.

Bye

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #10 il: 18 Agosto 2010, 15:31:11 »
Ho capito molte cose. Grazie.
Però, se mi permetti, vorrei segnalare che il wiki, in proprosito, non risulta chiaro, perciò, se riesci a trovare un pò di tempo, dovresti aggiungere, nella spiegazione del metodo, la parte concernente la chiamata Formx.showmodal, nonché il successivo riscontro dell'array parametrato(nel mio caso $_Param) eventualmente modificato, perché penso che tutta la suddetta parte non sia facilmente intuibile ed un chiarimento più dettagliato potrebbe aiutare altri sventurati utenti in prova, come me.  :D

Ragionando sul codice che mi hai restituito ho trovato anche la seguente istruzione:
Codice: [Seleziona]
IF (ret) THEN 
scritta in maniera, per me, assolutamente nuova, perché essendo ret una variabile di tipo intero, non mi aspettavo di trovarla fra parentesi e mi pare che scrivere
Codice: [Seleziona]
IF ret <> 0 THEN
sia la stessa cosa; infatti
Citazione
entrambi testatno che la condizione  ret<>0  sia VERA
Se ho capito male, correggimi.
Ciao.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #11 il: 18 Agosto 2010, 23:53:10 »
Di nulla...

Riguardo al metodo _new() descritto nel wiki, che poi comunque controllerò, questo non riguarda il perchè e come si comporta un oggetto, al passaggio tra una funzione e l'altra. Questo è un concetto che riguarda gli oggetti in quanto tali.
In alcuni linguaggi, come il Basic e pure in Gambas (cosa che cambiarà nella versione 3), elementi complessi come gli oggetti vengono sempre passati come riferimento, ovvero l'indirizzo di memoria cui si trovano. Riguardo le normali variabili di tipi base, vedi Integer/String/Long ecc., questi non sono oggetti ma valori ben precisi, che vengono passati come valore, e non come locazione di memoria. Questa differenza implica che, per quanto riguarda gli oggetti, ogni modifica al suo contenuto viene mantenuta, mentre per le variabili, dato che ne viene passata una copia del valore, queste vengono perse all'usita della stessa funzione che le manipola.
Nella versione 3 di Gambas, credo, verrà implementato il concetto di parametro passato "per riferimento", per cui a questo punto la funzione prenderà in ingresso l'indirizzo di memoria in cui è depositato il valore, e non ne creerà una copia; questo permetterà, come per gli oggetti, di ritrovarsi la variabile modifica anche dopo l'uscita dalla funzione.

Il fatto di mettere le parentesi tonde in una condizione, come ad esempio per IF, è un derivato dalla mia esperienza di C/C++, per cui è diventata un'abitudine, oltre a migliorare a mio avviso la lettura del codice, specialmente se usi condizioni multiple, e in alcuni casi necessaria se giochi con le logiche AND e OR. Quindi non farci caso... ma ricorda che potrebbero risultare utili... :-)


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #12 il: 19 Settembre 2010, 17:10:58 »
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
Codice: gambas [Seleziona]
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.
:ciao:

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Impiego dei "Metodi nascosti"
« Risposta #13 il: 19 Settembre 2010, 19:59:44 »
ma a cosa serve?scusate l'ignoranza/stanchezza...i parametri tra le form me li passo con un valore public in un modulo generale o sbaglio..

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impiego dei "Metodi nascosti"
« Risposta #14 il: 19 Settembre 2010, 23:34:16 »
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:
Citazione
type mismatch: wanted Control, got string[] instead
il codice incriminato é:
Codice: gambas [Seleziona]
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
Codice: [Seleziona]
$_FrmParam.add("prova1")
, il messaggio d'errore é sempre lo stesso. Da che cosa può dipendere?  ???
Ciao.
:ciao: