Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 09 Agosto 2010, 16:42:06

Titolo: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Berserker79 - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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é? ...... ???
 :(

Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Berserker79 - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
 :(
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
 :( :(
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 17 Agosto 2010, 13:59:46
Certo, ma dove trovo il codice?
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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. :)
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 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...
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 18 Agosto 2010, 02:17:02
Ho letto il codice, e ti ho fatto qualche modifica documentata.

Se hai dubbi chiedi.

Bye
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 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... :-)

Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: andy60 - 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..
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: milio - 19 Settembre 2010, 23:49:41
Ma nella classe del Form3 hai fatto richiesta di passargli dei dati nel metodo speciale _new:

Codice: gambas [Seleziona]
PUBLIC SUB _new(Parametri AS String[])


END


?
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 20 Settembre 2010, 00:04:54
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:
Citazione
Not enough arguments
Ecco la riga di dichiarazione della procedura _new:
Codice: [Seleziona]
PUBLIC SUB _new(TbParF3 AS String[])
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 20 Settembre 2010, 00:50:09
Il problema è legato al fatto che Form accetta già un parametro, che è il riferimento (se esiste) di un altro contenitore, che gli fà da parent.
In questo caso, prova a passargli il tuo parametro, seguito da un bel NULL (es. Form(parm, NULL)).

Inoltre, ma potrebbe anche non essere (devo provarlo), prova ad eliminare l'underscore davanti al nome della variabile. Non sò come si comporta gambas in questo caso, ma l'underscore davanti ad un metodo lo rende privato e non visibile all'esterno. Questa è una caratteristica usata per la creazione dei componenti (e milio la conosce bene...  :P ).

Come ultimo, nel forum ho pubblicato alcuni esempi fatti appunto per capire le funzionalità di gambas, e uno di questi è praticamente il tuo programma, su cui ho giocato un poco, aggiungendo alcune cose per dimostrare come funzionano le classi, gli oggetti e l'uso di _new().

Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Ceskho - 20 Settembre 2010, 00:54:38
Il problema è legato al fatto che Form accetta già un parametro, che è il riferimento (se esiste) di un altro contenitore, che gli fà da parent.
In questo caso, prova a passargli il tuo parametro, seguito da un bel NULL (es. Form(parm, NULL)).

Scusa, ma non è il contrario? Non accetta PRIMA il contenitore e poi tutti i parametri creati dal programmatore?
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: milio - 20 Settembre 2010, 06:08:27
L'errore secondo me nasce  invece da questo:

  Frm3 = NEW Form3($_FrmParam)
  i_SwReturn = Form3.Showmodal()


Tu dichiari un nuovo Form3 nella variabile Frm3
Poi pero' cerchi di aprire Form3, che ovviamente vuole i parametri del metodo _new(), quindi e' giusto che scateni l'errore...
Devi dare:

  Frm3 = NEW Form3($_FrmParam)
  i_SwReturn = Frm3.Showmodal()

Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 20 Settembre 2010, 09:58:17
Si, effettivamente é stata una mia svista. Ho corretto l'istruzione errata e con
Codice: [Seleziona]
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
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 20 Settembre 2010, 10:03:24
..., nel forum ho pubblicato alcuni esempi fatti appunto per capire le funzionalità di gambas, e uno di questi è praticamente il tuo programma, su cui ho giocato un poco, aggiungendo alcune cose per dimostrare come funzionano le classi, gli oggetti e l'uso di _new().

Potresti, se non ti secca, facilitarmi la ricerca comunicandomi il link?
Scusami, se ti posso sembrare pigro, ma ... forse lo sono proprio. ;D
Ciao.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 20 Settembre 2010, 10:48:55
In effetti mi era sfuggita l'istruzione errata... per fortuna milio ci vede meglio di me...   8)

Citazione
Scusa, ma non è il contrario? Non accetta PRIMA il contenitore e poi tutti i parametri creati dal programmatore?
No, è il contrario, i parametri si accodano partendo dall'oggetto parent più in alto...

Riguardo al link, devo guardare, ma credo che Cesko abbia in qualche modo spostato il tutto da qualche parte... forse ha creato un'altro contenitore... devo controllare...
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 20 Settembre 2010, 10:50:22
Prova qui...

http://www.gambas-it.org/smf/index.php?topic=1353.0 (http://www.gambas-it.org/smf/index.php?topic=1353.0)
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 20 Settembre 2010, 12:46:21
Prova qui...
http://www.gambas-it.org/smf/index.php?topic=1353.0 (http://www.gambas-it.org/smf/index.php?topic=1353.0)

Grazie per l'indicazione. Solo che dopo avere fatto il download di tutti gli esempi ed averli guardati, non ho capito quale di essi potesse contenere, come hai citato qualche post fa, il mio programmino di prova
Citazione
uno di questi è praticamente il tuo programma, su cui ho giocato un poco, aggiungendo alcune cose per dimostrare come funzionano le classi, gli oggetti e l'uso di _new()
L'unico che potrebbe aiutarmi mi sembrerebbe TestEvent.tar.gz, ma non vi ho trovato le istruzioni che cercavo e quindi non l'ho capito.
Mi dispiace,  :-\, occorre che scenda al mio modesto livello comunicativo.
Ciao.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 20 Settembre 2010, 14:31:12
Ma che te possino!  :bad:

In effetti scherzavo un pochino sul "praticamente il tuo programma"...  :P

Perchè dici che non può esserti utile?
Nell'esempio ci sono parametri e gestione eventi, un pò di tutto insomma...

Altrimenti puoi vedere gli altri. Nei miei programmi, solitamente, io faccio esclusivamente uso del costruttore, se necessario.

Ad ogni modo, quello che non capisco, a parte alcune piccole particolarità, come ad esempio la posizione dei parametri, oppure alla piccola svista sulla chiamata della form, non capisco dove ti sei incagliato. Il numero di post non lo calcolo...  :'(

Tu hai una form... di norma le form di dialogo ritornano solo un valore intero, con cui è possibile stabilire cosa è successo, o cosa fare, alla chiusura della finestra.
Dato che non hai, e non puoi avere altri tipi di ritorno, l'unco modo che hai per poter modificare dei dati dalla finestra di dialogo, dati che appartangono ad altra procedura, è quello di passarli sottoforma di oggetto alla form di dialogo (il perchè un oggetto te lavevo chiarito).
Detto questo, nel metodo _new della form di dialogo, dichiari l'oggetto che riceve questi dati e, nella funzione chiamante, crei la form di dialogo passandogli appunti i dati da modificare, opportunamente codificati in un oggetto (es. String[], Object, ecc.).
Nella finestra di dialogo, devi poter capire se, un'eventuale chiusura, deve ritornare un particolare codice, in modo che la funzione chiamante possa stabile cosa fare quando la dialog si chiude. Ammettiamo per il caso di avere un bottone Chiudi, la pressione di questo pulsante genera un evento Click, e all'interno di questo evento fai un bel "ME.Close(1)". Il valore 1 è un valore di esempio, ma sicuramente valido per uno scopo preciso, ovvero far in modo di avvertire la funzione chiamante che la dialog è stata chiusa dal pulsante, e non per altre cause.

A questo punto, come hai pure fatto, la funzione chiamante riceve il valore di 1, che vuol dire che devi fare qualcosa, e nel tuo caso cosa lo sai tu... :D

Ora è chiaro il discorso?
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 20 Settembre 2010, 18:15:40
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:
Codice: gambas [Seleziona]

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.
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 21 Settembre 2010, 15:34:48
A parte il bacio, che accetto idealmente, ma mi fà anche un pò schifo...  ;D

Ti dico che:

1) la Form non è un oggetto statico, leggi bene la doc, ma un oggetto che non può essere usato come padre di un'altro (il concetto di INHERITS).
2) il codice che hai incorniciato ha un errore: la DIM dichiara un tipo, e l'istruzione "Frm3 AS Form3" è errata e dà sicuramente errore in compilazione
3) l'istruzione _new viene sempre eseguita, sia negli oggetti statici, che negli altri, solo che verrà eseguita solo alla prima chiamata di un qualsiasi suo metodo
4) Frm3 è a tutti gli effetti il riferimento, o puntatore, all'oggetto appena creato. Ed è per questo che deve essere dichiarato come stesso tipo (ma qui il discorso può ampliarsi, lasciamolo per il futuro)
5) Quello che affermi sulla variabile iRet è corretto

