2010-12-29 9 views
6

Ho un modulo (FORM-A) che richiede all'utente di selezionare un veicolo. L'utente dovrebbe fare clic su un pulsante su FORM-A che dice selezionare il veicolo. Un modulo di selezione (FORM-B) dovrebbe essere aperto dove l'utente può selezionare un veicolo. Il valore selezionato deve essere comunicato a FORM-A.Accesso MS: in che modo i moduli comunicano valori tra loro?

Come si compirebbe questo in MS Access 2010?

FORM-B è una forma continua che contiene un'immagine del veicolo e alcune altre informazioni.

+0

Perché avete predeterminato che una forma a finestra è il modo giusto per fare questo? Perché non un elenco a discesa sul modulo principale? –

+0

Ammetto che questo è ciò che inizialmente ho fatto, ma in seguito volevo includere un'immagine del veicolo nel processo di selezione. A meno che non ci sia un controllo per la selezione delle liste che può farlo, sono bloccato con una sottomaschera o un popup. Il popup fa sentire l'utente come se la selezione fosse certa, mentre la sottomaschera (forma continua) fa dubitare all'utente che la selezione sia realmente avvenuta. – cmaduro

risposta

11

Da quello che ho capito dalla tua domanda, vuoi che formB apra una sorta di pop-up. Quando il pop-up è chiuso, il suo risultato viene messo in qualche parte nel modulo di chiamata.
Soluzione proposta:
a) aprire il modulo B usando la sintassi docmd.openform "formB", windowmode:=acDialog.
Ciò impedirà l'esecuzione delle righe successive finché il moduloB non viene chiuso o nascosto.
b) nel pulsante OK di FormB, è sufficiente nascondere il modulo, non chiuderlo.
c) quando il codice riprende in forma, è ora possibile

  1. controllo se formB è ancora aperto. In caso contrario, è stato annullato
  2. leggere il valore in formB nascoste (ancora aperta), quindi chiudere formB

In caso contrario, si potrebbe anche avere formB per aggiornare un controllo in forma prima della chiusura. Ma questo approccio non mi piace perché formB non è riutilizzabile e crea una dipendenza non necessaria tra formB e formA.

+1

Se devi avere la finestra di dialogo separata - questo suona come il modo di andare da me. –

+1

Trasforma questo tipo di cose in una funzione che può essere chiamata in tutta l'applicazione. Puoi fare in modo che la funzione restituisca un complesso insieme di valori dichiarando un tipo, con ciascuno dei campi in cui vuoi tornare. Lasciare uno chiamato "valido" come booleano che può dire se ha funzionato o è stato cancellato da – akc42

+1

Questa è un'ottima soluzione per un sistema limitato. Ho passato in passato (usando Me.OpenArgs) il nome del modulo chiamante e un campo nascosto sul modulo chiamante per memorizzare il valore restituito ma mantenendo il modulo aperto e cambiando lo stato visibile su false fa sì che anche il codice chiamante del modulo continui come se la finestra di dialogo era chiusa, questo è MOLTO più semplice! :) Grazie +1 – GazB

0

Non sono sicuro del motivo per cui avresti bisogno di un modulo separato per questo: basta che la prima casella di testo sia un elenco di tutti i record dei veicoli nel database, dove ne selezioni uno e il resto delle informazioni sul veicolo sia compilato automaticamente dalla tabella del veicolo, ma non copiato nella tabella principale. Naturalmente, non sono sicuro nemmeno della struttura del tuo tavolo, quindi potrebbe esserci una ragione per questo metodo che non mi è chiaro.

I vantaggi del metodo di cui sopra è che se si aggiungono più veicoli, la tua casella di selezione viene aggiornato automaticamente - e mantenere i moduli bisogna caricare al minimo (sempre una buona prestazione mossa)

0

Puoi crea un'istanza di formB all'interno di formA e controllala. Di seguito è riportato il codice VBA per formA. Quando si fa clic su un pulsante su formA, si crea una nuova istanza di formB e si concentra su esso. Allo stesso tempo, puoi impostare le proprietà per i suoi controlli. Puoi utilizzare questo approccio per impostare la giusta immagine nel tuo controllo sul modulo B. Spero che questo aiuti.

Esempio:

Option Compare Database 

Dim fB As Form_FormB 

Private Sub btnA_Click() 
    Set fB = New Form_FormB 
    fB.SetFocus 
    fB.tbxB.Text = "Some text sent from A to B!" 
End Sub 

Se si desidera entrambe le forme siano visibili per tutto il tempo, io suggerisco di usare una sottomaschera con la lista di tutti i veicoli o solo dettagli per quella che l'utente ha selezionato.

0

È possibile fare riferimento in questo modo ai moduli! FormName! ControlName. Una volta visto come funziona, sarai in grado di prenderlo in giro per farlo funzionare con la tua configurazione esistente. Usiamo 3 controlli una casella di testo su Form-A, un'immagine su Form-B e una casella di testo su Form-B. La casella di testo su Form-A sarà denominata txtVehicle, l'immagine su Form-B sarà denominata imgVehicle e la casella di testo su Form-B sarà denominata txtVehicleName. È possibile impostare il nome di un controllo all'interno delle proprietà. Quando si fa clic su imgVehicle, il valore verrà txtVehicleName in txtVehicle.

Dovrai fare una piccola codifica - è facile anche se non l'hai mai fatto prima. Sotto le proprietà per l'immagine vedrai gli eventi. Se si fa clic sull'evento "On Click", si otterrà un elenco a discesa. Una delle scelte sarà [Procedura evento] - scegli quella. Alla fine della riga comparirà anche un piccolo bottone con 3 punti. Fare clic e si dovrebbe essere portato a una finestra di codice con un codice come questo in esso.

Private Sub imgVehicle_Click() 

End Sub 

Qui è dove si inserisce il codice. Qualcosa del genere dovrebbe funzionare. Questo è nella sua forma più semplice.

Private Sub imgVehicle_Click() 
    Forms!Form-A!txtVehicle=forms!Form-B!txtVehicleName 
End Sub 

Ora anche se funzionerà, ci sono alcune cose che dovremmo fare in questo metodo che non siamo. Dovremmo fare riferimento al modulo B direttamente dal momento che ci siamo dentro, dovremmo verificare che il modulo A sia effettivamente aperto.

Private Sub imgVehicle_Click() 
    If currentproject.allforms(“Form-A”).isloaded then 
      Forms!Form-A!txtVehicle=me!txtVehicleName 
    End if 
End Sub 

Speranza che aiuta

+0

Questo non funziona, in quanto solo gli elementi focalizzati possono essere referenziati. –

+0

Focus non è necessario per fare riferimento a un elemento o un modulo. I moduli devono essere aperti, ma non è nemmeno necessario che siano visibili. Le sottomasche devono essere referenziate esplicitamente come descritto sopra. Ci sono alcune proprietà che sono disponibili solo con lo stato attivo, come la proprietà text su una casella di testo, ma sono in minoranza. – Praesagus

+0

perché questa risposta è stata downvoted? – Praesagus

Problemi correlati