Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 21 Settembre 2010, 16:22:27

Titolo: [Risolto]Diamo un taglio alle variabili globali
Inserito da: Picavbg - 21 Settembre 2010, 16:22:27
La sapete l'ultima del Ministero degli Interni di Gambas?
Per rientrare nel budget di spesa indicato nella fianaz-Memory bisogna apportare un taglio deciso all'impiego di variabili globali nei programmi comunitari.  :rotfl: :rotfl:
Perciò sto cercando di uniformarmi alle disposizioni e, attraverso i vari metodi su cui sto impegnando la mia mente in questo momento, operando un taglio di qua ed un taglio di là, sto diminuendo drasticamente la presenza di variabili globali nel mio programma.

Sono però di fronte ad una tabella che attualmente corrisponde alla Mesi.List (ComboBox) contenuta nella Form1, per cui fino ad ora ho sempre fatto riferimento alla Lista tramite istruzioni del tipo
Codice: [Seleziona]
Form1.Mesi.List[i_Mese]
Adesso la Form1 viene richiamata con la metodologia "Metodi nascosti" e l'istruzione appena citata non funziona più, perciò ho bisogno di costituire un'array specifico che prima non mi serviva e, piuttosto, che crearlo come variabile globale, vorrei definirlo dentro la Form FMain con
Codice: gambas [Seleziona]
STATIC PUBLIC TabMesi AS String[12] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]

Così facendo potrei interrogare sempre l'array con la mia vecchia istruzione dopo averlas adeguata --> FMain.Mesi[i_Mese] ed eviterei una vera e propria variabile globale.

Secondo la vostra maggiore esperienza, riesco nell'intento, oppure esiste un'altro procedimento più efficace ed a risparmio energetico?  ;D
Ciao
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 21 Settembre 2010, 17:07:45
La tabella specificata, in definitiva credo non cambi mai... Detto questo puoi trasformarla in costante, aggiungendo appunto la clausola CONST.

Ma, a parte questo, l'uso di quella variabile in definitiva non cambia, basta chiamarla nel giusto modo, ovvero <Nome classe>.<Variabile>, che è poi convetualmente uguale al chiare una proprietà di un oggetto.

Vedo di chiarire il concetto.

L'uso di variabili globali, oltre che deleterio come hai descritto (ma ci sono altre implicazioni), è pure fuori luogo, visto che il linguaggio permette di gestire la memoria in modo molto dinamico.

La tua dichiarazione, come sopra detto, non cambia, se questa è dichiara all'interno di una classe appropriata, e potrà essere utilizzata allo stesso modo che se fosse dichiarata all'interno di un modulo che, ricordo, è comunque una classe nella struttura Gambas, solo che è per definizione statica.

Una volta che la variabile assume la forma di costante, questa non può essere referenziata ovvero, non c'è bisogno di creare la classe per potervi accedere, perchè creata automaticamente all'avvio dell'applicazione (è un elemento statico, ovvero sempre presente in memoria).

Se, al contrario, la definisci come proprietà di una classe, allora sei obbligato a creare la classe stessa, prima di poter accedere a quella variabile.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 22 Settembre 2010, 15:43:56
La tabella specificata, in definitiva credo non cambi mai... Detto questo puoi trasformarla in costante, aggiungendo appunto la clausola CONST.
...............................
Una volta che la variabile assume la forma di costante, questa non può essere referenziata ovvero, non c'è bisogno di creare la classe per potervi accedere, perchè creata automaticamente all'avvio dell'applicazione (è un elemento statico, ovvero sempre presente in memoria).

Dal nuovo spunto che mi hai dato ho ripreso la mia variabile definita in FMain:
Codice: [Seleziona]
STATIC PUBLIC TabMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
provata e funzionante, e l'ho modificata così:
Codice: gambas [Seleziona]
PUBLIC CONST TabMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]

ma evidentemente non ho capito, perché così come l'ho scritta fornisce l'errore
Citazione
Bad constant type alla line xx in FMain.class
, come se Gambas non accetti una constante stringa strutturata sotto forma di array.

Ho anche cercato un esempio simile nel Forum, nel Beginner Guide, nel wiki, ma non sono stato capace di trovarlo. Eppure la modifica mi sembrava semplice. Dove ho sbagliato?
Ciao
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 22 Settembre 2010, 16:08:15
Intanto modificala aggiungendo STATIC all'inizio, altrimenti ne ricrea una nuova ad ogni nuovo oggetto, e la cosa non è ottimale...

