2009-09-22 8 views
9

Wie kann ich einen Wert von einem Formular an ein anderes übergeben? Zum Beispiel: Der Benutzer wählt eine Organisation aus einer Liste aus und dies öffnet ein Reiseformular, das es einem Benutzer ermöglicht, verschiedene Informationen bezüglich der Reise einzugeben. An einer Stelle möchte ich ein weiteres kleines Pop-up-Formular hinzufügen, wo sie Kontaktdaten (nur ein Name und Telefon für POC) der Organisation, die sie besuchen, eingeben können.MSAccess 2003 - VBA zum Übergeben eines Werts von einem Formular in ein anderes

Also, wenn dieses erste Formular vom Selektionsbildschirm geöffnet wurde, hat es zwei IDs, die einfach in Textfeldern versteckt sind (eines ist die tripID und das andere ist die OrgID), also wie gebe ich diese an das zweite kleine Pop Formular auf, so dass die Kontaktinformationen die relativen IDs haben.

Danke.

+0

Es ist eine Weile her, seit ich mit Access gearbeitet habe, aber können Sie das andere Formular aufrufen, Variablen auf Modulebene/Formularebene festlegen und dann das andere Formular schließen? –

Antwort

16

Der beste Ansatz ist in diesen Fällen nicht versucht helfen, könnte eine Reihe von Variablen zu übergeben . Es ist zu viel Code und unflexibel. Wenn Sie beispielsweise zwei Werte übergeben müssen, was passiert im Laufe der Jahre, wenn diese Anforderung auf 5 Werte ansteigt? Der Versuch, eine ganze Reihe von Werten zu erhalten und weiterzugeben, ist zu viel Programmierarbeit.

Denken Sie daran, dass jedes Formular in ms-access wirklich ein Klassenobjekt ist, das Sie im Code manipulieren können. Verwenden Sie also hier einen Objektansatz und Sie werden feststellen, dass Sie nicht nur weniger Code schreiben, sondern Ihr Code wird sauberer, modularer, benötigt keine globalen Variablen mehr und der von Ihnen geschriebene Code kann oft zwischen verschiedenen Formularen wiederverwendet werden.

Hier ist, wie:

Im Allgemeinen, wenn eine Form eines andere Form in der zweiten Form startet in den Formen auf offenes Ereignisse (in der Tat, Sie können sogar so spät wie das On-Load-Ereignis verwenden) können Sie Nehmen Sie einen Verweis auf das vorherige Formularobjekt auf. Mit anderen Worten, Sie können hier einen Objektansatz verwenden.

Am Formen Modulebene, für Form I ein Formular-Objekt deklarieren:

Option Compare Database 
Option Explicit 
dim frmPrevious  as form 

Dann in den Formen auf Last Ereignis, wir gehen:

Set frmPrevious = Screen.ActiveForm 

nun jeder Code In unserem Formular können Sie FREI, Code, Ereignisse, sogar Variablen verwenden, die aus diesem vorherigen Formular im Code als öffentlich deklariert wurden.

Also, wenn Sie eine Festplatte schreiben des vorherigen Formulars erzwingen möchten, und Daten erneut laden.

frmPrevious.Refresh 

Wenn Sie die ID-Wert festlegen möchten, dann gehen Sie:

frmPrevious!ID = some value 

Und beachten Sie, dass Sie auch Form vorherigen als öffentliche Variable für diese Form erklären können, und damit, wenn Sie zwei Formen gehen tief, könnten Sie:

frmPrevious.frmPrevious!ID = some value 

So einfach erklären ein Formen in jeder Form Code-Modul-Objekt (oder zumin damit diejenigen, in denen Sie Werte im Code verwenden). Das bedeutet, dass jeder Code einen referenzierten Verweis auf das vorherige Formularobjekt enthält.

frmPrevious.MyCustomRefresh 

oder sogar wie eine Option Dinge die vorherige Form zu zwingen, eine Rechnungsnummer zu generieren und Setup: Funktionen deklariert als Scham in einer Form ein Verfahren zur Herstellung der Form werden wird, und kann wie ausgeführt werden

frmPrevous.SetInvoice 

oder frmPrevious.SetProjectStatusOn

nur also nicht, können Sie mischen Werte und Daten hin und her, aber Sie können leicht Features und Funktionen ausführen, die Sie im Code für die prevous Form aufzubauen.

In der Tat als ein Kodierungsstandard haben die meisten meiner Formen eine Schamfunktion namens MyRefresh.

Beachten Sie, dass die Schönheit dieses Ansatzes darin besteht, dass Sie + usage + set-Werte aus diesem vorherigen Formular lesen können. Dadurch kann Ihr Code nicht nur Werte empfangen, sondern auch Werte in diesem vorherigen Formular festlegen. Dieser Ansatz ist also bidirektional. Sie können Daten und Werte zwischen den Formularen hin- und herschieben. Der andere Vorteil hier ist, dass Sie NICHT nur auf Variablen beschränkt sind, sondern auch Felder, Kontrollwerte (Ereignisse, Eigenschaften) usw. verwenden können.

Dieser Ansatz bedeutet, dass Sie jetzt viel von der vorherigen Form zur Hand haben.

Versuchen Sie also nicht, eine ganze Reihe von Variablen zu übergeben. Übergeben Sie einen Verweis auf das Formular und Sie haben ein schönes fertiges Objekt zur Hand, das diese Art von Codierungsproblemen zum Kinderspiel macht.

+1

vielen Dank! Ich schätze besonders die Erklärung; hilft mir beim Lernen! Danke Albert! – Justin

+0

Der Ansatz ist sehr interessant. Persönlich verwende ich etwas ganz ähnliches (zumindest im Geiste) mit einem bestimmten Objekt, das die Sammlung aller geöffneten Fenster enthält, und wo Fenster als Instanzen von Formen deklariert werden. Dies erlaubt mir, eine Reihe von spezifischen "Fenster" -Methoden und -Eigenschaften zusätzlich zu den Standardformularmethoden und -eigenschaften zu haben. –

+1

Das ist großartig, aber nur eine Anmerkung. Ich glaube nicht, dass dies funktioniert, um einen Verweis auf eine aktive Teilmaske zu erhalten. Die Referenz bezieht sich immer auf das Hauptformular. – HK1

6

Der übliche Weg wäre es, die Textfelder in der ursprünglichen Form aus dem Popup-Formular zu verweisen, wie folgt aus:

Forms!frmInitialForm!tripID 
Forms!frmInitialForm!OrgID 

Dies ist jedoch fest bindet das Popup-Formular an die ursprüngliche Form, so dass es nicht sein kann, irgendwo anders in der Anwendung verwendet.

Ein besserer Ansatz ist OpenArgs zu verwenden:

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

Dies stellt Ihre beiden Werte in eine Zeichenfolge, die das Popup-Formular übergeben wird. Sie können dann die zwei Werte aus den OpenArgs mithilfe der Split-Funktion analysieren.

Für weitere Informationen über Parameter mit OpenArgs vorbei finden Sie unter: http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

+0

danke! Danke auch für die Ressource! – Justin

Verwandte Themen