Autore Topic: [Risolto]Diamo un taglio alle variabili globali  (Letto 3490 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #15 il: 29 Settembre 2010, 17:47:12 »
Anche da parte mia, che ho notato in molti la voglia "vera" di imparare qualcosa...  :ok:

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Diamo un taglio alle variabili globali
« Risposta #16 il: 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.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #17 il: 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, 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.

:ciao:

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Diamo un taglio alle variabili globali
« Risposta #18 il: 30 Settembre 2010, 06:30:12 »
azz...complimenti...non ho capito ma apprezzo

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #19 il: 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.
:ciao:

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Diamo un taglio alle variabili globali
« Risposta #20 il: 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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #21 il: 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.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #22 il: 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, 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.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Diamo un taglio alle variabili globali
« Risposta #23 il: 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

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Diamo un taglio alle variabili globali
« Risposta #24 il: 01 Ottobre 2010, 22:09:27 »
classe 60, magara fossi neolaureato :P

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: [Risolto]Diamo un taglio alle variabili globali
« Risposta #25 il: 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.
:ciao:

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: [Risolto]Diamo un taglio alle variabili globali
« Risposta #26 il: 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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [Risolto]Diamo un taglio alle variabili globali
« Risposta #27 il: 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...

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: [Risolto]Diamo un taglio alle variabili globali
« Risposta #28 il: 03 Ottobre 2010, 14:31:17 »
@mdxxxx

siamo abbastanza grandi ma nello stesso tempo 'piccoli', bello entusiasmarsi per un programma che funziona!!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [Risolto]Diamo un taglio alle variabili globali
« Risposta #29 il: 03 Ottobre 2010, 20:13:02 »
Altrimenti non saremmo qui, non credi?   ;)