Newsgroup: it.comp.appl.access
Titolo: forzare un evento da codice vba (collegato a Simba)

La richiesta di Simba, non è banale.
Può essere molto utile e anche a me interesserebbe
una possibile soluzione.
Il mio caso è il seguente.
Ho creato una form che vado ad inserire
come sub form in varie maschere. In effetti
questa subform funziona come una barra di strumenti
e posso richiamarla aperta in più maschere,
perchè in codici ad essa associati sono contestuali,
agiscono cioè sulla form parent che la contengono.
I moduli privati del subform li ho generalizzati in
modo tale da funzionare in ogni maschera opportunamente
predisposta. Per esempio una form che ho chiamato
"Barra01Filter", ha 9 caselle di testo che mi permettono di
creare dei filtri andando a ricercare i termini di ricerca
in un campo opportuno del recordset della maschera parent.
Questo campo lo chiamo sempre 'Parola' ed è il concatenamento
dei campi a cui voglio permettere la ricerca.
Ad ogni evento 'afrerupdate' di ciascuna cella lancio
un codice che aggiorna il filtro.
E fin qui funziona egregiamente, anzi sono
molto soddisfatto di questo sistema perchè ritengo
che sia furbo: ho creato un sacco di barre di strumenti una volta
per tutte che funzionano indistintamente in ogni maschera.
Problema: quando apro il form parent (per esempio la Maschera Spese)
con un filtro per riferimento di commessa, però a partire
da una altra maschera su doppio click su un riferimento di commessa,
assegno alla prima casella di filtro della "Barra01Filter" il
valore del riferimento di commessa, e per me sarebbe comodo
che il gestore degli eventi capisse che a questo punto dovrebbe
eseguire tutti i codici associati all'evento update, proprio come
se il rif di commessa fosse digitato da tastiera.
**** DOMANDA FINALE RIASSUNTIVA
In altri termini, perchè quando assegno un valore ad
un controllo da codice, non entra in evento afterupdate?
C'è un modo per forzare/concatenare gli eventi?
Non trovo che sia una soluzione poco elegante.
****** SCUSATE la PROLISSITA'
Saluti Dario

 Saluti Dario
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 creando un Metodo Pubblico di Maschera che chiama la Private interna.
che significa? Io ho cambiato
la routine dell'evento da Da Private in Public,
però usando la istruzione Call da codice estero al modulo
di form, mi da errore. Ometto qualche passaggio?
C'è una faq sul NG in merito all'argomento Metodo Pubblico di
Maschera?
Io non lo ho trovato.
Danken.

 wrote in message
news:1138093414.5...@g14g2000cwa.googlegroups.com

Gli eventi di Form sono Privati, io ti ho detto di crearti un
Metodo Pubblico, quindi una Sub o Function che richiama l'Evento.
Se non posti il tuo codice posso solo fare SUPPOSTE e si sciolgono
velocemente.....!!!


velocemente.....!!!
Ti posto il mio codice:
Obbiettivo aprire una maschera con controllo calendario
per fare l'inserimento della data. Su pressione F3 attivo
la ricerca (o gli inserimenti in generale). Non uso
il doppio clic perchè come convenzione lo utilizzo
per aprire una maschera. Per esempio doppio clic sul
rif di commessa della MascheraSpese, mi apre i dettagli
della commessa, su F3 invece apre una maschera
ad elenco dove posso fare richerche e filtri ed inserire una
commessa ricercata.
Questa function la metto nell'evento tasto giù di un controllo
per esempio MascheraSpese, ed il campo e' IDData.
COSI: MascheraSpese.IDData.OnKeyDown =
FormKeyDown([Form];"DataInserisci";"IDData";[IDData])
Siccome dopo in automatico parte la macro Autokeys, essa
lancia la funzione pubblica GetLastKeys.
La FormKeyDown non fa altro che filtrare gli eventi, e cioè settare
le variabili globali per evitare che ad ogni pressione dei tasti F3, F5
o altri..
venga eseguita l'operazione, cioè se AutoContextOKGlobal =true.
Voglio che succeda qualcosa solo quando premo F3 all'interno del
controllo in cui ho inserito l'evento MascheraSpese.IDData.OnKeyDown.
Public Function FormKeyDown(FormObject As Form, Optional StrForm As
String, Optional StrCtrl As String, Optional ValueCtrl, Optional
ValueDef As Integer) As Integer
    Set FormObjectGlobal = FormObject
    Result = ResetLastKeys()
    StrCtrlGlobal = StrCtrl
    StrFormGlobal = StrForm
    ValueCtrlGlobal = ValueCtrl
    ValueDefGlobal = ValueDef
    AutoContextOKGlobal = True 'Si il tasto è stato premuto in questo
