Newsgroup: it.comp.lang.vo-clipper
Titolo: Metodo EditChange()

Mi sono accorto che quando aggiorno i controlli (SLE di variabili) di una
DataWindow bufferizzata  leggendo i rispettivi campi del database associato
alla finestra, il metodo EditChange() viene richiamato tante volte quanti
sono i controlli della finestra da scrivere. Questo sicuramente rallenta il
programma ed inoltre mi impedisce di capire se la chiamata di EditChange() è
stata fatta per una modifica  apportata dall'utente.
Esiste un modo per ovviare a questo inconveniente?
Ciao a tutti.
Roberto Cordini


Facendo delle prove su di una datawindow, per cercare di risolvere il
problema in oggetto, mi risulta che i seguenti metodi siano richiamati in
questa sequenza:
1°) PreInit()
2°) EditChange()
3°) PostInit()
Vi risulta? Ho scoperto l'acqua calda o vaneggio?
Ancora:
Il metodo EditChange viene chiamato al momento di istanziare una window una
prima volta su tutte le SLE della window che hanno una field spec collegata
ad un DbServer ed una seconda volta quando effettivamente vengono attribuiti
dei valori alle SLE prendendoli dai campi del database (input bufferizzato).
Anche in questo caso sbaglio? Se vi sembra incredibile provate.
Ciao.
Roberto Cordini

...

Hai  provato con EditFocusChange?
Saluti
Paolo Calzi

Ciao Robby,
Si, EditChange è attiva ad ogni tocco di tasto in ogni controllo.
Forse quello che ti server è EditFocusChange, facilmente controllabile,
chiamata ad ogni cambio focus, ma decidi tu quando attivare le linee di
codice che vi andrai a scrivere.
Ciao
Massimo
"Robby" <roberto...@NOxSPAMiol.it> ha scritto nel messaggio
news:99numj$f6t$1...@zamboni.dsnet.it...


L'editChange viene richiamato perche', al momento della crewzione di
un controllo, il suo valore passa da NIL a Stringa vuota, numero = 0,
ecc. Cambiando il suo valore, viene ovviamente richiamato
l'editchange.
Per ovviare la problema puoi fare cosi':
1. crei una variabile di Classe nella tua DataWindow (meglio se in una
tua classe superiore da cui far derivare tutte le datawindows). Es.:
lInitializing
2. nel Preinit metti questa variabile a FALSE
3. Nell'EditChange metti:
	IF .NOT. Self:lInizializing
		<operazioni dell'editchange
	ENDIF
4. Nel Postinit la rimetti a TRUE.
In questo modo eviti che l'editchange venga eseguito durante
l'inizializzazione della finestra.


-----------------------------
Fabio Cresta
Computer Associates FSG Consultant
VO/Jasmine specialist
e-mail: 
fabio....@ca.com
 
fcr...@tin.it
 
fcr...@windevs.com
web: 
http://www.windevs.com
------------------------------


Si ho provato, ma il problema risiede nell'EditChange che viene chiamato
automaticamente al momento di istanziare la finestra. Vedi la risposta di
Fabio Cresta.
Ciao e grazie.
Roberto Cordini


Grazie Fabio, hai capito perfettamente il problema che ponevo e trovato la
soluzione.
Allora avevo ragione quando dicevo che nell'esempio che ho fatto le chiamate
ai metodi vengono eseguite nella seguente sequenza:
1°) PreInit()
2°) EditChange()
3°) PostInit()
Ciao e ancora grazie.
Roberto Cordini


Ciao Massimo, grazie per la risposta. Fabio Cresta mi ha confermato quello
che avevo intuito circa il funzionamento dell'EditChange(). Vedi la sua
risposta che mi sembra molto interessante.
Per quanto riguarda l'EditFocusChange() ho verificato che viene richiamato
automaticamente dopo aver istanziato una finestra quando il primo controllo
acquista il focus (e cioè anche senza intervento dell'utente).
Roberto Cordini