Poi, attenzione ai ritorni a capo, se ce ne sono, perchè Gambas2 non digerisce definizioni di proprietà che ritornano a capo nella dichiarazione.

Altra alternativa sarebbe quella di creare un motodo statico, ma forse ti complico la vita.


COmunque, ora non posso verificare il problema, perchè non ho Gambas a disposizione. Stasera potrò risponderti...
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 22 Settembre 2010, 16:26:15
In realtà dovevo avviare la VM con Linux...  :P

Devi perdonarmi, ma era una cosa ormai che avevo dimenticato, e avevo utilizzato altri modi per farlo...

Comunque, la clausola CONST in realtà si può usare solo con variabili semplice (es. String, Integer, ecc.) e non con gli array. Questa è una limitazione di gambas2, che spero abbiano corretto nella 3.

Ad ogni modo, ripensando alla tua modifica, in realtà parti da un concetto non totalmente corretto.
E' corretto pensare che un determinato dato "fisso", che faccia comunque parte a un determinato oggetto o classe, debba possibilmente essere inserito nel giusto posto, ovvero la classe stesso. E' anche vero che in questo caso specifico, in realtà tu stai definendo una cosa che praticamente non cambia mai.
Però, e dico però, questo non esclude che tu possa comunque inserirla nella classe appena creata, come hai fatto, ma dato il problema di cui sopra, sei costretto ad non usare CONST. Però, e continuo a dire però, ed è una cosa che faccio di norma, si può creare un'apposito metodo statico, che ritorni un array contenente i dati di cui sopra (i nomi dei mesi).
Il risultato non cambia, nel senso che il metodo statico ritornerebbe comunque una array (che puoi anche rendere NON modificabile), e tenere il metodo nella classe in cui hai deciso di inserirlo.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 22 Settembre 2010, 18:48:05
Scusami, ma non ti capisco, o meglio: non capisco cosa intendi per:
Citazione
si può creare un'apposito metodo statico, che ritorni un array contenente i dati di cui sopra (i nomi dei mesi).
   :-\
