Newsgroup: it.comp.appl.access
Titolo: Ricavare nome maschera

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

 Set mask = Screen.ActiveForm
Set mask = 
Screen.ActiveForm.name
MAssimiliano

 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

 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

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

 Bruno


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

 Ciao;)


 dell'oggetto Screen.
De gustibus, mai usato neanche quello.
Cosa potrň aver usato?
Bruno

 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


 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

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

 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

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

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