Newsgroup: it.comp.appl.access
Titolo: Codice da avviare con maschere "leggere". (lunghetto)

Sembra che il codice nel modulo di una maschera appesantisca il
file .mdb, e perciò ho scritto in moduli autonomi il codice da
eseguire. Le Sub sono eventualmente chiamate da corrispondenti
Function, e queste attivate dall'evento relativo, mediante una
chiamata del tipo:
=fchiudi()
oppure
=finizio("mElenco";"bVai"),
cioè passando eventuali parametri tipo il nome della maschera,
dell'oggetto chiamante, di un valore da utilizzare.
Ora ho il problema di avviare codice alla pressione di un tasto,
verificando il tasto premuto. In un normale evento "Su tasto giu"
comincerei così:
If KeyCode = vbKeyReturn Then
...
e in un evento "Su pressione" farei
If KeyAscii = "A" Then
...
eccetera.
Una routine esterna però sembra non prendermi quel valore che sembra
perso, e non so come fare. O meglio: avevo provato la seguente
soluzione:
----- soluzione tentata ---------
L'evento "Su apertura" di una maschera mi carica i valori RowSource e
RecordSource per i diversi controlli, prendendoli dai corrispondenti
Tag. Pensavo di aggiungere la chiamata a una Sub che mi caricasse il
codice mediante alcune istruzioni come:
Sub caricacodice(masch)
    Dim frm As Form
    Dim MDL As Module
    DoCmd.OpenForm masch, acDesign
    Set frm = Forms(masch)
    frm.HasModule = True
    Set MDL = frm.Module
'
    stri = ""
    Select Case masch
        Case "mSettimana"
            stri = stri & "Sub percosa_KeyDown(KeyCode As Integer,
Shift As Integer)" & vbCrLf & _
                "    If KeyCode = vbKeyReturn Then" & vbCrLf & _
                "        Call correggi(Forms!mSettimana!cod)" & vbCrLf
& _
                "    End If" & vbCrLf & _
                "End Sub" & vbCrLf
            stri = stri & " <altro codice>
...
            MDL.InsertText stri
            DoCmd.Close acForm, masch, acSaveYes
    End Select
End Sub
--------fine soluzione tentata-------------
L'apertura funziona, i tasti danno l'effetto sperato e io sono quasi
felice.
Naturalmente, quando avvio la chiusura di una maschera, oltre a
ripulire i RecordSource e i RowSource, devo eliminare il modulo,
quindi, dopo l'istruzione:
    DoCmd.Close acForm, masch
devo anche scrivere qualcosa come:
    DoCmd.OpenForm masch, acDesign
    Forms(masch).HasModule = False
    DoCmd.Close acForm, masch, acSaveYes
A questo punto, però, mi esce un errore:
L'istruzione a "0x3006628e" faceva riferimento alla memoria a
"0x00000000". La memoria non poteva essere 'read'.
Ho provato a mettere quelle tre ultime istruzioni a parte, avviarle
dalla finestra Immediata, e hanno funzionato, mentre, se sono comprese
in una Sub chiamata col metodo prima descritto, ho quel problema, e le
maschere rimangono salvate col modulo.
Avevo pensato di non aprire la maschera, ma di crearne una copia, dove
caricare tutti i riferimenti e i codici, e cancellarla alla chiusura,
ma temo che appesantirei il db.
La presentazione è prolissa per una domanda stringata: qualcuno può
darmi un suggerimento?
E ringrazio fin d'ora.
Riccardo Baldinotti

 ha scritto nel 
messaggio 
news:4dab646e-8b28-4f99...@i12g2000prf.googlegroups.com...
Sembra che il codice nel modulo di una maschera appesantisca il
file .mdb, e perciň ho scritto in moduli autonomi il codice da
eseguire. Le Sub sono eventualmente chiamate da corrispondenti
Function, e queste attivate dall'evento relativo, mediante una
chiamata del tipo:
=fchiudi()
oppure
=finizio("mElenco";"bVai"),
cioč passando eventuali parametri tipo il nome della maschera,
dell'oggetto chiamante, di un valore da utilizzare.
Ora ho il problema di avviare codice alla pressione di un tasto,
verificando il tasto premuto. In un normale evento "Su tasto giu"
comincerei cosě:
If KeyCode = vbKeyReturn Then
...
e in un evento "Su pressione" farei
If KeyAscii = "A" Then
...
eccetera.
Una routine esterna perň sembra non prendermi quel valore che sembra


A questo punto, perň, mi esce un errore:
L'istruzione a "0x3006628e" faceva riferimento alla memoria a
"0x00000000". La memoria non poteva essere 'read'.
Ho provato a mettere quelle tre ultime istruzioni a parte, avviarle
dalla finestra Immediata, e hanno funzionato, mentre, se sono comprese
in una Sub chiamata col metodo prima descritto, ho quel problema, e le
maschere rimangono salvate col modulo.
Avevo pensato di non aprire la maschera, ma di crearne una copia, dove
caricare tutti i riferimenti e i codici, e cancellarla alla chiusura,
ma temo che appesantirei il db.
La presentazione č prolissa per una domanda stringata: qualcuno puň
darmi un suggerimento?
E ringrazio fin d'ora.
Riccardo Baldinotti
[risposta]
Hai considerato anche di assegnare al volo tutti gli eventi agli oggetti 
(magari salvati in una tabella), all'apertura della form?
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Mi scuso per il ritardo. Ecco, ho provato con qualcosa come:
    Call aprimaschera("mElNomi")
    stri = "if Keycode=vbkeyreturn then" & vbCrLf & _
        "   call faprinome()" & vbCrLf & _
        "end if"