Forse, se mi potessi fornire un esempio (possibilmente dettagliato), potrei riuscire a capire.
 :(

Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 23 Settembre 2010, 10:53:13
Ti faccio un esempio al volo, dato che ho sempre delle difficoltà a reperirti codice funzionante dal posto in cui sono...

Codice: [Seleziona]
STATIC PUBLIC FUNCTION TabMesi() AS String[]
  DIM tbMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
  RETURN tbMesi
END

Dato che la funzione TabMesi è dichiarata statica, puoi chiamarla direttamente, anche se è inclusa in una classe:
Codice: [Seleziona]
<classe>.TabMesi()
quindi allo stesso modo di un modulo.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 25 Settembre 2010, 23:50:01
Ti faccio un esempio al volo, dato che ho sempre delle difficoltà a reperirti codice funzionante dal posto in cui sono...
Codice: [Seleziona]
STATIC PUBLIC FUNCTION TabMesi() AS String[]
  DIM tbMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
  RETURN tbMesi
END
Dato che la funzione TabMesi è dichiarata statica, puoi chiamarla direttamente, anche se è inclusa in una classe:
Codice: [Seleziona]
<classe>.TabMesi()
quindi allo stesso modo di un modulo.

Mmmmmmmh  :danger:
Se ho finalmente capito, tu dici: dichiaro un modulo contenente la funzione public in cui costruisco la famosa stringa TabMesi, valorizzata coi mesi in chiaro:
' Gambas class file
Codice: gambas [Seleziona]
'----------------------------------- Modulo TableMesi --------------------------------------------------------------------------------------------------------------------------------------------------
STATIC PUBLIC FUNCTION TabMesi() AS String[]
  DIM tbMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
  RETURN tbMesi
END

.; poi per richiamare uno degli elementi, per Es. "Settembre", in qualsiasi procedura del progetto, scrivo:
Codice: gambas [Seleziona]
Mese = TableMesi.TabMesi[8]
print Mese


Però non discosta molto dal mio utilizzo attuale:
Codice: [Seleziona]
STATIC PUBLIC $TabMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
che richiamo con:
Codice: [Seleziona]
$Mese = FMain.$TabMesi[8]
Print $Mese

Il modulo é effettivamente sempre presente in memoria, ma il mio Fmain che utilizzo per richiamare tutte le Form del Progetto con i vari richiami di tipo showmodal, tramite metodo _new, credo che sia sempre in memoria.
O no ?  :-[

Aggiungo poi un'altra riflessione: La dichiarazione di una variabile globale é Public, mentre quella dichiarata nel modulo "TableMesi" é DIM, però quest'ultima appartiene ad una Function di tipo STATIC PUBLIC. Ma in pratica non occupa sempre una posizione di memoria, così come una variabile globale?

Insomma: Non é mollica, ma briciola. :)
Ciao
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 27 Settembre 2010, 13:03:44
Sai qual'è il problema?

Questa piccola chiacchierata si stà basando su una base non propriamente corretta, ovvero su un caso che ha poco senso nel concetto generale della programmazione ad oggetti.

Come ti avevo anche accennato, per il caso specifico ha poca importanza se sia incluso in un modulo o in una classe, perchè trattasi di dati appunto statici, che non cambiano nel tempo. Questo a meno che tu non abbia voglia di implementare un progetto multilanguage...

Le variabile che, come dive anche il nome sono "variabili", hanno un determinato scopo, ovvero quello di contenere dati mutabili nel tempo.
Nella vecchia programmazione, come nella nuova ad oggetti, questi elementi sono basilari, non si può farne a meno. E' come avere un cervello senza memoria (dove appoggi i dati che sti elaborando?)...

Piccola nota:
nell'ultimo esempio che ti ho fatto, non puoi richiamare un elemento dell'array in quel modo. Dato che l'array è restituito da un metodo, devi prima chiamare il metodo "<classe>.TabMesi()", indi l'indice "<classe>.TabMesi()
In teoria potresti anche implementare un parametro "indice", cda utilizzare per farti ritorna un determinato mese, e non tutta la lista.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 28 Settembre 2010, 22:06:43
Sulle variabili globali mi sento di fare una considerazione: premesso che non sono un ultraesperto programmatore, ma se devo passare dei dati da una form all'altra non riesco a non usare variabili globali. Faccio un esempio: attraverso la form ricette richiamo la form alimenti e seleziono un alimento selezionato. L'id selezionato serve nella form ricette, non trovo altro modo x passare i dati se non attraverso una variabile globale. Con i metodi nascosti di cui parlate...ancora non sono alla mia portata...sto studiando l'esempio di mdxxxx :hard: sui metodi nascosti
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 29 Settembre 2010, 00:25:12
Ciao andy!

Come per picav, il discorso è perchè ancora non vi è ben chiara una cosa... leggete!!!

Scherzo, ma sono anche serio... il tuo problema è che Form accetta già di suo un parametro opzionale, ovvero un oggetto, un container.

Mi spiego meglio...

Considera la Form una specie di Panel, e lo è davvero, che può essere inserita in un'altro contenitore. La Form stessa è un contenitore, ma in ogni caso è derivata dall'oggetto Window, da cui deriva proprio questo parametro opzionale.

Dato che è opzionale, se non lo passi nella creazione della Form, viene considerata NULL, ma comunque è come se glielo avessi passato.
Se tu crei una Form, su cui definisci un tuo parametro, questo si aggiunge a quello esistente e, per la logica implementata in Gambas, la sequenza con cui devi passare i parametri è descritta nella documentazione, ovvero devi prima iniziare con i parametri della classe derivata più bassa (la tua), seguiti dai parametri della classe superiore, e così via.

Ad ogni modo, il mio discorso sicuramente vi avrà portato fuori strada, perchè nel tuo caso specifico, il parametro che tu passi alla tua Form, in teoria deve essere letto dalla "tua" Form, e non dalla classe superiore (la Window, tanto per intenderci...).
Quello che devi verificare, è che la "tua" Form, abbia il metodo _new(), con il "tuo" parametro. Se questo non c'è, è inutile che glielo passi, perchè se lo prenderà la classe superiore, che si aspetta invece un tipo di dato diverso, è quindi ti dà errore.

Si è fatto un pò tardi, e sono pure abbastanza malmesso (con questo tempaccio...), quindi spero che abbia scritto cose comprensibili...  ;D

Usare variabili globali è sicuramente fattibile, e infatti funziona, ma funziona fichè hai un piccolo progetto, che ti permette di tener sotto controllo tutte le fasi logiche. Ammettiamo per caso, di avere un grosso progetto, in cui sono definiti un massiccio numero di componenti (oggetti, moduli, e via dicendo), e tutti si alimentano con i dati globali, e per necessità questi dati devono poter essere manipolati, ogni classe può, in definitiva, aggire su questi, ignaro di quello che stanno facendo gli altri. Metti conto dei processi non sequenziali, che lavorano in modo asincrono... coem gestisci le eventuali e possibilissime sovrascritture? Come riesci a capire se il dato che ti aspetti, non sia nel frattempo stato modificato da un altro processo?

Il passaggio di dati, attraverso le varie funzioni che compongono un programma, non è logica uscita fuori con la programmazione ad oggetti, ma per l'esigenza di avere il maggior controllo possibile sulle informazioni veicolate, senza interferenze.

Certo, avere un'area pubblica, in cui posizionare i nostri dati, rende la vita molto più semplice. Ma questo solo apparentemente, e solo inizialmente. Quando ci si accorge dei problemi che poi questo comporta, il discorso assume un'aspetto diverso.

Quello che infine voglio dire, è che tutti inizialmente compiono questo errore di valutazione, ci siamo passati tutti, ma questo è dipeso solo dalla nostra scarsa conoscenza della materia. Come hai anche tu sottolineato, andy, non avendo capito alcuni concetti, ovviamente hai scelto la strada apparentemente più alla portata, il che mi pare anche normale.
La programmazione si basa sull'esperienza, ma questa bisogna farla provando e riprovando, chiedendo lumi, e cercando di capire il perchè e il percome una cosa debba funzionare in un modo piuttosto che in un'altro, quali strumenti ho a disposizione, provare ad implementarli, e via dicendo. La programmazione NON è una scienza esatta... ;)