Sono felice che, in qualche modo, sia riuscito a farti capire il sistema, e sono qui per rispondere alle, sicure, successive tue domande...  :P

Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: Picavbg - 22 Settembre 2010, 00:17:15
A parte il bacio, che accetto idealmente, ma mi fà anche un pò schifo...  ;D
Anche a me, ma soprattutto per via dei peli che mi sono rimasti attaccati alle labbra.  :rotfl:

Citazione
2) il codice che hai incorniciato ha un errore: la DIM dichiara un tipo, e l'istruzione "Frm3 AS Form3" è errata e dà sicuramente errore in compilazione
Fino ad ora non ho assolutamente proceduto con la compilazione. Forse il mio modo di procedere non é proprio profiquo, perché probabilmente bisognerebbe compilare il programma di tanto in tanto, magari al raggiungimento di un nuovo punto fermo dello stato dell'arte, secondo un modo di dire convenzionale.  ??

Citazione
Sono felice che, in qualche modo, sia riuscito a farti capire il sistema, e sono qui per rispondere alle, sicure, successive tue domande...  :P
Vedo che cominci a conoscermi. Però, visto che sai prevedere quello che farò, potresti almeno anticiparmi la risposta, così almeno potrei risparmiarmi la o le domande.  :D :D

Grazie ancora.
Ciao.


