Newsgroup: it.comp.appl.access
Titolo: Domanda *difficile* (credo) : chiamare routine - evento in modo  parametrico

Buongiorno a tutti.
/chiacchiere inuti - start
  Credo, stavolta, di chiedere troppo al "giocattolino" VBA.
  (d' altra parte questo m' hanno dato qui, e con questo mi devo
  arrangiare) ...
  Ma non si sa mai : io di natura sono ottimista :-)
chiacchiere inutili -end/
Esempio :
supponiamo di avere in maschera due combo : C1 e C2.
E quindi due procedure evento associate di tipo, diciamo,
AfterUpdate, per cui avremo :
C1_AfterUpdate( )
   fai questo e quest' altro
end sub
C2_AfterUpdate( )
   fai questo e quest' altro
end sub
Bene.
E' possibile chiamare queste procedure - evento ... Come dire ...
Con uno statement di tipo, grosso modo :
do while not controlli.eof
    Nome_Controllo = controlli("Nome_Controllo_").value
    CALL me.controls(nome_controllo)_AfterUpdate
    controlli.movenext
loop
Non so francamente se mi sono spiegato.
Il VBA non supporta la chiamata di funzione per indirizzo,
a meno che non si tratti di una chiamata a qualche API in
call back. Come si puo' ovviare a questa limitazione ?
C'e' un trucco, un' escamotage che non sia EVAL ( ) ?
E' inaffidabile, e non funziona per le proc evento.
Grazie. Spero molto nel vostro aiuto.

radicale.002 ha scritto:

Cioe' sulla open una cosa del genere?
for each ctl in Controls
	ctl.onafterupdate = "[Event Procedure]"(*)
next
N.B. non tutti i controls potrebbero avere l'afterupdate
oppure
  una "Eval"?
(*) oppure una funzione di tua scelta
--
ac

 oppure una "Eval"?
Meglio lasciarla perdere quella.


wrote:

Si ma ... Mi chiedevo :
1)
lo statment
ctl.onafterupdate = "[Event Procedure]"
*scatena* effettivamente la "[Event Procedure]" ?
2)
Me lo dai l' esempio ? Ti prego !

 Me lo dai l' esempio ? Ti prego !
E' quello s.e&o.. Da qualche parte sul sito di Karl ci dovrebbe essere 
la faq
A fronte di "[Event Procedure]" il sistema va a cercare (se non e' stato 
modificato da personalizzazioni) la sub/funzione con 
nomecontrollo_nomeevento
questo e' invece l'esempio con una funzione generica
ctl.onqualchecosa = "=funzioneblabla()"
Ed e' esattamente la cosa che potresti fare, in disegno, sul formato di 
gestione delle proprieta'.
--
ac

nomecontrollo_nomeevento
Ah !
Io pensavo che la "[Event Procedure]"  fosse il nome
della procedura da eseguire.
Invece e' il parametro. Scusa.
Ci provo. Ancora grazie, davvero molto gentile.


 Ci provo. Ancora grazie, davvero molto gentile.
No ...
Non va bene. Non e' possibile passare parametri alla
funzione, chiamandola in quel modo.
Oddio, e' vero che potrei predisporre i valori delle variabili
all' esterno e scrivere le funzioni in modo che se le vadano
a leggere la, ma e' un accrocco. Non mi piace. Io credo
molto nell' eleganza della programmazione.
Agiro' diversamente.
Comuque oh !
Grazie, grazie mille per l' interessamento. Davvero.

radicale.002 ha scritto:

Non comprendo.
Alcune funzioni evento ricevono parametri. Tali parametri sono passati 
dal sistema, quale' il motivo che ti induce a forzarli?
Tutto cio', naturalmente, in base a come hai, mi sembra, posto il 
problema. Se poi, come dice Karl, hai qualche codice "segreto" questo, 
detto in modo aulico, son ben'altre braghe(*)
(*) sostituibile con piu' espliciti riferimenti

 (*) sostituibile con piu' espliciti riferimenti- Nascondi testo citato
