Newsgroup: it.comp.lang.visual-basic
Titolo: visibilita di valori di oggetti

Se io in un evento click scrivo
classe.oggetto = variabile.text
il valore immesso nell'etichetta viene incamerato dall'oggetto.
Se però dopo questo comando chiamo una funzione dove
al suo interno c'è del codice che fa uso del valore dell'oggeto succede che
l'oggetto ha valore zero.
Io pensavo che una volta detto a VB che classe.oggetto = x questo valore me
lo portavo dietro fino a quando non ero io a dire a VB di rilasciare quel
valore.
Qualcuno mi può spiegare la visibilità degli oggetti perchè ho sempre letto
che non è buono creare variabili globali giusto?
Scrivendo in questo modo:
Dim Assunzione As CLavoratore
Set txtAssunzione.Text = Assunzione
ricevo un errore "Utilizzo non valido di Property"
se invece scrivo cosi:
Dim Assunzione As CLavoratore
txtAssunzione = Assunzione
"Errore Run Time91" Variabile Oggetto o variabile dle blocco With non
impostata
se invece scrivo cosi:
Dim Assunzione As CLavoratore
Set Assunzione = txtAssunzione
"Tipo non corrispondente" [Assunzione=Nothing, txtAssunzione="gg/mm/yy"]
In questo caso, sempre per fare prove e capire il funzionamento ho provato a
formattare la stringa presente in txtAssunzione in data ma mi da lo stesso
errore.
A questo punto sono tornata sui miei passi e ho scritto
Dim Lavoratore As New CLavoratore
Lavoratore.Assunzione = txtAssunzione
Questo codice non mi da errore anzi accede alla Let dell'oggetto Assunzione
e gli
assegna il valore presente in txtAssunzione ma ho notato che appena esce
dalla Let
il valore ridiventa 0, tant'è vero che quando il codice passa ad un'altra
Sub in un altro
Form quando vado a richiamare il valore di Lavoratore.Assunzione ho un bel
zero.
Where do i wrong?
Capperi pure l'english a questo mi esce!!!
Debby

 wrote:
[cut]
E il codice di CLavoratore???
Altrimenti sembra "La settimana enigmistica"!
Ciao!

 un'altra Sub in un altro
debby, l'oggetto lavoratore, da come l'hai dimensionato, è locale alla
funzione in cui è utilizzato. una volta uscita da quella funzione l'oggetto
viene distrutto...
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 Debby
ciaociao

 a questo cosa? :-P
Volevo scrivere a quest'ora =))))
Debby (la maga dei computer uaaaaaaaaaaaaaaaaaaaaaaaaa)

 viene distrutto...
