Newsgroup: it.comp.appl.access
Titolo: Avviare un evento da codice se esiste

Ciao
Ho scritto delle funzioni generiche per i controlli di testo che conterranno
valute nel mio applicativo.
il controllo è formattato a "valuta", con un doppio click si avvia una
funzione che tramite una maschera popup mi richiede di immettere il valore
relativo in euro, provvede al cambio moneta e poi assegna il giusto valore
al controllo.
Su alcune si queste textbox (es. dettagli fattura nel caso di una notadi
accredito) devo gestire opportunamente il segno meno e pensavo di farlo con
una funzione banale come la afterupdate:
public sub importo_afterupdate
if me.parent.ènotaaccedito then
 importo = abs(importo)*-1
else
 importo =abs(importo)
end if
peccato che se io immetto il valore in euro con il doppio click, la
procedura afterupdate non viene avviata!
Allora ho pensato di aggiungere del codice alla funzione InserisciEuro.
L'idea è di avviare (se la proprietà del controllo non è vuota) la procedura
relativa.. ma come posso fare ?
grazie mille

...

Scrivi la funzione pubblica che fa quello che hai scritto sopra.
Poi la richiami sia dall'evento after update del controllo che da qualunque
altro evento, per esempio il doppio clic.
Occhio che se la funzione la metti in un modulo esterno alla form i
riferiemnti ai controlli non possono essere con la Me ma devono specificare
la form
Antonio


Se ho capito... tu vuoi far partire una procedura abbinata ad un evento
(AfterUpdate per esempio) anche in altri casi (Doppio click per esempio).
Se è così metti sull'evento:
Private sub Importo_DblClick(Cancel as Integer)
    call Importo_AfterUpdate
End sub
Ciao
Fabio

procedura afterupdate non viene avviata!
Se ho capito bene e' suff. chiamare tuoctl_afterupdate dopo aver
aggiornato il valore.
Bai
--
Lorenzo Coronati
--
<<Nessuno sa che questa affermazione e' vera>>
(John D. Barrow)
--

 End sub
