Newsgroup: it.comp.lang.visual-basic
Titolo: [?][VB6]Textbox, Usercontrol e willchangefield

Salve a tutti,
Premetto che sono un paio di giorni che cerco nei newsgoup e l'unica cosa
che ho trovato sono stati: un riferimento ad un buco sull'evento
_FieldChangeComplete risolto con il ServicePack4 ,  e qualche altro
messaggio non troppo chiaro o indovinato.
Espongo il mio problema, probabilmente banale.
Ho un controllo utente associato ai dati (un recordset ADO) con dentro un
semplice textbox e il PropertyChanged messo sia nella proprietà associata al
datafield, sia nell'evento _Changed del testo (l'avevo messa anche nel
_Validate).
La cosa funziona bene quando muovo il recordset, ma non mi basta.
Un comune TextBox associato ai dati quando perde il fuoco mi lancia l'evento
_WillChangeField
Adesso io mi chiedo; perchè il mio controllo non si comporta allo stesso
modo?
Ho provato varie cose anche con DataChanged, DataBingings a manina,
accendere dell'incenso... niente.
Dove sbaglio?
Io darei anche la colpa ad un Buco  Microsoft, ma ho bisogno di una conferma
:)
Grazie a tutti
aloHa
elefante

non ho mai lavorato con gli UserControl, ma credo sia giusto cosě.....
quando viene intercettato, viene scatenato l'evento, che deve essere
gestito....punto e basta.
il ciclo di vita di un evento termina lě. Viene scatenato a gestito.
In altre parole, quando la textbox "interna" al controllo intercetta
l'evento WillChangeField, l'evento muore lě, muore lě dopo essere stato
gestito dalla textbox. Quindi devi essere tu, se vuoi, che a tua volta devi
propagare l'evento stesso alla app chiamante, quella che contiene lo
UserControl.
Prova a cercare la parola chiave Raise o qualcosa di simile......
questo teoricamente, praticamente non l'ho mai fatto e spero che
qualcun'altro
ti possa dare una mano meglio di me.
good coding!!!
--
Damiani Liborio Igor
ig...@igordamiani.it
 - 
dam...@italiainfiera.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262

 Prova a cercare la parola chiave Raise o qualcosa di simile......
[...cut...]
Il problema non sono gli eventi che gestico dal controllo, ma il fatto che
la classe che ho scritto che funge da DataSouce non 'sente' che č stato
modificato il valore. O meglio lo sente, ma non quando vorrei.
Vedo di spiegarmi meglio:
- Ho fatto una classettina stupida che mi funge da sorgente dati utilizzando
anche un Recorset ADO a dichiarato a livello di modulo con withevents.
Questa gestisce anche gli eventi del Recordset. E in questo caso particolare
mi interessa la gestione dell'evento _WillChangeField per notificare in
maniera visiva la modifica del campo.
- Ho fatto poi un semplice controllo utente costituito solo da un TextBox,
in modo da poter aggiungere un paio di eventi e proprietŕ che mi servivano.
Se prendo un TextBox standardi e gli imposto come DataSource la mia classe
funziona egregiamente. E cioč quando il TextBox perde il fuoco viene
automaticamente lanciato l'evento _WillChangeField  del recordset nella
classe.
Stando anche alla documentazione Microsoft, chiamando il metodo
PropertyChanged [proprietŕ]  nell'evento _Changed del testo e nella Property
Let della proprietŕ impostata come agganciata al DataField la sorgente dati
dovrebbe accorgersi dell'avvenuta modifica del dato.
Quindi io a sto punto mi aspetto che, impostando la classe come DataSource
per il mio controllo, quando quest'ultimo perde il fuoco venga lanciato
l'evento _WillChangeField del Recordset, proprio come accade per il TextBox.
Ma purtorppo non č cosě.
Il Recordset sente si la modifica del valore nel controllo ma solo quando
viene fatta un'operazione sul Recordset stesso. Rendendo inutile la notifica
visiva , visto che arrivato sto punto devo comunque chiedere la conferma
della modifica.
Spero di essere stato piů chiaro ora.
grazie ancora
elefante

 _WillChangeField
[...cut...]
Ho trovato una soluzione, quindi la posto, se a qualcuno potesse
interessare.
Naturalmente mi sento un idiota per non averci pensato subito comunque ho
fatto così:
-ho tolto l'associazione ai dati della proprietà text del mio controllo
-ho messo una proprietà DataField
-ho messo una proprietà DataSource
-ho dichiarato  a livello di modulo un oggetto ADODB.Recordset con
WithEvents (mvarDataSource)
Impostando il DataSource si setta il riferimento per mvarDataSource.
A sto punto nell'evento _WillChangeField di mvarDataSource reimposto il
testo con il valore del campo specificato in Datafield, naturlamente prima
verificando che ci sia un DataField e che il DataSource non sia a Nothing.
    if (not mvarDataSource is Nothing) and (len(mvarDataField)) then
        txtTesto.Text  =  mvarDataSource(mvarDataField).value
    end if
Poi, nell'evento _ExitFocus del controllo imposto il nuovo valore del campo
    if (not mvarDataSource is Nothing) and (len(mvarDataField)) then
       if bModificato then mvarDataSource(mvarDataField).value  =
txtTesto.Text
    end if
E a rigor di logica credo che anche il comunte TextBox faccia le stesse
operazioni. Ed essendo il recordset solo un riferimento no dovrebbe
appesantire ulteriormente il controllo.
aloHa
elefante