(1)    Forms!mElNomi!cognome.KeyDown = stri
e ottengo l'errore
"Proprietà o metodo non supportati dall'oggetto"
al punto (1).
La Sub aprimaschera è quella che adopero per aprire le maschere.
Permette di aprire l'applicazione vedendo la sola maschera aperta in
quel momento,  secondo un consiglio trovato sul sito di Karl
Donaubauer.
La casella "cognome" è appunto quella in cui la pressione del tasto
invio deve avviare la routine.
Ciao.
Riccardo Baldinotti

 ha scritto nel 
messaggio 
news:0f8655a0-90e3-4f49...@o77g2000hsf.googlegroups.com...
Mi scuso per il ritardo. Ecco, ho provato con qualcosa come:
    Call aprimaschera("mElNomi")
    stri = "if Keycode=vbkeyreturn then" & vbCrLf & _
        "   call faprinome()" & vbCrLf & _
        "end if"
(1)    Forms!mElNomi!cognome.KeyDown = stri
e ottengo l'errore
"Proprietà o metodo non supportati dall'oggetto"
al punto (1).
La Sub aprimaschera è quella che adopero per aprire le maschere.
Permette di aprire l'applicazione vedendo la sola maschera aperta in
quel momento,  secondo un consiglio trovato sul sito di Karl
Donaubauer.
La casella "cognome" è appunto quella in cui la pressione del tasto
invio deve avviare la routine.
Ciao.
Riccardo Baldinotti
[risposta]
Non si capisce dove (evento) hai inserito quel codice; dovresti considerare 
la sequenza degli eventi all'apertura della form:
(dall'help Evento Activate)
...
Quando si apre una maschera per la prima volta, si verificano gli eventi 
elencati di seguito (nell'ordine indicato):
Open -> Load -> Resize -> Activate -> Current
...
Io prenderei in considerazione o il Resize o l'Activate per esser sicuro che 
hai a disposizione tutte le proprietà degli oggetti della form. Il Current 
no perché se devi gestire un evento sul record potrebbe essere troppo 
tardi...
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Ciao
Riccardo Baldinotti

 ha scritto nel 
messaggio 
news:ca721b63-4d11-4be9...@h11g2000prf.googlegroups.com...


Ciao
Riccardo Baldinotti
[risposta]
Mhmm...
Potresti cambiare "prospettiva"?
Visto che devi intercettare i tasti, utilizzi solo l'evento "su tasto giù" e 
intercetti il tasto premuto eseguendo la funzione/codice che vuoi.
Tieni presente che hai anche la possibilità di associare ad una combinazione 
di tasti l'esecuzione di codice (Macro AutoKeys)...
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Snafuz.
Riccardo Baldinotti

 intercetti il tasto premuto eseguendo la funzione/codice che vuoi.
Mi accorgo di avere lo stesso problema con l'evento "Su non in
elenco". La variabile Response, per evitare il messaggio di errore
quando è inserito un nome nuovo, funziona solo in una Routine evento,
e si ritorna al dilemma su come fare maschere senza un modulo.
Comincio a pensare che non sia gran ché come idea, visto che complica
alquanto la vita. Per cosa, poi? Per un mega di spazio risparmiato...

 Sergio MAZZA
Ciao
RB

 ha scritto nel 
messaggio 
news:75631da0-7974-4cd4...@8g2000hse.googlegroups.com...
Nei fumetti di Tex Willer si narrava di un rettile detto "gila", che
quando mordeva non mollava la presa nemmeno se gli tagliavi la testa.
Ora, non so se posso essere paragonato ad un tremendo gila o ad una
fastidiosissima mosca...
Ebbene, sono andato a vedermi la macro AutoKeys e credo di avere
trovato una soluzione, che riporto.
Premetto che il tasto <Invio> non mi risulta disponibile e perciň ho
deciso che i colleghi, per aprire una certa sottomaschera, useranno il
tasto <Ins>.
Cosě ho messo nella macro una condizione, cioč che una certa casella
sia abilitata, nel quale caso ho messo alla colonna Azione la voce
EseguiCodice, con cui chiamo la funzione =fApriNome() dove sono
scritte le operazioni da compiere.
Urrŕ! (e ancora grazie)
Ah! dimenticavo...
Nelle maschere con modulo, mettevo all'evento Pressione una Sub con
cui prendevo i tasti alfabetici digitati, e posizionavo il cursore al
primo record che coincideva. Per esempio, se l'utente premeva "B - A -
L" si trovava sul record di Baldinotti, premendo "M - A - Z" trovava
Mazza, poi premeva <Invio> (o <Ins>) e gli si apriva la maschera con i
dati del nome trovato. Immagino di dovervi rinunciare.
Ciao
RB
[risposta]
Attualmente non so' rispondere; non ho affrontato il problema in questo 
modo...
Ciao.
-- 
Sergio MAZZA