contesto
    AutoKeysOKGlobal = Not Screen.ActiveControl.Locked 'Si il tasto non
è bloccato
End Function
Public Function GetLastKeys(StrKeys As String)
If AutoContextOKGlobal Then
    If ValueDefGlobal = 1 Then
        StrForm = 
FormObjectGlobal.Form.Parent.Name
    Else
        StrForm = 
FormObjectGlobal.Form.Name
    End If
    Select Case StrKeys
    Case "{F3}"
            DoCmd.OpenForm StrFormGlobal, , , , , , StrForm
    Case "{F5}"
        FormObjectGlobal.OrderBy = StrCtrlGlobal
        FormObjectGlobal.OrderByOn = True
    Case "^{F5}"
        FormObjectGlobal.OrderBy = StrCtrlGlobal & " DESC"
        FormObjectGlobal.OrderByOn = True
    End Select
End If
End Function
Questa function la metto nell'evento on clic, di un tasto
associato al doppio clic su una data di un controllo
calendario. Nel punto (1) assegno alla maschera di origine
MascheraSpese nel controllo che si chiama IDData, il valore
scelto nel controllo calendario ValueCtrl.
Public Function InsertValue(ValueCtrl)
    If AutoKeysOKGlobal Then
	FormObjectGlobal.Form.Controls(StrCtrlGlobal) = ValueCtrl  '(1)
        DoCmd.Restore
    Else
    	strCaption = Screen.ActiveForm.Caption
    	O$ = MsgBox("La maschera di origine '" & FormObjectGlobal.Caption
& "' " & "probabilmente è bloccata!" & Chr$(13) & "L'inserimento non
sarà effettuato.", 				vbInformation + vbOKOnly, strCaption)
    End If
    Result = ResetLastKeys()
    If StrFormGlobal <> "" Then DoCmd.Close acForm, StrFormGlobal
End Function
Public Function ResetLastKeys()
    AutoKeysOKGlobal = False
    AutoContextOKGlobal = False
End Function
ECCO IL PUNTO ****************
Al form MascheraSpese, nel controllo IDDAta ho
messo un evento 'BeforeUpdate" che mi da un avvertimento
di notifica modifiche, riporto:
Public Function AlertControl(FormObject As Form) As Integer
    StrCtrl = 
Screen.ActiveControl.Name
    RC = FormObject.Recordset.RecordCount
    CR = FormObject.CurrentRecord
    If CR <= RC Then
        Confirm = MsgBox("Modificare il campo " & StrCtrl & " è
pericoloso!" & Chr$(13) & "Continuare comunque?", vbCritical + vbYesNo
+ vbDefaultButton2, FormObject.Caption)
        If Confirm = vbNo Then
            FormObject.Undo
        End If
    End If
    AlertControl = Confirm
End Function
********** EBBENE, sai una cosa
dopo che mi sono scritto tutta sta trafila
ho capito che bastava ricopiare la funzione pubblica AlertControl
dopo il punto (1) e tutto fila.... e funchia.
Sorry. Spero che comunque il papiro possa servire
a quanlcuno...
Salute.