Newsgroup: it.comp.appl.access
Titolo: lista controlli form database esterno

Ho un problema che non riesco a risolvere:
vorrei poter via codice aprire un mdb esterno, sfogliare le form di
quel mdb e fare l'elenco dei controlli che ci sono in ognuna.
Ho provato a cercare in tutti i siti che si occupano di Access e fatto
delle ricerche nei NGs.
Ho provato con i vari oggetti DAO database e di lì con l'insieme
containers ma non c'è alcuna proprietà che consenta l'accesso ai
controlli.
Ho provato a creare un oggetto Access.Application e agire tramite
automazione COM, non riesco a trovare la strada giusta.
Ho provato ad usare la tabella nascosta MsSysObjects, niente.
L'oggetto CodeProject consente l'accesso all'insieme AllForms che però
non ha la proprietà Controls.
C'è qualcuno che può indirizzarmi sulla giusta strada ?
Grazie...

 ha scritto nel messaggio 
news:3a71b4da-8220-4594...@l62g2000hse.googlegroups.com...







Grazie...
-------------------------------
Prova a mettere il db secondario tra i riferimenti...poi agisci come se 
fosse in locale.
Ciao, Carlo


Secondo me sbagli... qualche cosa...!
L'insieme Forms fa parte dell'Oggetto Application.
Se non sono fuori allenamento... prova questo:
Dim ctl as Access.Control
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase "Percorso del tuo DB"
For Each ctl in appAccess.Forms("NomeForm").Controls
     Debug.Print ctl.Name
Next
Ciao
@Alex


Funziona!
Non so cosa sbagliassi ma avevo già tentato questa strada, l'unica
cosa è che provavo in modalità interruzione esplorando gli oggetti e
le proprietà da finestra immediata.
Grazie amico.
AleC

 ha scritto nel messaggionews:3a71b4da-8220-4594...@l62g2000hse.googlegroups.com...

Aggiungendolo ai riferimenti riesco a vedere solo i moduli (degli
oggetti, di classe o meno) le variabili e le routines (anche le
costanti) ma non maschere report ecc., in pratica lo tratta come una
libreria esterna di cui usare le varie funzioni.
Salvo che non mi sfugga qualcosa.
Il codice di Alessandro Baraldi comunque funziona perfettamente.
Grazie
AleC
AleC


Non funziona :(
Al primo tentativo sembrava funzionasse perché aprendo il db veniva
aperta la maschera denominata frmMain, quindi nel tuo codice
sostituivo semplicemente fra virgolette il nome della maschera che
prima mi veniva in mente che per lìappunto era quella aperta. Ma come
è noto l'insieme Forms restituisce solo le maschere caricate visibili
o meno.
Siccome ho nidificato due For each il primo che cicla le maschere e il
secondo i controlli appena il primo For Each incontra una maschera non
aperta va in errore.
Ecco perché a me non funzionava.
Qualche idea ?
AleC

 Ciao, Carlo
Aggiungendolo ai riferimenti riesco a vedere solo i moduli (degli
oggetti, di classe o meno) le variabili e le routines (anche le
costanti) ma non maschere report ecc., in pratica lo tratta come una
libreria esterna di cui usare le varie funzioni.
Salvo che non mi sfugga qualcosa.
Il codice di Alessandro Baraldi comunque funziona perfettamente.
Grazie
AleC
--------Risposta-------------
E' necessario che le maschere siano aperte...
Ritorniamo al mio esempio: aggiungi tra i riferimenti il db che ti interessa 
esplorare.
In questo db (il db referenziato) scrivi un codice che somiglia a questo:
Public Function ApriMaschereElencaControlli()
DoCmd.SetWarnings False
DoCmd.RunSQL "Delete * from TblNomiControlli;"
DoCmd.SetWarnings True
Dim rcs As Recordset
Dim ctl As Access.Control
Dim F As Object
Set rcs = CurrentDb.OpenRecordset("TblNomiControlli")
For Each F In Application.CodeProject.AllForms
     DoCmd.OpenForm F.Name, , , , , acHidden
     For Each ctl In Forms(F.Name).Controls
     With rcs
     .AddNew
     !NomeMaschera = F.Name
     !NomeControllo = ctl.Name
     .Update
     End With
     Next
DoCmd.Close acForm, F.Name
Next
rcs.Close
Set rcs = Nothing
End Function
Sempre a questo db aggiungi una tabella (TblNomiControlli) con due campi:
NomeMaschera  Testo 255
NomeControllo   Testo 255
Salva e chiudi il db.
Ora apri il principale e allega la tabella "TblNomiControlli" dal secondo 
db.
A questo punto se chiami la funzione "ApriMaschereElencaControlli" con:
Call ApriMaschereElencaControlli
da qualsiasi parte del db principale, le tabella si popolerà con tutti i 
nomi dei controlli e ci fai quello che vuoi.
In pratica ho fatto il percorso inverso: ho aperto le maschere in modo 
nascosto sfruttanto l'elenco di AllForms e poi ho elencato i controlli e 
infine ho chiuso le Forms.
Mi interessava mostrare come si possano elencare anche le maschere chiuse 
con AllForms ma si poteva benissimo aprire una query del genere evitando 
gran parte del codice:
SELECT MSysObjects.Name
FROM MSysObjects
WHERE (((MSysObjects.Type)=-32768));
Ciao, Carlo 


Valgono sempre le considerazioni di Carlo... vale a dire che puoi
accedere agli Oggetti solo se apri le Form... di cui come ti ha
suggerito Carlo puoi ottenere l'elenco con la stringa SQL sulla
Tabella di sistema.
A quel punto usi il metodo Docmd.OpenForm sull'Oggetto Application in
questione per aprire la Form ed a quel punto cicli gli Oggetti
interni.
@Alex


Funziona tutto, l'unica cosa che ho modificato (a parte gli ovvi
adattamenti ai miei db) è che le form le apro in modalità
Visualizzazione struttura (acDesign) perché se le maschere contengono
del codice in aprtura oppure gli si passa qualcosa in OpenArgs è
facile che si blocchi tutto.
E' una bella trovata quella del codice "cavallo di troia" che si trova
nel db remoto e lo si attiva da quello locale.
Sbizzarrendosi si potrebbe tale codice inserirlo in automatico in un
modulo del db remoto e poi cancellarlo al termine dell'operazione.
Ciao e grazie mille.
AleC