Scusate, mi sono dilungato un pò troppo...  :-\
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 29 Settembre 2010, 07:55:15
Grazie per la sempre puntuale, precisa e piena di spunti, risposta, sono riuscito a far funzionare il tuo codice in myZone e in effetti ci sto prendendo gusto.  :2birre:
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 29 Settembre 2010, 13:03:46
Grazie per la sempre puntuale, precisa e piena di spunti, risposta, sono riuscito a far funzionare il tuo codice in myZone e in effetti ci sto prendendo gusto.  :2birre:

Complimenti! Stavo per mandarti un esempio dal mio programma, perché, secondo me, a volte le parole non bastano per chiarire bene un concetto; allora occorre aggiungere un pò di materiale pratico, però una volta che hai risolto e, soprattutto, compreso, non é più necessario.

Chiedo scusa a md9327 per la precisazione appena fatta, ma, con essa, non voglio minimamente criticare le sue spiegazioni, sempre ricche di dettagli di logica meccanicistica di Gambas, e non solo.
Purtroppo, però, la limitata conoscenza che uno come me può avere del "contenitore massimo", cioé di Gambas, non ne permette la corretta e/o completa comprensione.  :D

E siccome: Tutto é bene quel che finiosce bene, mi associo al  :2birre:
Ciao.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 29 Settembre 2010, 14:36:46
Non me la prendo sicuramente, anzi, siamo qui per imparare tutti, anche io... (e non poco...)

Al contrario, io spero di non aver offeso magari qualcuno, con le mie parole. A volte, per chiarire dei concetti, devo passare alle maniere un pò più dure, ma non sicuramente a causa dell'interlocutore, ma solamente perchè potrebbero risultare più chiare.

Inoltre, spesso scrivo la sera tardi, dopo qualche oretta passata al pc, e data l'ora picciola, a volte mi si imbrogliano le idee...  :rolleyes:  ;D

Ma, a parte questo, sono contento che andy abbia risolto subito dietro al mio discorso, il che vuol dire che non è proprio così male...  ;D
E, comunque, sono qui per cercare di aiutare, per cui caro picav(ecc. ecc.)  ;D , non farti scrupoli con le domande. Ognuno assorbe a modo suo, e forse devo trovare altri metodi per farti comprendere il giochetto (per modo di dire, ovviamente...).
Detto questo, visto che hai accennato ad un esempio, invialo e lo vediamo...  :ok:
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 29 Settembre 2010, 15:42:28
Non me la prendo sicuramente, anzi, siamo qui per imparare tutti, anche io... (e non poco...)

Al contrario, io spero di non aver offeso magari qualcuno, con le mie parole. A volte, per chiarire dei concetti, devo passare alle maniere un pò più dure, ma non sicuramente a causa dell'interlocutore, ma solamente perchè potrebbero risultare più chiare.

