nelle funziona definita c'è un tratto cosi:
Dim mask As Form
Set mask = Screen.ActiveForm
.................
.................
Se dalla maschera che carico al Form_Load() mando questa funzione, mi da
errore dicendomi che il nome immesso deve essere quello della maschera
attiva
Se invece utilizzo un sistema che attende 1 secondo dopo l'aperture allora
funziona O_o
Sono sicuro che c'è un altro metodo..qualcno mi puo aiutare?
Grazie ;)
P.S. Ho letto (io non sono molto pratico di VBA..sono un 'apprendista') che
se utilizo un modulo di classe posso utilizzare "Me."..ho provato ma col
modulo di classe come faccio a richiamare una funzione?..ho detto
castronerie vero?...:D ciao
MAssimiliano
Dim mask As Form
Set mask = Forms(0)
Nome_Tab = mask.Name
MsgBox (Nome_Tab)
il problema è se ho 2 maschere aperte, ed uso screen.active questo comando
mandato all'atto del form_load non funziona perche probabilmente fa il
controllo prima ancora che la maschera sia attiva, e se metto onActivate non
funziona lo stesso!!
Qualche dritta? se potessi utilizzare "Me." nel modulo risolverei
nell'immediato...ma non si puo!
Ciao
Il nome della Form attiva è Me.Name
> Se invece utilizzo un sistema che attende 1 secondo dopo l'aperture allora
> funziona O_o
> Sono sicuro che c'è un altro metodo..qualcno mi puo aiutare?
Prova a sostituire il tuo "temporizzatore" con DoEvents
> Grazie ;)
> P.S. Ho letto (io non sono molto pratico di VBA..sono un 'apprendista')
che
> se utilizo un modulo di classe posso utilizzare "Me."..ho provato ma col
> modulo di classe come faccio a richiamare una funzione?..ho detto
> castronerie vero?...:D ciao
Classe o non classe (è dal 92 che pasticcio in Access e non mi
sono mai preoccupato di sapere di che si tratta) una funzione
definita Public in un modulo (quelli che appaiono in finestra database)
la chiami da ogni luogo con <variabile qualunque> = <nomefunzione>
ovvero MsgBox <nomefunzione>.
Un sub la chiami più semplicemente con <nomesub>.
Bruno
Copiato pedissequamente dall'help in linea:
Dim frmMascheraCorrente As Form
Set frmMascheraCorrente = Screen.ActiveForm
MsgBox "La maschera corrente è " & frmMascheraCorrente.Name
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
Beh, non è sempre esatto: non è sempre vero.
Se hai una maschera aperta e con un tasto funzione apri una maschera popup,
a fronte degli eventi "Su apertura" e "Su caricamento" risulta attiva la
maschera che lo era al momento che hai pigiato il tasto funzione; inoltre se
stai operando in una sub o funzione non contenuta nel modulo di classe della
maschera attiva, il Me non puoi usarlo.
Nel dubbio, a mio avviso è sempre meglio usare il metodo AcrtiveForm
dell'oggetto Screen.
[CUT]
>
> Bruno
Comunque ho risolto in una maniera un po....da contadino ;D (nell'attesa di
implementare una classe WithEvents)
Richiamo la funzione passandogli come variabile la stringa Me.Name
Quindi con la funzione faccio un for each e faccio il controllo dei nomi
degli ogetti...e ho risolto....un po dispendioso ma non ho altre soluzioni
per ora
Ciao;)
E' esatto il risultato che ti dà Access, come è esatta questa tua ultima
deduzione: d'altra parte devi ammettere che è intuitivo che una maschera per
essere attiva deve essere anche necessariamente essere aperta e quando
bazzichi negli evento Su apertura" e "Su caricamento" la maschera non ancora
aperta.
>
> Comunque ho risolto in una maniera un po....da contadino ;D (nell'attesa
di
> implementare una classe WithEvents)
> Richiamo la funzione passandogli come variabile la stringa Me.Name
> Quindi con la funzione faccio un for each e faccio il controllo dei nomi
> degli ogetti...e ho risolto....un po dispendioso ma non ho altre soluzioni
> per ora
Sono dell'avviso che in programmazione tutto ciò che dà il risutato voluto è
esatto; quanto poi al fatto che sia più o meno "sufisticato" il codice che
usi, stai tranquillo che l'utilizzatore finale non gliene può fregar di
meno, anche perché lui neppure lo vede. ;-)
>
> Ciao;)
> Beh, non č sempre esatto: non č sempre vero.
> Se hai una maschera aperta e con un tasto funzione apri una maschera
popup,
> a fronte degli eventi "Su apertura" e "Su caricamento" risulta attiva la
> maschera che lo era al momento che hai pigiato il tasto funzione;
Immagino sia cosě, non l'ho mai sperimentato, mai avendo usate
pop-up.
> inoltre se stai operando in una sub o funzione non contenuta nel modulo di
classe della
> maschera attiva, il Me non puoi usarlo.
> Nel dubbio, a mio avviso č sempre meglio usare il metodo AcrtiveForm
> dell'oggetto Screen.
De gustibus, mai usato neanche quello.
Cosa potrň aver usato?
Bruno
Penso Me, se non stavi lavorando in una Sub e/o Funzione pubbliche
(residenti in un modulo del database), nel qual caso per far riferimento
alla maschera dalla quale si è richiamata la Sub o la Funzione il modo
corretto è quello di usare la Proprietà CodeContextObject. Ad esempio se
vuoi impostare un recordset con il recordset clone della maschera da cui è
stata richiamata la Sub o la Funzione, in DAO potresti scrivere:
Set rst = CodeContextObject.RecordsetClone
Esatto, CodeContextObject.Name per restare in tema,
funziona sempre, da vicino e da lontano.
Ed è grazie a tale proprietà che non scrivo mai codice in
moduli di Form o Report.
Il tutto mi sta sempre in 3/4 moduli del database distinti
per categoria col vantaggio, secondo me, di far molto prima
ad aggiornarne il codice senza dover frugare in svariati
Form/Report.
Ciao
Bruno
> Mi piace questa cosa...qualcuno potrebbe spiegarmi in pochissime parole il
> concetto? Grazie ;)
Visto come hai quotato penso ti riferisca alle mie asserzioni.
Il cui succo è questo:
- scrivo in loco (Form, Report) il codice che si riferisce
agli eventi degli oggetti su cui sto lavorando, se strettamente
di loro pertinenza (dimensionamento della scheda OnOpen,
le più semplici operazioni di filtro, raramente il controllo di
input -- cerco il più possibile di definire tale controllo a livello
di tabella --, operazioni che debbo compiere Before|AfterUpdate,
OnClose, etc).
- scrivo in un modulo specifico dell'applicazione su cui sto
lavorando (Contabilità_v170, Trasport_ v45, etc) tutto il codice
che per essere utilizzato in più circostanze sulla scheda dovrei
scrivere in modulo di scheda. Quindi non ho moduli di scheda.
- scrivo in moduli più generali (Utilities_v201, SortRoutine_v10,
SortFilter_111, SelectFile_21) il codice che in genere mi trascino
dietro tutte le volte che creo un nuovo database (sono circa
6000 righe di codice) comprendente operazioni di filtro
effettuabili su più di due/tre campi, operazioni su array, controllo
collegamenti, copia di record, conversione date, ricerca record,
operazioni varie su stringhe e numeri, etc.
Niente di strano, mi sono abituato così da tempo e mi
trovo bene. Soprattutto trovo comodo il fatto, ai fini
dell'aggiornamento del codice, di averlo per il 70/80%
collocato in non più di 3/5 moduli.
Ciao
Bruno
Normalmente quando in un codice VBA si vuol fare riferimento alla maschera
nel cui modulo di classe è residente il codice VBA, normalmente si usa Me
(Me!MioControllo , Me.Filter ecc. ecc.). Se però il codice VBA è residente
in una Sub o in una Function residenti in moduli del database e NON in
moduli di classe, Me non può più essere usato.
A questo punto si hanno due possibilità: o passare alla Sub/Funzione il nome
della maschera da cui sono state richiamate oppure, molto più facilmente al
posto di Me si usa CodeContextObject (vedi help): quindi scriverai
CodeContextObject!MioControllo , CodeContextObject.Filter.
Il vantaggio di scrivere Sub e/o Funzioni da richiamare da più
Maschere/Queries/Report in moduli normali invece che in moduli di classe è
enorme: non è necessario copiare il codice sui vari moduli di classe
duplicandoli, sprecando quindi spazio.
Il fatto di massimizzare l'uso di Sub e Funzioni in moduli NON di classe
permette anche di creare un database che contiene solamente tutte le Sub e
Funzioni ricorrenti; quando in un nuovo datbase è necessario usare tali
funzioni e Sub non è necessario copiare nei suoi moduli tali Funzioni/Sub: è
sufficiente inserire nei riferimenti del nuovo datbase il nome del database
contenente solo le Sub e le Funzioni.
Grazie 1000 Roberto Bruno e MA, mi avete chiarito e risolto una barca di
problemi ;)