Newsgroup: it.comp.lang.visual-basic
Titolo: Classi di m....

Ciao ragazzi, ho un piccolo(?) (dipende dai punti di vista) problema
Da poco programmo in vb, a mio parere sto' anche, dopo sudate incredibili,
ottenendo risultati apprezzabili per un inesperto come me.
però avendo, quel poco che so, imparato da solo, con un piccolo manuale,
l'msdn, e voi inevitabilmente ho ancora molte lacune
ad es:
1-Quando faccio un programma funziona e anche bene, (e per me è gia tanto)
ma mi viene fuori un groviglio di codice che, nonostante i commenti, solo al
pensiero di rimetterci le mani per un'aggiornamento mi viene male, potrei
avere un mancamento.......
2- faccio copia e incolla di 0,5 Kg di codice....praticamente su tipo 1000
righe 500 sono la copia delle altre 500
3- uso timer da tutte le parti e per i motivi più assurdi
4- dichiaro un miliardo di variabili globali (e ho letto sul manuale che è
la cosa più sbagliata dell'universo ipergalattico e onestamente non ho
ancora capito completamente perchè
5-Non so fare o usare le classi.....non ho ancora capito bene nemmeno cosa
siano, cioè a livello blando e teorico (come lo spiega il libro si) però se
ne devo fare una beh...lasciamo perdere
I miei programmi funzionano si....però non basta, ma non so come fare perchè
ogni volta che dico <<bene adesso imparo i moduli di classe>>
non ci capisco niente e mi scoppia la testa....
alla fine mi arrendo, mi arrangio come posso e così nasce il mio bel
groviglio di codice....
Ci sarete passati anche voi....
come avete fatto ad imparare....in che modo vi è scattata quella molla che
fà assimilare il concetto?
Ho pensato di andare a Lurd a farmi Benedire la testa....
AIUTATEMI VI PREGO....
--
------------------------------------------------------------
Davide Russo....
        ....a very internet person
-----------------------------------------------------------

 ne devo fare una beh...lasciamo perdere
:-(
Il numero di faccine tristi è in fiunzione della gravità...
Riassumo:
1) Scrivere montagne di codice in cui nemmeno tu riesci a mettere mano è _a
priori_ sbagliato.
    Scrivi meno, fai cose più semplici, ma meglio.
    Scrivi in modo più chiaro possibile, commenta, indenta correttamente.
    Evita, per ora, di usare costrutti più compatti ma meno leggibili,
spreca piuttosto una if in più.
    Non usare dieci diverse variabili che indicano la stessa cosa.
2) Copia-incolla in sè non è grave. L'importante è che non lo usi per fare
cose tipo:
    x=1
    text1.text = x
    x=x+1
    text1.text = x
    x=x+1
    text1.text = x
    ...
    (già visto in un programma...   :-(((( )
3) Che diavolo te ne fai di timer per i motivi più assurdi?
    L'oggetto timer è uno di quelli di cui più facilmente dimentico
l'esistenza...  :-)
4) Perchè più variabili globali usi e meno manutenibile e portabile diviene
il codice.
    Che succede per es. se tra un mese modifichi qualcosa e setti la
variabile globale "password" in modo diverso senza ricordarti che la usi
in un'altra parte del codice per il login al database? E questo è solo
l'esempio più facile da debuggare...
    E che succede se domani decidi di usare una parte  del tuo codice in una
nuova app che non necessita affatto delle 50 variabili
    globaòli che hai dichiarato nella prima, o, peggio, le dovrebbe usare in
modo diverso?
    L'ambito di visibilità di una variabile dovrebbe essere il più ristretto
possibile.
5) Da quel che hai detto è meglio che tu faccia ordine nel tuo modo di
sviluppare _prima_ di affrontare la logica di sviluppo ad oggetti.
    Classi e compagnia bella devono essere affrontate con metodologie di
sviluppo ordinate e precise.
ma soprattutto, non ti scoraggiare: tutti si è imparato.  Un passo alla
volta.    :-)
ciao
ugo

>fà assimilare il concetto?
Forse abbiamo studiato...??
-- 
Posted from  [217.57.33.234] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Forse abbiamo studiato...??
e sacrificato qualche fine settimana, sera (o notte) ;-)
-- 
ciao, hal

 non ci capisco niente e mi scoppia la testa....