Inoltre, spesso scrivo la sera tardi, dopo qualche oretta passata al pc, e data l'ora picciola, a volte mi si imbrogliano le idee...  :rolleyes:  ;D

Ma, a parte questo, sono contento che andy abbia risolto subito dietro al mio discorso, il che vuol dire che non è proprio così male...  ;D
E, comunque, sono qui per cercare di aiutare, per cui caro picav(ecc. ecc.)  ;D , non farti scrupoli con le domande. Ognuno assorbe a modo suo, e forse devo trovare altri metodi per farti comprendere il giochetto (per modo di dire, ovviamente...).
Detto questo, visto che hai accennato ad un esempio, invialo e lo vediamo...  :ok:

troppo forte sto forum, onorato di far parte della Comunità :2birre:
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 29 Settembre 2010, 17:47:12
Anche da parte mia, che ho notato in molti la voglia "vera" di imparare qualcosa...  :ok:
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 29 Settembre 2010, 18:43:48
Anche da parte mia, che ho notato in molti la voglia "vera" di imparare qualcosa...  :ok:

la programmazione è una passione, è creazione, come tutte le passioni 'condivise' è una cosa che piace. Da parte mia sono sempre alla ricerca di soluzioni migliorative x il codice, non essendo un programmatore professionista, e pieno di curiosità x il nuovo. Grazie per i metodi nascosti, subito implementati.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 29 Settembre 2010, 23:14:10
......, visto che hai accennato ad un esempio, invialo e lo vediamo...  :ok:

Se proprio insisti, anche se ne abbiamo già parlato ampiamente nella discussione http://www.gambas-it.org/smf/index.php?topic=1259.0#lastPost (http://www.gambas-it.org/smf/index.php?topic=1259.0#lastPost), cerco di riassumere al meglio la mia messa in pratica dei tuoi preziosi consigli:

Codice: [Seleziona]
Dalla FMain chiamo la Form2 con:
DIM Frm2 AS Form2
DIM $_FrmParam AS NEW String[]
DIM i_SwReturn AS Integer
.................................
Frm2 = NEW Form2($_FrmParam)
i_SwReturn = Frm2.ShowModal()

La form2 prevede una serie di inserimenti di dati, alla fine di quali richiama ulteriormente la Form3 per le operazioni di chiusura con:
Codice: gambas [Seleziona]
DIM i_SwReturn AS Integer
DIM $_FrmParam AS NEW String[]
DIM Frm3 AS Form3
'------------------------------------- CHIAMATA della Form3 col metodo nascoto -new ---------------------------------------------------
  $_FrmParam.add(f_TotEntrOggi)       'cioé: $_FrmParam[0]
  $_FrmParam.add(f_TotUscOggi)        'cioé: $_FrmParam[1]
  $_FrmParam.add(Str(i_dataCont))     'cioé: $_FrmParam[2]
  Frm3 = NEW Form3($_FrmParam)
  i_SwReturn = Frm3.ShowModal()
  SELECT CASE i_SwReturn
          CASE 1  'La giornata é stata chiusa con lo stato di "GIORNATA APERTA"
            b_SwCloGG = TRUE   'La giornata contabile corrente é stata chiusa (bilanciata o non)
            ME.Close(0)
          CASE (99)  'Si é verificato un ERRORE dentro la Form3 - Il programma deve essere chiuso
            ME.Close(99)
  END SELECT


La form3 svolge il suo compito e, a seconda del risultato ottenuto, il controllo viene restituito alla Form2, oppure viene predisposto un ritorno direttamente alla FMain:
 
Codice: [Seleziona]
SELECT CASE Message.Error("TOTALI DI QUADRATURA ERRATI" & Chr(10) & Chr(10) & "Cosa vuoi fare ?", "Correggo e Ripeto la Chiusura", "Finisco, ma lascio la giornata 'APERTA'")
          CASE 2
            b_SwFrm3Clo = TRUE
            ME.Close(1)
  END SELECT

oppure:
Codice: [Seleziona]
ME.Close(0)   'chiude la Form senza compromettere quanto già digitato. Il controllo ritorna alla Form2.

oppure ancora:
Codice: [Seleziona]
ME.CLOSE(99)    'l'elaborazione viene interrotta a causa di della manifestazione di un ERRORE