[/quote]
Titolo: Re: Impiego dei "Metodi nascosti"
Inserito da: md9327 - 22 Settembre 2010, 00:44:07
No, spetta un momento, mica mi hai preso per Nostradamus ?  :rolleyes:

Scherzi a parte, ormai quello che vuoi ottenere sembra abbastanza chiaro, ma da qui al cosa farai domani ce ne passa...

La logica più o meno sembra tu l'abbia compresa, il codice che hai postato sembra corretto, a parte la nota che ti ho inserito (nota, non sei ancora stato bocciato...  ;D ).

Se quella è stata una svista, ok, altrimenti c'è ancora qualcosa che non hai digerito...

Molti linguaggi usano definire ad inizio metodo (o funzione, o classe) il tipo di variabile che andrà ad utilizzare. In gambas, come in VisualBasic, questo si fà con la parolina DIM. Questo, però, in effetti non fà ancora nulla, ma dice solo al compilatore che quel nome di variabile verrà utilizzato per puntare ad un particolare tipo di dato.
Una volta stabilito il tipo, la variabile deve essere istanziata, ovvero creata relamente in memoria. Questo, dipendentemente dal tipo di variabile, se è un oggetto si usa la sintassi NEW, mentre per le variabili normali l'assunzione in memoria avviene alla prima assegnazione o al primo utilizzo, sempre premesso che il linguaggio azzeri in qualche modo il dato ivi contenuto.

A questo punto, se si tratta d una semplice, ad esempio, String che di default viene inizializzata a "" (vuoto), basta utilizzarla che viene immediatamanete istanziata. Nel caso di oggetti, come sopra accennato, dato che contengono sia codice (metodi) che dati (proprietà), la cosa assume alcune differenze. La prima è che l'oggetto deve essere esplicitamente creato, ovvero fornita sufficiente memoria per contenerlo, poi chiamato il suo costruttore. In alcuni linguaggi come Gambas, questo è implicito con l'uso dell'istruzione NEW, che provoca prima la creazione in memoria dell'oggetto, poi esegue il suo costruttore, in tutti i casi il metodo _new(). In altri linguaggi questo assume diverse modalità, ad esempio in C/C++, o in Java, il costruttore è un metodo che ha lo stesso nome della classe, senza valori di ritorno.

Inoltre, ogni oggetto prevede anche un metodo distruttore, che in gambas viene assunto da un'altro metodo nascosto _free().

Ora, non voglio appesantire il discorso, per cui ometto di parlarti di free() e di delete(), anche perchè gambas ha un sistema che li chiama automaticamente quando l'oggetto non viene più usato. Semmai ne parleremo in seguito. Tieni conto che anche io lo uso molto poco, anche perchè, in alcuni, casi crea dei problemi che tocca tener ben presenti.