2009-09-22 16 views
9

Quindi, come posso passare un valore da un modulo all'altro? Ad esempio: l'utente seleziona un'organizzazione da un elenco e apre un modulo di viaggio che consente a un utente di immettere varie informazioni relative al viaggio. In un punto mi piacerebbe aggiungere un altro piccolo modulo in cui possono inserire le informazioni di contatto (solo un nome e un telefono per POC) dell'organizzazione che stanno visitando.MSAccess 2003 - VBA per il passaggio di un valore da un modulo all'altro

Quindi, quando quella maschera iniziale si apriva dalla schermata di selezione, ha due ID che sono semplicemente nascosti nelle caselle di testo (uno è il tripID e l'altro è l'OrgID), quindi come faccio a passare questi al secondo piccolo pop in alto in modo che le informazioni di contatto contengano gli ID relativi.

Grazie.

+0

è stato un po 'di tempo da quando ho lavorato con Access, ma puoi chiamare l'altro modulo, impostare le variabili a livello di modulo/modulo, quindi chiudere l'altro modulo? –

risposta

16

L'approccio migliore in questi casi è non ha tentato di passare un po 'di variabili . È troppo codice ed è inflessibile. Ad esempio, se è necessario passare due valori, cosa succede negli anni in cui tale requisito aumenta fino a 5 valori? Cercare di mantenere e superare tutta una serie di valori è troppo lavoro di programmazione.

Ricordare che ogni modulo in ms-access è in realtà un oggetto di classe che è possibile manipolare nel codice. Quindi, usa un approccio a oggetti qui e scopri che non solo scrivi meno codice, ma il tuo codice sarà più pulito, più modulare, non necessario per le vars globali, e il codice che scrivi può essere spesso riutilizzato tra diverse forme.

Ecco come:

In generale, quando una forma lancia un'altra forma nel 2 ° modulo nei moduli on-aperta evento (in realtà, si può anche utilizzare il più tardi l'evento sotto carico) si può raccogliere un riferimento all'oggetto modulo PRECEDENTE. In altre parole, puoi utilizzare un approccio ad oggetti qui.

A livello di modulo forme, per modulo dichiaro un oggetto form come:

Option Compare Database 
Option Explicit 
dim frmPrevious  as form 

Poi, nelle forme sotto carico evento, andiamo:

Set frmPrevious = Screen.ActiveForm 

Ora, qualsiasi codice nella nostra forma è possibile utilizzare GRATUITAMENTE codice, eventi, anche varibles dichiarati come pubblici da quella precedente nel codice.

Quindi, se si desidera forzare la scrittura di un disco del modulo precedente e ricaricare i dati.

frmPrevious.Refresh 

Se si desidera impostare il valore di ID, quindi andare:

frmPrevious!ID = some value 

E, si noti che si può anche dichiarare forma precedente come una variabile pubblica per quella forma, e quindi se voi due forme profondo, si potrebbe andare:

frmPrevious.frmPrevious!ID = some value 

Quindi, è sufficiente dichiarare una forma oggetto in ogni modulo di codice forme (o al timore che quelle in cui è necessario utilizzare i valori in codice). Quanto sopra significa che ogni codice ha un riferimento già fatto all'oggetto modulo precedente. Funzioni dichiarate come pubici in una forma diventerà un metodo per la forma, e possono essere eseguiti come:

frmPrevious.MyCustomRefresh 

o anche cose come un'opzione per forzare la forma precedente per generare e l'installazione di un numero di fattura:

frmPrevous.SetInvoice 

o frmPrevious.SetProjectStatusOn

Quindi non solo è possibile mischiare i valori ed i dati avanti e indietro, ma si può facilmente eseguire caratteristiche e funzioni che si genera nel codice del form prevous.

Infatti, come standard di codifica, la maggior parte delle mie forme ha una funzione pubblica chiamata MyRefresh.

Nota che la bellezza di questo approccio è che puoi leggere + usare + impostare valori da quella forma precedente. Ciò consente al tuo codice non solo di ricevere valori, ma anche di impostare valori in quella forma precedente. Quindi questo approccio è bidirezionale. È possibile mischiare dati e valori avanti e indietro tra i moduli. L'altro vantaggio qui NON è limitato alle sole variabili, ma puoi usare campi, valori di controllo (eventi, proprietà) ecc.

Questo approccio significa che gran parte del modulo precedente è ora a portata di mano.

Quindi non provare a passare un intero colpo di variabili. Passa un riferimento al modulo e hai un bel oggetto pronto a portata di mano e rende questo tipo di problema di codifica un gioco da ragazzi.

+1

grazie mille! apprezzo particolarmente la spiegazione; mi aiuta ad imparare! grazie Albert! – Justin

+0

L'approccio è molto interessante. Personalmente uso qualcosa di molto simile (almeno nello spirito) con un oggetto specifico che contiene la raccolta di tutte le finestre aperte e in cui le finestre sono dichiarate come esempi di moduli. Questo mi consente di avere una serie di metodi e proprietà specifici per le finestre, oltre ai metodi e alle proprietà dei moduli standard. –

+1

Questo è fantastico, ma solo una nota. Non penso che funzioni per ottenere un riferimento a una sottomaschera attiva. Il riferimento sarà sempre al modulo principale. – HK1

6

Il modo usuale sarebbe fare riferimento alle caselle di testo nella forma iniziale dalla forma a finestra, in questo modo:

Forms!frmInitialForm!tripID 
Forms!frmInitialForm!OrgID 

Tuttavia, questo si lega strettamente la forma a finestra alla forma iniziale, in modo che non possa essere utilizzato altrove nell'applicazione.

Un approccio migliore è quello di utilizzare OpenArgs:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID 

Questo pone i vostri due valori in una stringa, che viene passato alla forma a finestra. È quindi possibile analizzare i due valori fuori da OpenArgs utilizzando la funzione Dividi.

Per ulteriori informazioni su passaggio di parametri utilizzando OpenArgs, si veda: http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

+0

grazie! grazie anche per la risorsa! – Justin

Problemi correlati