Perciò al ritorno nella Form2, dopo una delle ME.Close(xx) della Form3, sopra accennate, la Form2 riprende il controllo ed a seconda del contenuto di   i_SwReturn (vedi riga 09)
il controllo può:
a. rimanere alla Form2 (i_SwReturn = 0)
b. essere immediatamente restituito alla FMain (i_SwReturn = 1)
c. essere immediatamente restituito alla FMain che, a sua volta, con lo stesso procedimento di riconoscimento visto nella Form2,  riconosce la presenza dell'anomalia e procede alla chiusura del programma (i_SwReturn = 99).

In tutto quello che ho riportato sopra, come avrai certamente notato, non ho assolutamente utilizzato variabili globali.

Che ne dici? Ho ben capito qualcosa sul taglio delle variabili globali?  ;)  :D :D
Ciao.

Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 30 Settembre 2010, 06:30:12
azz...complimenti...non ho capito ma apprezzo
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 30 Settembre 2010, 09:59:24
azz...complimenti...non ho capito ma apprezzo

In effetti nel codice che ho riportato manca un passaggio, cioé la presa in carico dei parametri passati da una Form all'altra, compito che viene svolto nel metodo _new della Form chiamata, ma non l'ho scritto per sintetizzare il più possibile l'esposizione a md9327.

Per ricondurre il concetto ad un livello  di maggiore dettaglio, conviene abbandonare il riferimento alla chiamata in successione di due Form, che fa pensare alle scatole cinesi, e concentrarci sul concetto di passaggio di informazioni da una form ad un'altra e successivo ritorno.
Supponiamo che la FMain abbia bisogno di conoscere una data da una tabella di DB,  per passarla poi ad un'altra Form. Guardiamo solamente il primo passaggio: per fare ciò viene richiesto il lavoro alla Form1, attraversdo il passaggio di un parametro, la presenza del crt "A" in una delle colonne della tabella del nostro DB.
La procedura scatenante la chiamata nella FMain dispone di:
Codice: gambas [Seleziona]
DIM i_SwReturn AS Integer                   'é il campo integer da interrogare subito dopo il ritorno del controllo-programma alla FMain, a fine lavoro della Form3.
DIM $_FrmParam AS NEW String[]        'é l'array che viene utilizzato per il passaggio delle informazioni alla Form chiamata e dove eventualmente vengono aggiunte altre informazioni di ritorno.
DIM Frm3 AS Form3                             
'-----bla-----bla-----bla-----
 $FrmParam.add("A")     'cioé: $FrmParam[2]
  Frm3 = NEW Form3($FrmParam)
  iSwReturn = Frm3.ShowModal()          'modalità obbligatoria di chiamata del metodo _new della Form3.class


L'entrata nella Form3.Class avviene tramite il metodo new, con l'esecuzione della procedura _new. Essa contiene anche il seguente codice:
Codice: gambas [Seleziona]
PUBLIC SUB _new($_TbParF3 AS String[])
Dim $_TabParF3 AS String[] 
Dim  $Como  AS String
'<<<<<<<< Estrazione parametri passati dalla FMain >>>>>>>>
  $TabParF3 = $TbParF3               'presa in carico dei parametri forniti da FMain
  $Como = $TbParF3[0]
'<<<<<<<<<<<<<<< ° >>>>>>>>>>>
'-----bla-----bla-----bla-----


A fine lavoro la Form3 restituisce sia la data trovata che l'esito della ricerca, oppure se non trova la data, restituisce solamente l'esito negativo della ricerca:
Codice: gambas [Seleziona]
-----bla-----bla-----bla-----
 RecTab = DB_Connection.Exec(sql)
 IF RecTab.Available THEN
       $TabParF3.add(RecTab!Data)      'cioé  $TabParF3[1]
       Me.close(0)
 else
   Me.close(1)
 endif


A questo punto la FMain riprende il controllo del programma  e vengono eseguite le istruzioni poste subito dopo la chiamata della Form3, che non ho riportate sopra per dare la giusta sequenza logica delle istruzioni
Codice: gambas [Seleziona]

-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
-----bla-----bla-----bla-----
IF i_SwReturn = 0 THEN
     $DataTabella = $FrmParam[1]
else
    Message.Info("Data cercata non trovata")
endif
-----bla-----bla-----bla-----