No no per carita' ... Nessun segreto. Ancora, mi dispiace se t' ho
dato la sensazione di aver perso tempo con me. Non e' affatto vero,
perche' quel modo di chiamare le proc mi risultera' molto utile.
Dico sul serio.

 Dico sul serio.
In questo momento ho parecchio tempo da perdere al contrario di te, mi 
sembra.

al contrario di te, mi sembra.
Questa me la devi spiegare.

 Questa me la devi spiegare.
Nel senso che mi sembri parecchio impegnato a scrivere una applicazione 
mentre il sottoscritto non sa piu' a che serial TV votarsi
perche' a questa non puoi passare parametri?
=funz(x,y)
Di fatto e' una Eval, che non comprendo perche' la "aborri"

 Di fatto e' una Eval, che non comprendo perche' la "aborri"
Ma non e' che la "aborro" ... Semmai e' lei che
"aborrisce" me. (LOL).
Ho sperimentato, ad esempio, che se f(x,y) restituisce
un recordset, l' eval *schioda* miseramente. E altre cosette
che non ricordo (c' ho combattuto qualche anno fa)
E poi, posso fare if (... =f(x,y) ) then ... ? Non credo.
O si ?
Se si, fammi un esempio CONCRETO,
mannaggia a te ! :D
(notare faccetta sorridente).

 E poi, posso fare if (... =f(x,y) ) then ... ? Non credo.
Se devi fare if fun(x) then
Non puoi legarla ad un evento di form poiche' il ritorno avviene su 
access e non a caso il sistema genera delle sub e, come nel caso della 
beforeupdate, poiche' e' permessa la segnalazione di "abort" dell'evento 
il tutto viene mediato impostando il valore (false) sul parametro cancel 
(passato per riferimento)
L'eventuale ritorno della funzione va gestito mediante una variabile 
pubblica da interrogare quando serve.
Siamo pero' passati da un problema di parametri a un problema di ritorno 
funzione.
Forse una descrizione analitica del problema potrebbe servire.

 Forse una descrizione analitica del problema potrebbe servire.
M' avevi chiesto perche' non mi piace l' eval.
Non mi piace perche' non e' generale. Fisse mie ...
Pero' (per favore) :
fammi un esempio concreto di chiamata a una funzione
chiamata con l' on ... Eccetera e fammi vedere come gli
passi i parametri.

radicale.002 ha scritto:

Prova a scrivere, su un qualsiasi controllo in evento nella form delle 
proprieta'  :  =setTag(Form)
e magari inserisci questa in un modulo
Public Function setTag(fm As Form)
     fm.ActiveControl.Tag = "" & fm.ActiveControl.value
End Function

 End Function
E in che punto gli passo i parametri ?

 Sai usarlo il debug vero?
Si si, certo.
Attendo.

 Oppure form e' una parola chiave ?
Ah ... Un' altra cosa :
E se invece volessi passargli un recordset o una
stuttura, come faccio ?

 Oppure form e' una parola chiave ?
No. Va bene anche Me (se non ricordo male, forse access la trasforma in 
"Form")


 "Form")
Ok, a posto. Grazie. Mai vista sta tecnica.
M' hai insegnato veramente.
Mo' se me dici come faccio a passargli dei parametri generici
e non solo una form (recordset, strutture, stringhe, vettori ...)
c' hai er caffe' pagato.
Hai fatto 30, fai 31, no ?  :-)))

 
E' solo un problema di visibilita'. Temo che le tue variabili debbano 
essere di tipo globale. Normalmente non ho questo problema perche' sono 
uso utilizzare una classe globale che ha la possibilita' di avere dentro 
tutto quello che mi potrebbe servire. Passare un solo oggetto per 
riferimento e' la cosa piu' veloce e duttile. Passale come faresti 
normalmente se hai problemi "telefona casa"
--
ac

 normalmente se hai problemi "telefona casa"
Ok , grazie ancora e alla prossima, allora.