Newsgroup: it.comp.appl.access
Titolo: per i GURU di VBA -- URGENTE --

ho notato che in VB si possono creare delle procedure in un modulo di classe
che rispondano a degli
eventi e poi riutilizzarle in qualunque form, ho provato a fare la stessa
cosa con VBA ma l'evento non viene intercettato, qualcuno ha un
suggerimento?
per chiarezza riporto una semplice prova (che non funziona)
premendo il pulsante, (non avendo impostato nessun evento su
di esso in maschera) dovrebbe comparire la message box, ma non succede
niente!
il codice:
_________________________________
'modulo di classe di nome "MyButton"
Option Compare Database
Option Explicit
Public WithEvents Pulsante As CommandButton
Private Sub Pulsante_Click()
    MsgBox "ciao"
End Sub
____________________________________
'in una form qualunque con un pulsante di nome "cmdProva":
Option Compare Database
Option Explicit
Private Pippo As MyButton
Private Sub Form_Load()
    Set Pippo = New MyButton
    Set Pippo.Pulsante= Me.cmdProva
End Sub
___________________________________________

 ha scritto nel messaggio
news:ah8rq4$h76$1...@newsreader.mailgate.org...

Usa Public e non Private se non sei nella maschera.
Poi puoi ottenere la msgbox in modi più semplici. Per esempio
In un modulo pubblico:
Public sub Messaggio()
msgbox "pippo"
End Sub
Chiamando Messaggio (call Messaggio o Messaggio) da un qualsiasi pulsante in
una maschera qualsiasi o da codice ottieni...Pippo.
Ciao, Carlo

 Poi puoi ottenere la msgbox in modi più semplici. Per esempio
la msgbox era un esempio semplificativo per il NG, in realtà la procedura
d'evento deve chiamare una serie di funzioni e filtri che coinvolgono la
maschera e alcune combo dentro di essa.

 maschera e alcune combo dentro di essa.
qualcosa del genere:
Option Compare Database
Option Explicit
Public WithEvents Combo As ComboBox
Private Sub Combo_AfterUpdate()
'limiti: non è importante settare il RowSource delle combo, ci pensa la
funzione
'richiamata all'avvio della maschera, l'importante è settare la proprietà
Tag delle
'combo CON IL NOME DEL CAMPO CHE SI DEVE FILTRARE.
'ATTENZIONE: il RecordSource della maschera contenente le combo può
contenere solo
'il nome di una query o tabella, se è impostato a una istruzione SQL
esplicità
'la funzione darà errori, INOLTRE IL NOME DEL CAMPO DEVE ESSERE UNIVOCO
'IN TUTTO IL DATABASE
    Dim Mask As Form
    Dim cmb As Control
    Dim filtro As String
    Dim Tipo As String
    Dim Valore As String
    Dim FormName as String
    FormName=
Combo.Parent.Name
    filtro = ""
    Set Mask = Forms(FormName)
        For Each cmb In Mask
            If cmb.ControlType = acComboBox And IsNull(cmb.Tag) = False And
cmb.Tag <> "" Then
                If IsNull(cmb) = False Then
                    Tipo = FindField(cmb.Tag)
                    Valore = cmb
                    If Tipo = "testo" Then
                        If InStr(Valore, Chr(34)) = 0 Then
                            filtro = filtro & " and " & cmb.Tag & "=" &
Chr(34) & Valore & Chr(34)
                        Else
                            Valore = Replace(Valore, Chr(34), "*")
                            filtro = filtro & " and " & cmb.Tag & " like " &
Chr(34) & Valore & Chr(34)
                        End If
                    End If
                    If Tipo = "data" Then
                        filtro = filtro & " and " & cmb.Tag & "=#" &
Mid(Valore, 4, 3) & Left(Valore, 3) & Mid(Valore, 7, 4) & "#"
                    End If
                    If Tipo = "numerico" Then
                        filtro = filtro & " and " & cmb.Tag & "=" & Valore
                    End If
                    If Tipo = "errore" Then
                        MsgBox "questa applicazione ha provocato un errore
inaudito e verrà inesorabilmente terminata", vbCritical + vbOKOnly, "SEI
NELLA MERDA"
                        DoCmd.Quit
                    End If
                End If
            End If
        Next
        If Len(filtro) > 5 Then
            filtro = Right(filtro, Len(filtro) - 5)
        End If
        For Each cmb In Mask
            If cmb.ControlType = acComboBox And IsNull(cmb.Tag) = False And
cmb.Tag <> "" Then
                If filtro = "" Then
                    cmb.RowSource = "select distinct " & cmb.Tag & " from "
& Mask.RecordSource & ";"
                Else
                    cmb.RowSource = "select distinct " & cmb.Tag & " from "
& Mask.RecordSource & " where " & filtro & ";"
                End If
            End If
        Next
        Mask.FilterOn = False
        Mask.Filter = filtro
        Mask.FilterOn = True