Si blocca tutto perchè nello sviluppo non hai previsto la possibilità
di non avere valorizzato il parametro... cosa che mi pare da valutare
in quanto se avessi un MDE saresti a piedi...
@Alex

 ha scritto
cut
...
Funziona tutto, l'unica cosa che ho modificato (a parte gli ovvi
adattamenti ai miei db) è che le form le apro in modalità
Visualizzazione struttura (acDesign) perché se le maschere contengono
del codice in aprtura oppure gli si passa qualcosa in OpenArgs è
facile che si blocchi tutto.
----risposta------
Hai fatto bene. Ma occhio anche ai suggerimenti di Alex.
--------------
E' una bella trovata quella del codice "cavallo di troia" che si trova
nel db remoto e lo si attiva da quello locale.
Sbizzarrendosi si potrebbe tale codice inserirlo in automatico in un
modulo del db remoto e poi cancellarlo al termine dell'operazione.
------------risposta--------------
Tutto dipende da chi scrive il codice e dal tipo di database.
Se si tratta di un mde...puoi fare ben poco.
Poi non si tratta di un "cavallo di troia" ma di una vera e propria sinergia 
e dialogo tra due db.
Una domanda: ma a cosa ti serve tutto sto ambaradan?
Ciao e grazie mille.
AleC
.................................
Prego.
Ciao, Carlo

 - Mostra testo citato -
La soluzione di Carlo funziona ma funziona anche quella di creare un
oggetto Access.Application
Sub provaautomazione()
Dim ctl As Access.Control
Dim frm As Variant
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase "C:\miodb.mdb"
For Each frm In appAccess.CurrentProject.AllForms
  appAccess.DoCmd.OpenForm frm.Name, acDesign, , , , acHidden
  For Each ctl In appAccess.Forms(frm.Name).Controls
     Debug.Print ctl.Name
  Next
  appAccess.DoCmd.Close acForm, frm.Name
Next
Set frm = Nothing: Set ctl = Nothing: Set appAccess = Nothing
End Sub
L'unica variazione rispetto al tuo codice è che l'insieme AllForms
deve essere recuperato da un altro oggetto diverso da Application e le
maschere devono essere aperte in Visualizzazione struttura perché in
caso di codice che viene eseguito in apertura (o passaggio di valori
in OpenArgs) potrebbe bloccarsi tutto.
L'unica controindicazione che non so se ci siano dei rimedi è che
l'applicazione viene aperta con esecuzione di tutto il codice previsto
durante il suo normale avvio (opzioni di avvio, autoexec eccetera).
Grazie comunque
AleC

 - Mostra testo citato -
Di solito la prevedo :))))
Comunque per esempio un errore incontrato è stato quando in apertura
della maschera fa delle operazioni su una tabella che però non trova
perché la cerca sul db locale.
AleC

 ha scritto
cut
L'unica variazione rispetto al tuo codice è che l'insieme AllForms
deve essere recuperato da un altro oggetto diverso da Application e le
...
 mi permetto un piccolo inserimento...
la differenza non è l'altro oggetto che è pure una differenza, ma sta nel 
fatto che con AllForms puoi leggere il nome di tutte le maschere e non solo 
di quelle aperte.
Prima avevi bisogno di trovare la maschera aperta per leggere il contenuto.
Ripeto, il codice ha una validità didattica e operativa anche perchè puoi 
leggere l'elenco delle maschere in altro modo.
L'importante è che hai risolto.
Aspetto sempre di sapere a cosa ti serve tutto ciò.
Ciao, Carlo 

 Ciao, Carlo
Poiché sto implementando un sistema di accessi a privilegi agli
applicativi che intenderei basato sull'abilitazione dei pulsanti di
ogni maschera a seconda dell'utente collegato.
Intendo centralizzare il database della sicurezza in modo da avere una
tabelle uniche degli utenti degli oggetti e dei privilegi. Mi piaceva
poter avere del codice che in maniera automatica potesse recuperare su
un db o su tanti o su tutti i pulsanti presenti in tutte le form.
AleC

 Ciao, Carlo
Il motivo è postato sempre in questo thread in risposta alla tua prima
domanda.
Ciao
AleC

 Ciao, Carlo
Il motivo č postato sempre in questo thread in risposta alla tua prima
domanda.
Ciao
AleC
Sě ho visto.
Ciao, Carlo