Spero di essere riuscito nell'impresa. Descrivere un argomento appena conosciuto non é cosa facile.
Se non ci sono riuscito, ti chiedo scusa per la mia scarsa capacità; sicuramente ci sarà chi saprà ben illuminarci.  :)
Ciao.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 30 Settembre 2010, 11:18:30
@Picavbg

cortesissimo...il problema non risiedeva nella tua capacità esplicativa, elevata, quanto nella mia incapacità di decifrare il codice altrui. Sai quante volte mi piacerebbe fare come fa mdxxxx, che vede una classe php e la converte? E' un magister
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 30 Settembre 2010, 12:25:18
La spiegazione e la messa in pratica denotano che hai capito bene il concetto.

Un piccolo appunto, non legato al tuo codice, ma solo per chiarire il concetto:
non è necessario utilizzare un'altro array all'interno di un metodo, se già esiste come dato nei parametri, in quando Gambas gli oggetti li passa sempre per riferimento, e non per valore. Il solo motivo per farlo è che poi lo stesso parametro viene utilizzato anche da altre funzioni della stessa classe. In questo caso si può creare una variabile di classe, che riceve il puntamento al parametro stesso, e lo mantiene per tutta la vita della classe. La manipolazione dei dati, sia nel parametro originale, che nella variabile copia (puntatore), si riflette anche nell'oggetto originale (nel tuo esempio è $_FrmParam della Form2), e quindi ogni modifica fatta a questo array nella Form3, te lo ritrovi anche nell'array della Form2. Da tener presente che, però, questa cosa è valida solo per gli oggetti, e non per le variabili di base, e gli array fsono appunto degli oggetti.

Un'altro piccolo suggerimento pratico, almeno a mio avviso:
- per le variabili generiche, parametri, e via dicendo, io uso tutti nomi in minuscolo (per lo meno iniziano in tale modo)
- per le variabili di classe private, uso lo stesso sistema di cui sopra, anteponendo il carattere "$", cos' da distinguerli bene (utile anche quando le vai a cercare e sostituire)
- per le funzioni e i metodi pubblici uso mettere in maiuscolo il primo carattere del nome
- per le funzioni e metodi privati, uso nominarli tutto in minuscolo, anteponendo il carattere "_" (underscore), e questo è valido anche per la costruzione di controlli e container particolari, in modo da seguire la logica imposta in Gambas per creare questo tipo di oggetti.

Ricordo, inoltre, che è possibile usare nomi che corrispondono a etichette usate già da Gambas, basta racchiudere questi nomi tra parentesi graffe (come descritto anche nella doc). A volte si cerca di utilizzare nomi, che poi provocano errori durante la compilazione, e il cercarne di alternativi a volte complica la vita. Questa alternativa sistema tutto, e uno è libero di usare il nome che gli pare. Inoltre la cosa si farà più pesante quando uscirà Gambas3, che aggiunge un buon numero di nuove etichette, e quindi è facile trovarsi in conflitto.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: Picavbg - 01 Ottobre 2010, 16:41:04
@md9327
Variabili array definite in <classe>.Tabella(), costanti definite in <classe>.Nome_costante! Quante begli strumenti ho scoperto oggi!

Mi spiego meglio dopo il tuo suggerimento sulla definizione  di un array in una classe per rintracciarlo sempre senza impegnare memoria "globale", oggi guardando questo tuo post http://www.gambas-it.org/smf/index.php?topic=1356.msg15332#msg15332 (http://www.gambas-it.org/smf/index.php?topic=1356.msg15332#msg15332), mi sono deciso a fare una piccola prova, gridando: Abbasso le variabili globali.  :D

Ho così affrontato uno alla volta i due temi:
1) per la definizione dell'array, ho:
    - definito una classe che ho chiamato <Costanti>; in essa ho inserito la funzione che mi hai indicato più sopra, in questa discussione:
 
Codice: gambas [Seleziona]
     STATIC PUBLIC FUNCTION $TabMesi() AS String[]
         DIM $TbMesi AS String[] = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]
         RETURN $TbMesi
       END

       Nel corpo del programma, ho prelevato il mese interessato con:
Codice: gambas [Seleziona]
          Costanti.$TabMesi()
          $_Mese = Costanti.$TabMesi()[i_Mese]

       E' vero che ho dovuto fare qualche prova, ma alla fine ce l'ho fatta, ed stato magnifico.  ;D ;D

2) per la definizione delle costanti, ho cominciato con un piccolo, timido tentativo, definendo nella stessa classe di prima, <Costanti>, la mia prima costante non globale:
     
