2009-09-22 10 views
9

Jak mogę przekazać wartość z jednego formularza do drugiego? Na przykład: użytkownik wybiera organizację z listy, a to otwiera formularz podróży, który pozwala użytkownikowi wprowadzić różne informacje dotyczące podróży. W jednym miejscu chciałbym dodać kolejny mały wyskakujący formularz, w którym można wprowadzić dane kontaktowe (tylko nazwisko i numer telefonu do POC) organizacji, którą odwiedzają.MSAccess 2003 - VBA do przekazywania wartości z jednego formularza do drugiego

Tak więc, kiedy ta początkowa forma została otwarta z ekranu wyboru, ma dwa identyfikatory, które są po prostu ukryte w polach tekstowych (jeden to identyfikator tripID, a drugi to identyfikator OrgID), więc w jaki sposób przekazać je do drugiego małego popu formularz, aby dane kontaktowe zawierały odpowiednie identyfikatory.

Dzięki.

+0

Minęło trochę czasu odkąd pracowałem z Access, ale czy możesz zadzwonić do innej formy, ustawić zmienne na poziomie modułu/formularza, a następnie zamknąć inny formularz? –

Odpowiedz

16

Najlepszym rozwiązaniem w takich przypadkach, aby nie próbowali przejść kilka zmiennych . Jest to zbyt wiele kodu i jest nieelastyczne. Na przykład, jeśli potrzebujesz przekazać dwie wartości, co dzieje się przez lata, gdy wymaganie to wzrasta do 5 wartości? Próba utrzymania i przekazania całego waloru wartości to za dużo pracy przy kodowaniu.

Należy pamiętać, że każda forma w ms-access to tak naprawdę obiekt klasy, którym można manipulować w kodzie. Tak więc, użyj podejścia obiektowego, a zobaczysz, że nie tylko piszesz mniej kodu, ale twój kod będzie bardziej czysty, bardziej modułowy, nie będzie potrzeby globalnych zmiennych, a kod, który napiszesz, często będzie ponownie wykorzystywany między różnymi formularzami.

Oto jak:

Na ogół, gdy jeden formularz uruchamia inną formę w 2 postaci w formach na otwartej imprezy (w rzeczywistości, można nawet użyć dopiero w przypadku obciążeniem) można odbierz odwołanie do PREVIOUS obiektu formularza. Innymi słowy, możesz tutaj zastosować podejście obiektowe.

na poziomie modułu formy, na formularzu zadeklarować obiekt formularza jako:

Option Compare Database 
Option Explicit 
dim frmPrevious  as form 

Następnie w formach obciążeniem zdarzeń, idziemy:

Set frmPrevious = Screen.ActiveForm 

Teraz każdy kod w naszym formularzu może WOLNO używać kodu, zdarzeń, a nawet zmiennych zadeklarowanych jako publiczne z poprzedniej formy w kodzie.

Tak więc, jeśli chcesz wymusić zapis dysku na poprzednim formularzu i ponownie załadować dane.

frmPrevious.Refresh 

Jeśli chcesz ustawić wartość ID, a następnie przejść:

frmPrevious!ID = some value 

I należy pamiętać, że można nawet zadeklarować forma poprzedniego jako PUBLIC zmiennej dla tej postaci, a więc jeśli wy dwie formy głęboko, można przejść:

frmPrevious.frmPrevious!ID = some value 

Więc po prostu zadeklarować formy sprzeciwu w każdym module kodu formy (lub zeby te, gdzie trzeba użyć wartości w kodzie). Powyższe oznacza, że ​​dowolny kod ma gotowe odniesienie do poprzedniego obiektu formularza. Funkcje zadeklarowane jako łonowe w formularzu staną się metoda formularza i można uruchamiać jak:

frmPrevious.MyCustomRefresh 

lub nawet rzeczy jak jakiś opcją wymuszenia poprzednią formę do generowania i konfiguracji numer faktury:

frmPrevous.SetInvoice 

lub frmPrevious.SetProjectStatusOn

więc nie tylko można przetasować wartości i dane iz powrotem, ale można łatwo wykonać cechy i funkcje, które budują w kodzie dla formularza prevous.

W rzeczywistości jako standard kodowania, większość moich formularzy ma funkcję łonową o nazwie MyRefresh.

Należy pamiętać, że piękno tego podejścia polega na tym, że można w ten sposób odczytać + użyć + ustawić wartości z poprzedniego formularza. Dzięki temu Twój kod może nie tylko otrzymywać wartości, ale także ustawiać wartości w tym poprzednim formularzu. To podejście jest dwukierunkowe. Możesz przesuwać dane i wartości między formularzami. Inną zaletą jest to, że nie ograniczasz się tylko do zmiennych, ale możesz używać pól, wartości kontrolnych (zdarzeń, właściwości) itp.

Takie podejście oznacza, że ​​znaczna część poprzedniej formy jest teraz na wyciągnięcie ręki.

Nie próbuj więc przekazywać całego zestawu zmiennych. Przekaż odwołanie do formularza i masz gotowy gotowy obiekt na wyciągnięcie ręki i sprawia, że ​​ten rodzaj problemu z kodowaniem jest prosty.

+1

dziękuję bardzo! szczególnie doceniam wytłumaczenie; pomaga mi się uczyć! dzięki albert! – Justin

+0

Podejście jest bardzo interesujące. Osobiście używam czegoś bardzo podobnego (przynajmniej w duchu) z określonym obiektem, który przechowuje kolekcję wszystkich otwartych okien i gdzie okna są zadeklarowane jako wystąpienia formularzy. To pozwala mi mieć serię specyficznych "okien" metod i właściwości oprócz standardowych form metod i właściwości. –

+1

To świetnie, ale tylko jedna uwaga. Nie sądzę, że to działa, aby uzyskać odwołanie do aktywnego podformularza. Odniesienie zawsze będzie miało postać główną. – HK1

6

Zwykłym sposobem byłoby odwoływać się do pól tekstowych w pierwotnej postaci z postaci podręcznego, tak:

Forms!frmInitialForm!tripID 
Forms!frmInitialForm!OrgID 

to jednak ściśle wiąże formularz podręczne do pierwotnej postaci, tak że nie może być używany nigdzie indziej w aplikacji.

Lepszym rozwiązaniem jest użycie OpenArgs:

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

Stawia swoje dwie wartości na ciąg znaków, który jest przekazywany do postaci podręcznego. Następnie można przeanalizować dwie wartości z OpenArgs za pomocą funkcji Split.

Aby uzyskać więcej informacji na temat przekazywania parametrów przy użyciu OpenArgs patrz: http://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

+0

dzięki! dzięki za zasoby! – Justin

Powiązane problemy