__-- == Disclaimer: tentativo di semplificare all'eccesso. == --__
Pensa alla classe come ad una variabile Type con attaccato del codice.
Con una classe per prima cosa descrivi le caratteristiche dell'oggetto di
cui vuoi maneggiare i dati.
Poni si tratti di una classe che deve descrivere un cliente. Ti servono una
serie di dati che lo descrivono (quelli anagrafici per intenderci) che
inserirai sotto forma di property Let  e potrai rileggere sotto forma di
property Get.
Il vantaggio delle property Let , è che oltre a permetterti di scrivere un
valore di una variabile, possono incapsulare del codice che maneggia quel
valore. Nell'esempio del cliente, potresti accettare il CAP tra i suoi dati
anagrafici e utilizzarlo all'interno della classe per cercare la Provincia e
la Città.
La stessa cosa può essere fatta con una property Get. In fase di lettura
puoi rimaneggiare il dato memorizzato prima di restituirlo. Ad esempio se
hai memorizzato nella classe il fatturato in lire del tuo cliente, puoi
avere due property Get FatturatoInLire e FatturatoInEuro che partendo dallo
stesso dato in lire, ti ritornano il valore già convertito.
Oltre a questo, hai a disposizione i metodi, che sono poi delle procedure (o
funzioni) dichiarate pubbliche all'interno della classe. I metodi,
permettono di lavorare ulteriormente i dati della classe, magari facendoli
interagire con altri dati che passi come parametro.
Nel caso del cliente potresti avere un metodo EmettiSollecitoPagamento a cui
passi come parametro la data, il numero, e l'importo della fattura di cui
vuoi sollecitrare l'importo, e lui ti stampa la lettera completa utilizzando
i dati anagrafici contenuti all'interno della classe stessa.
Se ancora non ti basta, puoi dichiarare degli eventi. Questi consentono alla
tua classe di richiamare l'attenzione della form in cui sono state
dichiarate, semplicemente dichiarandole con la clausola WithEvent.
In questo modo, se dici alla classe che vuoi fatturare ad un cliente, questa
potrebbe far scattare l'evento ClienteInaffidabile nel caso in cui il
cliente abbia parecchie fatture insolute.
Questo ti dovrebbe dare l'infarinatura di base. A questo punto devi solo
avere buona volontà e provare a scrivere qualcosa.
Ciao
*Roby*

 ha scritto nel messaggio
