2012-01-09 12 views
8

Nie jestem ekspertem ds. Dostępu i mam (mam nadzieję!) Proste pytanie ...Jak odwołać się do bieżącego formularza w wyrażeniu w programie Microsoft Access?

Mam formularz z wieloma zapisami. W niektórych polach tekstowych właśnie przedstawiam wartości z bazowej tabeli - więc są one powiązane z odpowiednimi polami.

Jednak niektóre pola tekstowe powinny zawierać wartości obliczone. Niektóre obliczenia są skomplikowane i obejmują wiele pól z tabeli. Piszę obliczenia jako funkcję VBA. Mogę wprowadzić coś takiego jak "Źródło kontroli":

=MyFunction([Field1], [Field2], [Field3] ...) 

Ale nie chcę wyświetlać dziesiątek pól w wywołaniu funkcji. Zamiast tego chcę wysłać cały formularz (lub bieżący rekord) jako parametr, i niech funkcja odwoła się do pól, których potrzebuje. Mogę to zrobić tak:

=MyFunction([Forms]![MyForm]) 

Ale nie podoba mi się nazwa formularza w zaproszeniu. Czy nie ma sposobu, aby wysłać "bieżącą formę" jako argument funkcji? W języku VBA wystarczy użyć słowa kluczowego "Ja", np. "Me! [Field1]". Ale wydaje się, że "Ja" nie jest akceptowane w wyrażeniu.

Czy istnieje jakiś inny sposób odniesienia do bieżącego formularza w wyrażeniu?

(To jest pytanie kosmetyczne, wiem, ale to nie jest dobre programowanie do użycia "[Form]! [MyForm]". Później kopiujesz kontrolki do innej formy i zapominasz zmienić nazwę w wyrażeniu. .)

Wdzięczny za pomoc! :-)

/Anders

Odpowiedz

9

Można użyć:

=MyFunction([Form]) 

kodu będzie:

Function MyFunction(frm As Form) 
MsgBox frm.Name 
End Function 
3

'ja' może być wywołana tylko z wnętrza obiektu odpowiednim formularzu (tj. w procedurach obiektu, funkcjach i zdarzeniach).

Mój ulubiony sposób odnieść się do obecnej postaci jest wywołanie obiektu screen.activeForm ...

screen.activeForm.recordset.fields(myFieldname).value 
screen.activeForm.controls(myControl).value 
screen.activeForm.name 
.... 

oczywiście można wysłać obiekt formularza do niestandardowych funkcji

my Result = myCustomFunction(screen.activeForm) 

Lub możesz zbudować obiekt zdefiniowany przez użytkownika. Potrzebne pola można wówczas uznać za wewnętrzne właściwości, ustawione w podrzędnej Class_Initialize odpowiedniego obiektu.

+0

'Screen.ActiveForm.Name' mogą być wykorzystywane w funkcji globalnej! Dziękuję za to! – bgmCoder

+0

Myślę, że powinno to być zaznaczone jako odpowiedź, ponieważ będzie działało, aby osiągnąć cel w znacznie większej liczbie sytuacji niż podanie nazwy postaci jako parametru i wyeliminuje potrzebę przekazania parametru w ogóle - nawet starszego, mniej mylącego kodu. Kudos do Philippe Grondier! To rozwiązało problem, który zajmowałem bardzo starannie. – DRC

2

Jeśli używasz kodu w formularzu, to "ja" odsyła do bieżącego formularza. Tak więc, "ja" nie może być używane w kontekście wyrażenia związanego z polem tekstowym.

W takim przypadku można pobrać bieżący ekran w procedurze za pomocą screen.activeform zgodnie z sugestią.

Często chodzę:

Dim f  as form 
Set f = screen.ActiveForm 
+1

Jest całkiem możliwe ustawienie zdarzenia lub nawet źródła sterowania obiektem do funkcji za pomocą arkusza właściwości dla kontrolki, jak jestem pewien, że wiesz, iw takim przypadku '= AFunction ([Form]) może być całkiem użyteczne. Jest to szczególnie przydatne, jeśli chcesz wyciąć i wkleić formant do kilku formularzy. Uważam, że to właśnie ta funkcjonalność rozważała OP. – Fionnuala

+3

Golly, nie miałem pojęcia, że ​​[Form] może być użyte w miejsce słowa kluczowego [me] w wyrażeniu. To rzeczywiście działa i przekazuje nazwę formularza i robi to bez twardego kodowania. Ta wskazówka z pewnością otwiera pewne możliwości, o których nie wiedziałem. –

+0

Tak, nie wiedziałem, że "Forma" w wyrażeniu była analogiczna do słowa kluczowego "Ja" w VBA. Bardzo przydatny. Nie mogę znaleźć dokumentacji tej techniki, ale działa! –

1
Screen.ActiveControl.Parent 
' or 
someControlVariable.Parent 

Używam tego czy chcę aktualny podformularz (lub utworzyć jeśli nie obecnie w podformularzu), ponieważ przy użyciu Screen.ActiveForm nie zapewnia bieżący podformularz, ale tylko formularz zawierający ten podformularz. Należy pamiętać o swoim kontekście, jeśli kontrola znajduje się w kontrolce zakładki, wówczas jej rodzicem jest kontrola karty, a nie formularz.

0

W ACC2013 nie mogłem użyć odpowiedzi fionnuala. Więc zmieniłem do:

obsługi zdarzeń w oknie właściciela:

=MyFunction() 

Mój kod byłoby:

Function MyFunction() 
    Dim frm As Form 
    Set frm = Screen.ActiveForm 
    MsgBox frm.Name 
End Function 
+0

Jak już wspomniano, możesz podać "ja" lub [formularz], ale musisz zastąpić "[formularz]" rzeczywistą nazwą formularza. Tak więc odpowiedź fionnuala zadziała, ale NIGDY nie użyjesz [Form], ale zastąp formularz nazwą formularza, taką jak FORMS! SomeFormName. Myślę, że najlepiej przekazać "mnie" do procedur, ponieważ wtedy kod może poprawnie działać z formularza w przypadku, gdy inna forma zostanie uruchomiona lub uzyska skupienie, wtedy twój kod nie wykryje zła. Jednak używasz Screen.ActiveForm jest w porządku. –

+0

Dlaczego korzystanie z [Formularza] w Konstruktorze wyrażeń jest problematyczne? Czy ActiveForm jest nawet opcją w tym przypadku? Widzę wadę, aby jawnie używać nazwy formularza, ponieważ te nazwy mogą się zmieniać, lub możesz wykraść wyrażenie lub kod formularza, ale użyć innej nazwy formularza. –

Powiązane problemy