Tra un pò sarà il mio pc ad essere distrutto :oD
Come ho risposto a Marg "per ora" ho il problema di passare il valore
della proprietà Assunzione alla GET della proprietà Anzianità, infatti in
questa
Property ho messo ( con l'inestimabile aiuto di Zanna e Marg) del codice per
tirare fuori l'anzianità in base alla data della
busta paga.
E' prontooooooo  si pappaaaaaaaaaaa
Ciao Deborah!

 Altrimenti sembra "La settimana enigmistica"!
Scusa hai ragione
*CLavoratore*
Option Explicit
Dim datAssunzione As Date
_________________________________
Public Property Get Assunzione() As Date
 Assunzione = datAssunzione
End Property
Public Property Let Assunzione(ByVal vNewValue As Date)
datAssunzione = vNewValue
End Property

  txtAssunzione = Assunzione.proprietą
Faccio una rettifica alla mia prima risposta:
Se io scrivo
Dim Lavoratore As CLavoratore
Set Lavoratore = New CLavoratore
txtAssunzione = Lavoratore.Assunzione
il valore di Lavoratore.Assunzione rimane 0 perchč
mi entra nella Get. Ti dirņ di pił!
Se nell'etichetta c'č scritta una data, questa data scomprare
e diventa 0.00.00
Da come mi č stato spiegato in questo caso a me serve la LET e non la
GET perchč il valore di questa proprietą viene preso dal valore
dell'etichetta.
Cambiando infatti,
Dim Lavoratore As CLavoratore
Set Lavoratore = New CLavoratore
txtAssunzione = Lavoratore.Assunzione
                *in*
Dim Lavoratore As CLavoratore
Set Lavoratore = New CLavoratore
Lavoratore.Assunzione = txtAssunzione
il valore viene passato alla LET e non modifica il contenuto di
txtAssunzione.
(come penso che sia giusto)
Ora perņ devo capire come passare questa proprietą ad un altra proprietą
dello stesso
oggetto
*Deb*

Basta anche questa notte non sono riuscita a risolvere il problema
[cavoli come vola l tempo quando si lavora con VB!!]
Ho notato che quando non mi risponde nessuno vuol dire
che le risposte avute sono più che sufficienti a risolvere il problema,
infatti negli altri thread la cosa ha funzionato facendomi applicare di più
ma questa volta ho finito tutte le mie idee su come ragiona VB
Il problema della visibilità nell'intero progetto penso di averlo risolto
utilizzando
un modulo di codice perchè ho letto che le variabili in un modulo di codice
sono
viste da tutto il progetto.
In questo modulo di codice allora ho pensato di mettere una funzione per
caricare i valori
delle mie variabili in modo tale, una volta caricate, poterle utilizzare in
tutto il mio progetto.
Quindi ho scritto cosi
Option Explicit
Public gAssunzione As Date
Public gQualifica As Integer
Public gAnzianità As Integer
_____________________________
Public Sub LoadValue()
Dim Collega As New CLavoratore
gAssunzione = frmProfilo.txtAssunzione
gAnzianità = Collega.Anzianità
[cut]
end sub
Zanna mi ha aperto gli occhi nel creare la classe dicendomi di non pensare
ai Form in modo che essa facesse
solo la parte logica, spero non sia lo stesso per i moduli di codice perchè
come avrete notato qui ho collegato
gAssunzione ad uno dei form presenti nel progetto.
Se anche con i moduli di codice non si deve pensare al Form, datemi un input
perchè non riesco a capire come
o dove associare gli oggetti presenti sui form alle proprietà degli oggetti
presenti nella classe.
Comunque il problema principale è che il valore di gAnzianità nasce quando
VB entra nella Property di Collega.Anzianità
ma appena ne esce fuori anche gAnzianità muore ridiventando zero. Ma come
faccio a far si che gAnzianità non muoia?
Debby ____
Notte a domani

 gAssunzione = frmProfilo.txtAssunzione
vuol dire che la data di assunzione relativa al collega viene digitata nel
campo txtAssunzione della form frmProfilo.
Allora tu saprai questa proprietà solo quando il campo sarà riempito.
Nel codice di frmProfilo dovresti inserire :
Private txtAssunzione_Validate(Cancel as Boolean)
' verifica se il valore è valido altrimenti non lo accetti
.....
' la proprietà è valida e perciò posso applicarla al mio oggetto
Collega.Assunzione = cdate(txtAssunzione.text)
end sub
Così devi fare anche per le altre proprietà. Perciò, se un giorno vorresti
prelevare i dati direttamente da un db e non farli digitare dall'utente
avrai, dopo la lettura del record dipendente, l'assegnazione della proprietà
in base al valore del campo (Collega.Assunzione =
rstDipendente.fields("DataAssunzione").value) ed il codice all'interno della
classe resterà immutato.
Il valore è persistente all'interno della tua classe, viene caricato con la
Property Let/Set e restituito al tuo programma dalla Property Get ed è per
questo che devi dichiarare l'istanza della tua classe nel punto corretto
(nel tuo caso come Public in un modulo).
Eventualmente, per i problemi che avevi segnalato in precedenza quando viene
utilizzato un metodo della classe dipendente da una proprietà non ancora
valorizzata, nell'inizializzazione della classe puoi assegnare dei valori di
default e/o gestire dei codici di errore.
Ad esempio, per sapere l'Anzianità devi aver inizializzato le date
Assunzione e Verifica; la data Verifica può essere posta di default alla
data odierna mentre puoi prevedere la generazione di un codice d'errore nel
caso in cui l'utente non abbia ancora compilato in modo corretto il
frmProfilo e quindi la data Assunzione non sia ancora valorizzata
Continua così perchè mi sembra che tu abbia già fatto molti passi avanti.
Saluti Walter.

 default e/o gestire dei codici di errore.
Ci sto provando ad inzializzare i valori della classe ma non è cosi facile
come
sembra.
Non riesco a capire se li devo inzializzare cosi tipo:
Dim Collega as New CLavoratore
Collega.Anzianità = 0
oppure
Anzianità = 0
Comunque spero sia la confusione della principiante. Purtroppo sono a lavoro
e da qui non posso vedere il mio progetto, stasera vedrò di andare avanti e
di
rompervi di più
Grazie Walter per quella frase che ho messo volutamente all'inizio. Mi ha
fatto molto
piacere
Debby
PS
Scriverò una mail con solo i passaggi logici del mio progetto perchè sono
sicura che c'è qualcosa
che non va a livello logico oltre che per il codice :)))))


All'interno della classe ci sono due eventi specifici "Initialize" e
"Terminate".
Non ha senso inizializzare le proprietà della classe con valori di default
nel programma dove la classe viene istanziata perché, se dovessi creare n
oggetti della classe dovresti ogni volta scrivere anche le varie
assegnazioni mentre incapsulando l'inizializzazione nella classe stessa essa
sarà autonoma.
PS: Non credo che tu debba settare la proprietà Anzianità, come hai indicato
qui sopra, in quanto, essendo calcolata da datVerifica e datAssunzione sarà
in sola lettura.

 in sola lettura.
Se intendi questo
Dim Collega as New CLavoratore
Collega.Anzianità = 0
La dovevo per forza scrivere cosi per inizializzare l'Anzianità a zero
(quindi avevo
dovuto scrivere anche la PropertyLET) ma dopo il suggerimento
dell'inizializzazione
penso proprio che tu abbia ragione.
Un saluto a tutti ci *leggiamo* Lunedi
Bisogna staccare la spina no?
Debby