End Sub
Private Function FindField(Lui As String) As String
        Dim tbl As TableDef
        Dim fld As dao.field
        Dim prp As Variant
        For Each tbl In CurrentDb.TableDefs
            For Each fld In tbl.Fields
                If fld.Name = Lui Then
                    Select Case fld.Type
                        Case dbDate
                            MsgBox "data"
                            FindField = "data"
                        Case dbText
                            MsgBox "testo"
                            FindField = "testo"
                        Case dbInteger, dbLong, dbByte, dbFloat, dbSingle,
dbDouble, dbBigInt, dbBinary, dbBoolean, dbCurrency, dbDecimal, dbNumeric
                            MsgBox "numerico"
                            FindField = "numerico"
                        Case Else
                            MsgBox "errore"
                            FindField = "errore"
                    End Select
                End If
            Next
        Next
End Function

 ha scritto nel messaggio
news:ah8rq4$h76$1...@newsreader.mailgate.org...

In Access gli eventi non vengono associati automaticamente ai controlli.
per cui o li imposti manualmente sulle maschere o lo fai fare alla classe
che gestisce gli eventi
NEL MODULO DI CLASSE : nome "clsEventTXT"
Dim TBox as TextBox
Property Set TxtBox_Form (TxtB as TextBox)
    Set TBox =TxtB
    Me.TBox.OnClick="[Event Procedure]"
End Property
Private Sub TB_OnClick()
    msgbox "...."
    .....
End Sub
NELLA FORM
Dim ClsE as clsEventTXT
Private sub Form_Open()
    Set clsE=new clsEventTXT
    Set mc.TxtBox_Form=Me.txtbox
end sub
cosi dovrebbe funzionare.....
ciao.
--
e` inutile versare ruhm...
nu strunz nun addiventa babba'

 cosi dovrebbe funzionare.....
non funziona    :-(

 ha scritto nel messaggio
news:ah96er$qui$1...@newsreader.mailgate.org...

mi pare strano..... ho la stessa cosa in un programma e funziona..... forse
ho dimenticato qualcosa.... se vuoi manda il sorgente o il file
ciao.


'modulo (non di classe)
Private Sub filtra(FormName As String)
'questa funzione serve per implementare funzioni di filtro associativo
'per mezzo di combo box non associate su una maschera, la funzione và
chiamata
'all'evento Load della maschera e a ogni evento AfterUpdate delle combo
'
'Private Sub <nomecombo>_AfterUpdate()
'
'    filtra (Me.Name)
'
'End Sub
'
'limiti: non è importante settare il RowSource delle combo, ci pensa la
funzione
'richiamata all'avvio della maschera, l'importante è settare la proprietà
Tag delle
'combo CON IL NOME DEL CAMPO CHE SI DEVE FILTRARE.
'ATTENZIONE: il RecordSource della maschera contenente le combo può
contenere solo
'il nome di una query o tabella, se è impostato a una istruzione SQL
esplicità
'la funzione darà errori, INOLTRE IL NOME DEL CAMPO DEVE ESSERE UNIVOCO
'IN TUTTO IL DATABASE
'SI CONSIGLIA: nell'evento DblClick delle combo scrivere il seguente codice:
'
'Private Sub <nomecombo>_DblClick(Cancel As Integer)
'
'   Me.<nomecombo>.Text = ""
'   strDivisione = ""
'   Call filtra(Me.Name)
'
'End Sub
'
'
'____________________________________________________________
    Dim Mask As Form
    Dim cmb As Control
    Dim filtro As String
    Dim Tipo As String
    Dim Valore As String
    filtro = ""


 suggerimento?
cut
In VBA non e' necessario dichiarare gli eventi.
Bisogna che in modalità struttura tu selezioni il pulsante, ne apri le
proprieta' e scegli la scheda "Eventi", li' trovi l'evento "SuClick",
impostalo a "routine evento" e premi i tre puntini per visualizzare il
codice. Poi salva e riprova.
Sib
PS la prossima volta scrivi un subj piu' significativo


 ha scritto nel messaggio
news:ah8rq4$h76$1...@newsreader.mailgate.org...

Nella Form crea la routine evento con una rem e verrà richiamata quella
della classe MyButton
Ciao Giorgio
Private Sub cmdProva_Click()
    'Rem
End Sub

capito... grazie, era proprio quello che avrei voluto evitare    :)    a
quanto pare il modello a eventi di VBA è leggermente diverso da quello di
VB.
pazienza    ;)

 nessuno...    :)
Non e' per questo che non ti ha risposto nessuno, io ad esempio leggo "al
campione" le domande, quindi diverse mi sfuggono.

 ti interessa "=NomeFunzione()".
era il metodo che usavo prima, volevo passare a qualcosa che mi permettesse
maggiore flessibilità.

 ha scritto nel messaggio

Cosa c'e' di piu' flessibile di "impiccicare" una qualsiasi funzione dove ti
pare?
Sib
