Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ricavare nome maschera

449 views
Skip to first unread message

Gdessi

unread,
Oct 7, 2004, 5:41:06 AM10/7/04
to
Salve a tutti.
Ho un problema che a prima vista sembra banale(e magari lo è :P)
Vorrei sapere come si ricava il nome della maschera attiva o appena aperta
senza ricorrere all'utilizzo dell'istruzione " Me."
questo perchè richiamo una funzione definita in un modulo.
Il problema che mi da è il seguente:

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


MA

unread,
Oct 7, 2004, 6:54:54 AM10/7/04
to

"Gdessi" <csfunders...@hotmaildot.com> ha scritto nel messaggio
news:Ua89d.21299$eb.1...@tornado.fastwebnet.it...

> Salve a tutti.
> Ho un problema che a prima vista sembra banale(e magari lo è :P)
> Vorrei sapere come si ricava il nome della maschera attiva o appena aperta
> senza ricorrere all'utilizzo dell'istruzione " Me."
> questo perchè richiamo una funzione definita in un modulo.
> Il problema che mi da è il seguente:
>
> nelle funziona definita c'è un tratto cosi:
>
> Dim mask As Form
> Set mask = Screen.ActiveForm
Set mask = Screen.ActiveForm.name


MAssimiliano


Gdessi

unread,
Oct 7, 2004, 7:47:44 AM10/7/04
to

"MA" <mas...@massimilianoamendola.it> ha scritto nel messaggio
news:Dg99d.23460$B06....@news.edisontel.com...
Grazie MAssimiliano , ma così mi da "errore: Tipo non corrispondente"
Probabilmente non mi sono spiegato bene!! Ci riprovo da qui :D
So come prendere il nome della maschera il codice funziona:

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


Bruno Campanini

unread,
Oct 7, 2004, 9:31:00 AM10/7/04
to
"Gdessi" <csfunders...@hotmaildot.com> wrote in message
news:Ua89d.21299$eb.1...@tornado.fastwebnet.it...

> Salve a tutti.
> Ho un problema che a prima vista sembra banale(e magari lo è :P)
> Vorrei sapere come si ricava il nome della maschera attiva o appena aperta
> senza ricorrere all'utilizzo dell'istruzione " Me."
> questo perchè richiamo una funzione definita in un modulo.
> Il problema che mi da è il seguente:
>
> 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

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


Roberto dalla campagna

unread,
Oct 7, 2004, 9:43:11 AM10/7/04
to

"Gdessi" <csfunders...@hotmaildot.com> ha scritto nel messaggio
news:Ua89d.21299$eb.1...@tornado.fastwebnet.it...

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
---------------------------------------------


Roberto dalla campagna

unread,
Oct 7, 2004, 10:00:39 AM10/7/04
to

"Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
news:oyb9d.3057$b5.1...@news3.tin.it...

> "Gdessi" <csfunders...@hotmaildot.com> wrote in message
> news:Ua89d.21299$eb.1...@tornado.fastwebnet.it...
> > Salve a tutti.
> > Ho un problema che a prima vista sembra banale(e magari lo è :P)
> > Vorrei sapere come si ricava il nome della maschera attiva o appena
aperta
> > senza ricorrere all'utilizzo dell'istruzione " Me."
> > questo perchè richiamo una funzione definita in un modulo.
> > Il problema che mi da è il seguente:
> >
> > 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
>
> Il nome della Form attiva è Me.Name

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

Gdessi

unread,
Oct 7, 2004, 10:58:24 AM10/7/04
to

"Roberto dalla campagna" <r.ma...@libero.it> ha scritto nel messaggio
news:PJb9d.28961$N45.7...@twister2.libero.it...
Ciao Roberto e grazie per l'interessamento.
Tutto giusto....ma non mi funziona.
La mia condizione(banalissima) è questa:
Maschera1 aperta, c'è un bottone.
click bottone per aprire un altra maschera, chiamiamola Maschera2.
Su Maschera2 all'evento Form_Load(), fa una chiamata ad una funzione che
esegue il codice che tu hai copiato pedissequamente dall'help in linea ;)
Bene, il risultato è Maschera1 O_o !!
Probabilmente è un codice che funziona solo con unamaschera aperta.
Infatti con 2 o piu maschere, bisogna attendere che si siano aperte tutte
per poter fare il controllo quindi nella sub Form_Load() non puo essere
utilizzato.

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;)


Roberto dalla campagna

unread,
Oct 7, 2004, 11:52:52 AM10/7/04
to

"Gdessi" <csfunders...@hotmaildot.com> ha scritto nel messaggio
news:mQc9d.23125$eb....@tornado.fastwebnet.it...

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;)

Bruno Campanini

unread,
Oct 7, 2004, 1:31:50 PM10/7/04
to
"Roberto dalla campagna" <r.ma...@libero.it> wrote in message
news:b_b9d.29532$H11.9...@twister1.libero.it...

>
> "Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
> news:oyb9d.3057$b5.1...@news3.tin.it...
> > Il nome della Form attiva č Me.Name

> 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


Roberto dalla campagna

unread,
Oct 8, 2004, 8:15:28 AM10/8/04
to

"Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
news:a4f9d.4139$b5.1...@news3.tin.it...

> "Roberto dalla campagna" <r.ma...@libero.it> wrote in message
> news:b_b9d.29532$H11.9...@twister1.libero.it...
> >
> > "Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
> > news:oyb9d.3057$b5.1...@news3.tin.it...
> > > Il nome della Form attiva è Me.Name
>
> > 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?

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

Bruno Campanini

unread,
Oct 8, 2004, 8:35:00 AM10/8/04
to
"Roberto dalla campagna" <r.ma...@libero.it> wrote in message
news:Axv9d.31288$H11.9...@twister1.libero.it...

>
> "Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
> news:a4f9d.4139$b5.1...@news3.tin.it...
> > De gustibus, mai usato neanche quello.
> > Cosa potrò aver usato?
>
> 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


Gdessi

unread,
Oct 8, 2004, 6:46:31 PM10/8/04
to

"Bruno Campanini" <bruno.XXX...@tin.it> ha scritto nel messaggio
news:UPv9d.92389$35.43...@news4.tin.it...
Mi piace questa cosa...qualcuno potrebbe spiegarmi in pochissime parole il
concetto? Grazie ;)


Bruno Campanini

unread,
Oct 9, 2004, 11:30:41 AM10/9/04
to
"Gdessi" <csfunders...@hotmaildot.com> wrote in message
news:cNE9d.25649$eb.1...@tornado.fastwebnet.it...

> 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


Roberto dalla campagna

unread,
Oct 9, 2004, 11:33:41 AM10/9/04
to

"Gdessi" <csfunders...@hotmaildot.com> ha scritto nel messaggio
news:cNE9d.25649$eb.1...@tornado.fastwebnet.it...

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.

Gdessi

unread,
Oct 9, 2004, 12:41:13 PM10/9/04
to

[CUT]

Grazie 1000 Roberto Bruno e MA, mi avete chiarito e risolto una barca di
problemi ;)

0 new messages