Codice: gambas [Seleziona]
STATIC PUBLIC CONST $Prova AS String = "Io sono la costante $Prova"

     che ho richiamato dentro la FMain.class con:
     
Codice: gambas [Seleziona]
PRINT Costanti.$Prova

 
Ebbene, anche questa volta é stato un trionfo!  ;D ;D

Grazie, md, ce l'hai fatta: sei riuscito a farmi capire anche l'uso dei suddetti strumenti.  É stata dura ma hai vinto, quindi:
puoi stare tranquillo ed asciugarti il sudore per la fatica fatta.  :rotfl: :rotfl:

Ciao.
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: md9327 - 01 Ottobre 2010, 17:53:42
Ufff... era ora...  ;D

Scherzi a parte, a volte penso a quando ho iniziato a scrivere le prime istruzioni, quando ancora era tutto molto più sperimentale, ma alla portata di chi era volenteroso e interessato alla programmazione. I linguaggi era sì difficili, assembler, C ecc. ma ti facevano capire meglio e avevi più il contatto diretto con il pezzo di ferro, la macchina, il computer...

Il problema per chi inizia ora, è che non vede lo strato da cui è partito tutto quanto, per cui non si rende conto, e non capisce bene, cosa una semplice riga di codice, andeà a combinare sull'hardware.

Questo per dire che, con le metodologie moderne e gli strumenti che ci sono oggi, ma soprattutto il sistema di lavorare, rendeno difficile capire i semplici aspetti di un semplice problema: cosa fà fisicamente questa istruzione sulla macchina ?
Se manca questa base, resta difficile capire il tipo di problema che, per esempio, hai affrontato ad oggi.
Ovvero, capire che un dato non svolazza allegro nel cielo terso di autunno, bensì viene piazzato brutalmente sul nostro pc, occupando una determinata risorsa, con le relative conseguenze.

Questo, ovviamente, è un mio disquisire su un fatto che è attuale, ma nulla ha di personale, è un dato di fatto.
A volte, però, dato che anche per lavoro ho a che fare con neolaureati (come credo ci siano anche qui), vedo che molte di queste basi mancano e, spesso mi rammarico pensando che la cosa non frega a nessuno, in particolare alle società che li assumono... il perchè è storia lunga, per cui termino qui...

Infine, ottimo lavoro picav!!!  :ok:

P.S.: ora mi vado ad asciugare il sudore...  ;D
Titolo: Re: Diamo un taglio alle variabili globali
Inserito da: andy60 - 01 Ottobre 2010, 22:09:27
classe 60, magara fossi neolaureato :P
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: Picavbg - 01 Ottobre 2010, 22:38:09
@ md9327
Vero tutto, ma il mondo progredisce in tecnologia e, con essa, anche l'ignoranza umana!   :hatecomputer:

Così, ora tu sei asciutto, mentre io dovrò sudare a lungo per debellare le variabili globali dal mio programma.  ;D ;D
Ciao.
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: andy60 - 02 Ottobre 2010, 08:21:47
@ md9327
Vero tutto, ma il mondo progredisce in tecnologia e, con essa, anche l'ignoranza umana!   :hatecomputer:

Così, ora tu sei asciutto, mentre io dovrò sudare a lungo per debellare le variabili globali dal mio programma.  ;D ;D
Ciao.


pica, grazie a voi io le ho quasi debellate al 95% e myZone corre + veloce
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: md9327 - 03 Ottobre 2010, 13:28:09
...sono veramente contento di tutto ciò...  :2birre:

Comunque, picavbg, prova a dirlo tu a mia moglie, che ora deve lavare e stirare tutte le camicie sudate...  ;D

[Per andy]
Sono più grande di teeee, pappappero...  :rotfl:
E comunque è verò, magari avere 20 anni di meno...
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: andy60 - 03 Ottobre 2010, 14:31:17
@mdxxxx

siamo abbastanza grandi ma nello stesso tempo 'piccoli', bello entusiasmarsi per un programma che funziona!!
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: md9327 - 03 Ottobre 2010, 20:13:02
Altrimenti non saremmo qui, non credi?   ;)
Titolo: Re: [Risolto]Diamo un taglio alle variabili globali
Inserito da: andy60 - 03 Ottobre 2010, 20:14:43
 :2birre:
Altrimenti non saremmo qui, non credi?   ;)