No, non è proprio quello che intendevo
allora mi rispiego:
Ci sono delle textbox che devono eseguire una parte di codice (A) dopo
l'evento afterUpdate
Ci sono delle textbox che devono eseguire una parte di codice (B) dopo
l'evento dblClick (poichè sulla proprietà DopoAggiornamento non c'è
specificato nulla)
Ci sono delle textbox che devono eseguire una parte di codice (B & A) dopo
l'evento dblClick (poichè sulla proprietà DopoAggiornamento c'è specificato
il codice A!)
Volevo modificare il codice B in modo che se
Screen.ActiveControl.Properties("DopoAggiornamento") [ora non mi ricordo il
nome esatto della proprietà, ma ho reso l'idea vero?] è null termino
l'esecuzione, altrimenti eseguo quello che trovo specificato.
Domanda: Come posso dire ad access "Avvia la funzione/[routine evento]
specificata" ?
Sono stato più  chiaro ?
Per la conaca B è quella funzione InserisciEuro che mi fa comparire la
maschera popup per l'inserimento dei valori in euro e si trova su dei moduli
esterni
Grazie mille

 aggiornato il valore.
esatto...
ma come lo chiamo?
infatti a priori non ne conosco il nome
certo potrei costruirmi la stringa tuoctl_afterupdate ma come la"avvio" ?

certo potrei costruirmi la stringa tuoctl_afterupdate ma come la"avvio" ?
Se hai costruito la stringa, fai eval(stringa).
Riguardo al prob su quando c'e' e quando non c'e' la routine, non ti
basta un bel on error resume next?


 basta un bel on error resume next?
E' ancora più facile:
basta controllare il contenuto della priprietà interessata (es Afterupdate)
del controllo da aggiornare in automatico dopo il doppio clik ( e la
conseguente assegnazione di nuovo calore via codice)
Speravo che con eval potessi gestire almeno i casi =funzione(), ma dopo aver
rinunciato a pasarre come argomenti i controlli della maschera
(InserisciEuro è in un modulo esterno e quindi non li riconosce!) ho
scoperto che non mi gestisce nemmeno una funzione pubblica interna al modulo
della form infatti
eval ("Forms('Fatture').ControlloMeno()")
mi da un errore di sintassi e non capisco da cosa dipenda !
....
arrrrrrrrrrrrrggggggghhhhhhhhhhhh cambio mestiere!
help me please!

mi da un errore di sintassi e non capisco da cosa dipenda !
Mmmmmhhh...
Passare controlli alle routine e' una cosa normalissima e funziona
egregiamente.
Poi per chiamare la routine cosi', basta fare call, non serve eval.
Comincia a postare un po' di codice, e rispiegami cosa vuoi fare come
se fossi un bambino di 4 anni.


 se fossi un bambino di 4 anni.
Come vuoi
Prologo : :)
Abbiamo una maschera (frm) con due controlli di tipo textbox (tbA e tbB)
Entrambi visualizzano delle valute (lire) :
Entrambi Con un doppio click devono permetteer di inserire direttamente il
valore in Euro
Soltanto il controllo tbB ha una routine nell'afterUpdate che mi corregge
l'importo messo in base a certi criteri (es in una nota di accredito se il
valore è positivo lo moltiplica per -1!)
I fatti:
in entrambi i controlli all'evento dblclik, nella proprietà ho messo
"=InserisciEuro()" (in modo che copiando ed incollando il controllo in altre
finestre non devo ricordarmi di andare a copiare anche il codice; infatti le
formule vengono copiate mentre le [routine evento] no!)
Cosè "inserisciEuro()" ? E' una chiamata ad una funzione definita in un
modulo esterno così implementata:
Function InserisciEuro(Optional tb As Variant)
'Permette di inserire un valore direttametne in euro
If IsMissing(tb) Then Set tb = Screen.ActiveControl
Dim s As String
s = InputBox("Inserire il valore in euro che si desidera convertire in
lire:", "Inserimento in Euro", CCur(Nz(tb.Value) / cstLirePer1Euro))
' cstLirePer1Euro é una chiara costate definita altrove
If s <> "" Then tb.Value = CCur(CSng(s) * cstLxE)
End Function
Come immaginavo, tutto funziona, ma se avvio la funzione InserisciEuro con
un doppio click (nel caso del tbB) non viene avviata la routine evento che
mi corregge l'importo (nel caso della nota di accredito aggiungeva/toglieva
il meno)
Poichè in realtà la cosa non mi capita solo un una form ma in diverse ho
pensato:
perchè aggiungere le seguenti righe in tutte le form ?
Private sub tba_dblclick(cancel as integer)
inserisciEuro
end sub
Private sub tbb_cblclick(cancel as integer)
inserisciEuro
tbb_afterupdate
end sub
Non sarebbe più facile riscrivere come segue la funzione InserisciEuro?
Function InserisciEuro(Optional tb As Variant)
[... come prima, ma ho accodato il seguente codice...]
If tb.AfterUpdate <> "" Then
 Select Case Left(tb.AfterUpdate, 1) 'serve a differenziare le chiamate a
funzioni o [routine evento]
 Case "=" ' caso delle funzioni; chiaramente non funziona e che ci metto ?
problemi con parametri! Leggi sotto
  Eval Mid(tb.AfterUpdate, 2)
 Case "[" ' caso di [routine evento], come la posso richiamare? si trova in
un altro modulo!
  'MsgBox "Codice da implementare!" & vbCr & "Vedi funzione InserisciEuro",
vbCritical
 Case Else
  'MsgBox "Errore nella proprietà afterUpdate di " & tb.Name, vbCritical
 End Select
End If
Evidentemente più facile non è! ma la cosa mi ha solleticato e intendo
risolverla magari con il vostro aiuto!
Vorrei far notare che in questo momento ci troviamo in un modulo esterno e
questo significa che se la funzione chiamata ha hanno dei parametri, o
comunque non risiede in un modulo esterno abbiamo problemi di visibilità.
Torniamo al mio esempio delle note di accredito.
In tbB.AfterUpdate ho definito "=GestioneMeno([tbB])"
Quando Eval Cerca di interpretare la stringa "GestioneMeno([tbB])" non
capisce, giustamente, cosa sia ttB, ma la cosa strana è che se in
ttb.afterupdate scrivo
"=GestioneMeno(Forms(Fromchecontienettb.name).controls("ttb"))" non funziona
comunque!
mi sono spiegato meglio ?
quali punti devo riprendere ?
grazie mille lorenzo!

perchè aggiungere le seguenti righe in tutte le form ?
Giusta osservazione.
Guarda piu' giu' il mio post "Omaggio della casa" :-)