news:JhhM7.176548$sq5.8...@news.infostrada.it...
| 1-Quando faccio un programma funziona e anche bene, (e per me è gia tanto)
| ma mi viene fuori un groviglio di codice che, nonostante i commenti, solo al
| pensiero di rimetterci le mani per un'aggiornamento mi viene male, potrei
| avere un mancamento.......
Impara ad indentare correttamente il codice, trova una tua forma con cui ti trovi a tuo agio, che
ritieni sia chiara e limpida. Scrivi procedure che facciano le cose + semplici possibili. Scrivi
procedure che si possano riutilizzare senza alcuna modifica in altri progetti (procedure generiche
per le quali i parametri costituiscono l'unico input di dati su cui operare).
| 4- dichiaro un miliardo di variabili globali (e ho letto sul manuale che è
| la cosa più sbagliata dell'universo ipergalattico e onestamente non ho
| ancora capito completamente perchè
Le variabili vanno dichiarate SOLO dove vengono utilizzate! Se usi un variabile solo in una
procedura, e' meglio dichiararla all'interno della procedura (anche se, nel caso in cui la procedura
venga chiamata dall'interno di un ciclo, avere un'istruzione di meno, quella che dichiara la
variabile, e' meglio per questioni di efficenza/velocità; e quindi la variabile andrebbe dichiarata
come globale contravvenendo alla regola non scritta di dichiarare le variabili solo dove vengono
usate).
| 5-Non so fare o usare le classi.....non ho ancora capito bene nemmeno cosa
| siano, cioè a livello blando e teorico (come lo spiega il libro si) però se
| ne devo fare una beh...lasciamo perdere
Perche' non ti scarichi un progetto che contenga un modulo di classe e cerchi di capire il
meccanismo del suo funzionamento studiandone il codice?
Ciao,
Jabba

 ha scritto nel messaggio
news:JhhM7.176548$sq5.8...@news.infostrada.it...


 Ciao e... insisti!!!
Sono sempre io dal pc del lavoro...Volentieri...perň mi vergogno un po' ;-)
Stasera da casa ve ne posto un pezzetto cosě potete darmi una mano a capire
cosa sbaglio....

Questa č una piccola parte del codice che gestisce una form atta alla
navigazione, modifica cetc.. di record in un db access....cosě tanto per
farvi capire come programmo male e come uso i timer...
Vi prego evitate di prendermi in giro...
Grazie
Private Sub Form_Load()
Tutti = "SI" 'SETTO L'INDICATORE DI VISUALIZAZIONE TUTTI I CONTRATTI O PER
RESTRIZIONE RAGSOCI
'QUESTO ACCADE ANCHE PERCHE' ALL'AVVIO IL CMBRAGSOCI.TEXT E' UGUALE A "" E
DAREBBE ERRORE SE INSERITA IN QUERY
'INIZIALIZZO I CONTROLLI DATA
dataComboClienti.DatabaseName = App.Path & "\emilio.mdb"
dataComboTipo.DatabaseName = App.Path & "\emilio.mdb"
dataContratti1.DatabaseName = App.Path & "\emilio.mdb"
DataProgrammazioni.DatabaseName = App.Path & "\emilio.mdb"
DataProgrammazioniTempScrivi.DatabaseName = App.Path & "\emilio.mdb"
DataProgrammazioniScrivi.DatabaseName = App.Path & "\emilio.mdb"
End Sub
Private Sub timerComboClienti_Timer()
'RIEMPIE COMBO DEI CLIENTI CON I DATI PROVENIENTI DALLA TABELLA CLIENTI
'Svuoto la combo cmbRagsoci
cmbRagsoci.Clear
'POPOLO LA COMBO CMBRAGSOCI
dataComboClienti.RecordSource = "SELECT * FROM CLIENTI WHERE
ATTIVO='ATTIVATO' ORDER BY RAGSOCI "
dataComboClienti.Refresh
dataComboClienti.Recordset.MoveFirst
cmbRagsoci.AddItem ""
Do Until dataComboClienti.Recordset.EOF
cmbRagsoci.AddItem dataComboClienti.Recordset("RAGSOCI")
dataComboClienti.Recordset.MoveNext
Loop
timerComboClienti.Enabled = False
End Sub
Private Sub timerContrattiInizializza_Timer()
'INIZIALIZZA LA QUERY DELLA NAVIGAZIONE E RICHIAMA IL TIMERCONTRATTI CHE
ESEGUE IL REFRESH
'DEI DATI
On Error GoTo gestioneerrori
If Tutti = "SI" Then
dataContratti1.RecordSource = "SELECT * FROM CONTRATTI ORDER BY
CODCONTRATTO"
dataContratti1.Refresh
Else
dataContratti1.RecordSource = "SELECT * FROM CONTRATTI WHERE CODCLIE=" &
Val(lblCodiceCliente.Caption) & " ORDER BY CODCONTRATTO"
dataContratti1.Refresh
End If
dataContratti1.Recordset.MoveFirst
timerRefreshContratti.Enabled = True
timerContrattiInizializza = False
'NELLA GESTIONE ERRORI CONTROLLO SE VIENE SELEZIONATO UN CLIENTE CHE NON HA
CONTRATTI
'DAREBBE ERRORE PERCHE' NELLA QUERY NON CI SAREEBBERO RECORD DA VISUALIZZARE
timerContrattiInizializza_Timer_exit:
Exit Sub
gestioneerrori:
Select Case Err.Number
Case 3021
MsgBox ("NESSUN CONTRATTO PER QUESTO CLIENTE"), 48, ("ERRORE")
timerSvuotaCampi.Enabled = True
Resume Next
End Select
End Sub
Private Sub timerRefreshContratti_Timer()
'ESEGUE IL REFRESH DEI CAMPI DATI RELATIVI AL CONTRATTO
'TRIPRISTINA LO STATO DI ENABLED DI TUTTE LE VARIE COSE ALLO STATO INIZIALE
On Error GoTo gestioneerrori
timerTipoContratto.Enabled = True
cmdModifica.Enabled = True
cmdConferma.Enabled = False
cmdPrimo.Enabled = True
cmdUltimo.Enabled = True
cmdAvanti.Enabled = True
cmdIndietro.Enabled = True
cmdCancella.Enabled = True
cmdNuovo.Enabled = True
cmdAnnulla.Enabled = False
txtQuantita.Enabled = False
txtprezzoUnitario.Enabled = False
txtDurata.Enabled = False
txtImportoScontato.Enabled = False
txtMattino.Enabled = False
txtPomeriggio.Enabled = False
txtSera.Enabled = False
txtNote.Enabled = False
txtConsumati.Text = False
cmbTipo.Enabled = False
cmdProgrammazioni.Enabled = False
lblCodice.Caption = dataContratti1.Recordset("CODCONTRATTO")
lblCodiceCliente.Caption = dataContratti1.Recordset("CODCLIE")
lblTipo.Caption = dataContratti1.Recordset("TIPOCONTRATTO")
txtQuantita.Text = dataContratti1.Recordset("QUANTITA")
txtDurata.Text = Replace(dataContratti1.Recordset("DURATASPOT"), "Null", "")
lblSconto.Caption = dataContratti1.Recordset("SCONTO")
txtImportoScontato.Text = dataContratti1.Recordset("TOTALESCONTATO")
lblImportoIntero.Caption = dataContratti1.Recordset("TOTALE")
txtConsumati.Text = dataContratti1.Recordset("CONSUMATI")
lblData.Caption = dataContratti1.Recordset("DATA")
txtMattino.Text = Replace(dataContratti1.Recordset("ORARIMATTINO"), "Null",
"")
txtSera.Text = Replace(dataContratti1.Recordset("ORARISERA"), "Null", "")
txtPomeriggio.Text = Replace(dataContratti1.Recordset("ORARIPOMERIGGIO"),
"Null", "")
txtNote.Text = Replace(dataContratti1.Recordset("NOTE"), "Null", "")
txtprezzoUnitario.Text = dataContratti1.Recordset("PREZZOUNITARIO")
'FACCIO I CALCOLI PER I DATI NON PRESENTI IN TABELLA (RIMASTI)
lblRimasti.Caption = Val(txtQuantita.Text) - Val(txtConsumati.Text)
'txtprezzoUnitario.Text = Val(lblImportoIntero.Caption) /
Val(txtQuantita.Text)
'ACCEDO ALLA TABELLA CLIENTI PER TIRARMI GIU IL RAGSOCI DEL CLIENTE
dataComboClienti.RecordSource = "SELECT * FROM CLIENTI WHERE CODICE=" &
Val(lblCodiceCliente.Caption) & " AND ATTIVO='ATTIVATO' ORDER BY CODICE"
dataComboClienti.Refresh
dataComboClienti.Recordset.MoveFirst
lblRagSoci.Caption = dataComboClienti.Recordset("RAGSOCI")
Riesuma:
timerRefreshContratti.Enabled = False
timerrefreshcontratti_timer_exit:
Exit Sub
gestioneerrori:
Select Case Err.Number
Case 3021
MsgBox "NESSUN CONTRATTO", 48, "ERRORE"
dataContratti1.RecordSource = "SELECT * FROM CONTRATTI ORDER BY
CODCONTRATTO"
dataContratti1.Refresh
Tutti = "SI"
timerComboClienti.Enabled = True
timerContrattiInizializza.Enabled = True
Resume Riesuma
End Select
End Sub
Private Sub cmdConferma_Click()
If lblCodice.Caption <> "" Then
    If lblCodiceCliente.Caption <> "" Then
        If lblTipo.Caption <> "" Then
           If (lblTipo.Caption <> "SPOT RADIO" Or txtDurata.Text <> "") And
(lblTipo.Caption <> "SPOT TV" Or txtDurata.Text <> "") Then
                       If Val(txtQuantita.Text) <> 0 Then
                            If Val(txtImportoScontato.Text) <> 0 Then
                                If Val(lblImportoIntero.Caption) <> 0 Then
Tutti = "SI"
Nuovo = "NO"
dataContratti1.Recordset("CODCONTRATTO") = Val(lblCodice.Caption)
dataContratti1.Recordset("CODCLIE") = Val(lblCodiceCliente.Caption)
dataContratti1.Recordset("DATA") = lblData.Caption
dataContratti1.Recordset("ORARIMATTINO") = txtMattino.Text
dataContratti1.Recordset("ORARIPOMERIGGIO") = txtPomeriggio.Text
dataContratti1.Recordset("ORARISERA") = txtSera.Text
dataContratti1.Recordset("DURATASPOT") = txtDurata.Text
dataContratti1.Recordset("TIPOCONTRATTO") = lblTipo.Caption
dataContratti1.Recordset("QUANTITA") = Val(txtQuantita.Text)
dataContratti1.Recordset("TOTALESCONTATO") = Val(txtImportoScontato.Text)
dataContratti1.Recordset("TOTALE") = Val(lblImportoIntero.Caption)
dataContratti1.Recordset("SCONTO") = Val(lblSconto.Caption)
dataContratti1.Recordset("CONSUMATI") = Val(txtConsumati.Text)
dataContratti1.Recordset("NOTE") = txtNote.Text
dataContratti1.Recordset("PREZZOUNITARIO") = txtprezzoUnitario.Text
dataContratti1.Recordset.Update
lblCodiceCliente.Caption = ""
'PSSO LE PROGRAMMAZIONI E SVUOTO LA TEMP
timerComboClienti.Enabled = True
timerContrattiInizializza.Enabled = True
                                        Else: MsgBox ("MANCANO DEGLI
IMPORTI!"), 48, ("ERRORE!")
                                        End If
                                    Else: MsgBox ("MANCANO DEGLI IMPORTI!"),
48, ("ERRORE!")
                                    End If
                                Else: MsgBox ("MANCA LA QUANTITA'"), 48,
("ERRORE!")
                            End If
                         Else: MsgBox ("MANCA LA DURATA"), 48, ("ERRORE!")
                         End If
                    Else: MsgBox ("MANCALA IL TIPO DI CONTRATTO!"), 48,
("ERRORE!")
                    End If
                 Else: MsgBox ("NON E' STATO SELEZIONATO UN CLIENTE!"), 48,
("ERRORE!")
        End If
        End If
End Sub

 DataProgrammazioniScrivi.DatabaseName = App.Path & "\emilio.mdb"
Se per tutti i controlli Data devi assegnare lo stesso valore, perche' non
usi un costrutto For Each ? Inoltre, crea una variabile che contenga
App.Path & "\emilio.mdb" e assegna direttamente la variabile.
Non capisco il senso di tutti quei Timer.... non puoi creare una semplice
routine e richiamarla dove ti serve?
Ciao.

 End Sub
col cappero che si capisce qualcosa:
Private Sub timerComboClienti_Timer()
    'Riempie la combo dei clienti con i dati provenienti dalla tabella
clienti
    cmbRagsoci.Clear  'Svuoto la combo cmbRagsoci
    'Popolo la combo cmbRagsoci
    dataComboClienti.RecordSource = "SELECT * FROM Clienti WHERE
    attivo='ATTIVATO' ORDER BY ragsoci "
    dataComboClienti.Refresh
    dataComboClienti.Recordset.MoveFirst
    cmbRagsoci.AddItem ""
    Do Until dataComboClienti.Recordset.EOF
        cmbRagsoci.AddItem dataComboClienti.Recordset("RAGSOCI")
        dataComboClienti.Recordset.MoveNext
    Loop
    timerComboClienti.Enabled = False
End Sub
Così va meglio, cmq non scrivere i commenti in maiuscolo a meno che non
siano commenti temporanei, già il verdino di default di vb va più che bene
quando scrivi una query sql lascia in maiuscolo solo le parole chiave di
sql, io così faccio, metti in minuscolo i nomi dei campi e minuscolo con
iniziale maiuscola le tabelle, fai lo stesso nel db e cmq in generale quando
lavori con sql e database
per quanto riguarda l'accesso ai campi di un recordset io mi trovo molto
bene ad utilizzare gli indici invece che i nomi, bisogna ricordarseli, ma a
volte da un po' più di leggibilità
Perchè usi trenta timer? per fare il refresh delle combo? è proprio
necessario?
Mucio

 volte da un po' più di leggibilità
E quando dopo 6 mesi torni a guardare il codice ti ricordi cos'era l'indice
4 ?
:-)
Secondo me e' MOLTO piu' leggibile e comprensibile (anche per un altro che
debba guardare il codice) mettere i nomi...
Ciao.

 wrote in message
news:tKJM7.21727$4M2.5...@news2.tin.it...

dipende per fa cosa?
se devo inzializzare un recordset, meglio un ciclo for con gli indici, se
devo inserire trenta campi che prendo da trenta combo box, magari il mio
codice sarà
rsPippo(1) = txtCasa
e allora lo capisco ugualmente
diverso è il caso in cui devo fare di test su un campo particolare del rs
Mucio

 ha scritto
| Questa è una piccola parte del codice che gestisce una form atta alla
| navigazione, modifica cetc.. di record in un db access....così tanto per
| farvi capire come programmo male e come uso i timer...
| Vi prego evitate di prendermi in giro...
Perche' dovremmo?
| Private Sub Form_Load()
[...]
| End Sub
Nella procedura Form_Load dovresti mettere le chiamate alle procedure che inizializzano le varie
combo. Inoltre devi mettere quel codice di inizializzazione in nuove sub, scritte da te, e non
nell'evento Timer() dei vari timer.
Mettere del codice all'attivazione di un timer significa eseguire quel codice ad intervalli
regolari. Per quanto riguarda l'accesso al DB generalmente dovrebbe avvenire dopo una esplicita
richiesta dell'utente o dopo un evento generato da un'interazione da parte dell'utente, e non ogni
tot secondi in base a come sia impostato un timer.
| Private Sub timerComboClienti_Timer()
| 'RIEMPIE COMBO DEI CLIENTI CON I DATI PROVENIENTI DALLA TABELLA CLIENTI
[...]
| End Sub
Crea la tua procedura (mettila all'inizio del modulo, subito dopo le dichiarazioni di variabili
globali e di modulo):
Sub RiempiComboClienti()
[...]
End Sub
e chiamala dove ti serve.
| Private Sub timerContrattiInizializza_Timer()
| 'INIZIALIZZA LA QUERY DELLA NAVIGAZIONE E RICHIAMA IL TIMERCONTRATTI CHE
| ESEGUE IL REFRESH
| 'DEI DATI
[...]
| End Sub
Qui non fai altro che richiamare una sub da un'altra sub, tuttavia non hai nessuna necessità che la
seconda sub (quella dei contratti) sia proprio il codice di attivazione di un timer.
Crea la tua procedura (mettila all'inizio del modulo, subito dopo le dichiarazioni di variabili
globali e di modulo):
Sub InizializzaContratti()
[...]
End Sub
e chiamala dove ti serve.
| Private Sub timerRefreshContratti_Timer()
| 'ESEGUE IL REFRESH DEI CAMPI DATI RELATIVI AL CONTRATTO
| 'TRIPRISTINA LO STATO DI ENABLED DI TUTTE LE VARIE COSE ALLO STATO INIZIALE
[...]
| End Sub
Crea la tua procedura (mettila all'inizio del modulo, subito dopo le dichiarazioni di variabili
globali e di modulo):
Sub RefreshContratti()
[...]
End Sub
e chiamala dove ti serve in modo tale che, se il refresh vuoi che venga eseguito solo dopo che
l'utente abbia premuto un bottone, non fai altro che spostare una riga di codice dall'evento Timer
all'evento Click del Button.
| Private Sub cmdConferma_Click()
| If lblCodice.Caption <> "" Then
|     If lblCodiceCliente.Caption <> "" Then
|         If lblTipo.Caption <> "" Then
[...]
|                          End If
|                     Else: MsgBox ("MANCALA IL TIPO DI CONTRATTO!"), 48,
| ("ERRORE!")
|                     End If
|                  Else: MsgBox ("NON E' STATO SELEZIONATO UN CLIENTE!"), 48,
| ("ERRORE!")
|         End If
|         End If
|
| End Sub
Io trovo + leggibile una soluzione del genere (anche se non e' programmazione strutturata):
Private Sub cmdConferma_Click()
    If lblCodice.Caption = "" Then MsgBox "...": Exit Sub
    If lblCodiceCliente.Caption = "" Then: MsgBox "...": Exit Sub
    If lblTipo.Caption = "" Then MsgBox "...": Exit Sub
    [...]
    Tutti = "SI"
    Nuovo = "NO"
    dataContratti1.Recordset("CODCONTRATTO") = Val(lblCodice.Caption)
    dataContratti1.Recordset("CODCLIE") = Val(lblCodiceCliente.Caption)
    [...]
End Sub

 Vi prego evitate di prendermi in giro...
[SNIP]
Nessuna presa in giro...
lasciando da parte le altre perplessita su variabili globali ecc.. veniamo
al dicorso dei timer; ad una prima occhiata credo di aver capito il perche'
di questo uso indiscriminato: li usi al posto delle funzioni!
In pratica ogni volta che hai bisogno di una parte di codice da eseguire
piu' volte definisci un timer e inserisci il codice nel suo evento, quindi
per richiamare il codice attivi il timer e quindi lo disattivi fino alla
prossima chiamata.
A parte il vizio concettuale di questo approccio, il grave difetto e' che
gli eventi del timer sono *asincroni* rispetto all'esecuzione del codice
principale e, per breve che sia l'impostazione di 'Interval', non hai
nessuna garanzia che vengano eseguiti nell'ordine che vorresti...
sinceramente sono stupito che non ti si sia mai "accavallato" il codice con
comportamenti bizzarri del programma
Il modo corretto di procedere invece e' quello di definire *routine* o
*funzioni* nelle quali inserire il codice che ti interessa e che puoi
richiamare in altri punti del programma; sintetizzando al massimo, le
differenze fondamentali rispetto agli eventi timer sono:
- puoi passare uno o piu' parametri alle routine
- nel caso delle funzioni puoi restituire un risultato al chiamante
- il codice viene eseguito esattamente nell'ordine con cui lo hai chiamato,
ed e' sincrono, nel senso che l'esecuzione ritornera' nel punto successivo
alla chiamata solo quando il codice contenuto nella routine e' stato
eseguito completamente.
Ora, a meno che il "un piccolo manuale" di cui parlavi non sia veramente una
schifezza, sono sicuro che questi concetti sono stati sicuramente affrontati
e difficilmente ti sara' stato suggerito un approccio basato sui timer... ti
consiglio di riprendere la lettura e eventualmente di procurarti qualche
altro testo base (Sito Comune per avere un'idea), trovi una panoramica anche
su MSDN, sotto "Utilizzo di Visual Basic/Manuale del programmatore/Nozioni
fondamentali sulla programmazione"; fai qualche prova su applicazioni
semplici (niente database, tra gli esempi che trovi sul CD 1 di MSDN
potresti guardare "SDInote", basta che non impari a fare e toolbar come in
quel programma :-)) una volta presa dimestichezza ritorna alla form di
esempio che hai postato e riscrivila eliminando tutti i timer, ti accorgerai
che in fondo volevi fare la cosa giusta ma applicando un metodo sbagliato
Tornando al subject iniziale ti consiglierei di accantonare per il momento
lo studio delle classi, concentrati per adesso sulla ristrutturazione delle
applicazioni che hai scritto fino ad ora con i concetti giusti
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

posso postarne un'altro pezzetto o disturbo troppo?

 ha scritto
| posso postarne un'altro pezzetto o disturbo troppo?
Ehehehe, no, non disturbi... :)
Almeno non a me...

"Jabba The Hutt" <Jabba....@Alderaan.SW> ha scritto nel messaggio
news:NfLM7.22002$4M2.5...@news2.tin.it...

Facciamo così...
Visto che mi avete già dato molti spunti su cui lavorare e per questo vi
ringrazio tutti infinitamente, ora vado a studiare, poi tornerò sicuramente
più avanti a rompervi le scatole, con eventuali nuovi dubbi o concetti non
ancora concepiti completamente.
Per il momento mille grazie...
Davide