2013-07-11 18 views
7

Na tym formularzu dostępu, nad którym pracuję, mam zmienną globalną, która przyjmuje wartość z innego formularza w swoim zdarzeniu Form_Load. Z jakiegoś powodu mi nieznana zmienna "traci swoją wartość" (staje się "" ") po upływie pewnego czasu lub zdarza się jakieś zdarzenie. Nie byłem w stanie zauważyć niczego szczególnego, które wyzwala to zachowanie. Czy zmienne globalne są resetowane po pewnym czasie "braku aktywności" w formularzu?Zmienna globalna traci na wartości

Oto jak ustawić zmienne globalne mówię:

Private Sub Form_Load()  
    '... 
    Set prev_form = Form_Identification.Form 
    PasswordSybase = prev_form.Password.Value & vbNullString 
    UserSybase = prev_form.UserID.Value & vbNullString 
    '... 
End Sub 
+4

[Jaki jest czas istnienia zmiennej globalnej w programie excel vba?] (Http://stackoverflow.com/questions/7041138/what-is-the-lifetime-of-a-global-variable-in-excel- vba) – Santosh

Odpowiedz

0

widzę nic w tym stwierdzeniu, że mówi mi, że jest to zmienna globalna. Ustawić zmienne globalne przede wszystkim Subs/funkcje i opcje poniżej an Porównaj oświadczenie w module, stwierdzając:

PUBLIC X as string 

Każda inna zmienna jest tylko dobry, dopóki sub lub funkcja została zakończona.

Również zmienne globalne MUSZĄ być zadeklarowane w PRAWIE MODUŁU. Nie możesz ich zadeklarować w module formularza.

+0

To słowo kluczowe "Global" wydaje się nie istnieć. Umieściłem go na górze i zadeklarowałem jako takie: 'Dim PasswordSybase as String' – ApplePie

+0

Wypróbuj PUBLIC PasswordSybase jako ciąg. Zostaw poza Dim –

+0

'Global' jest dziedzictwem ze starszych wersji VB i zastępuje go' Public'. Nadal go akceptuje (wielkie litery G, jeśli wpisujesz je małymi literami), ale jeśli klikniesz to słowo i naciśniesz F1, przejdziesz do Pomocy do "Publicznego wyciągu". –

7

Alternatywne rozwiązanie (tylko od 2007 r.) Zacząłem używać: TempVars zamiast globali w dziwnej sytuacji, w której "potrzebowałem" czegoś globalnego. Jest to kolekcja, która utrzymuje się przez cały czas trwania aplikacji, chyba że wyraźnie ją zwolnisz. W niektórych przypadkach uważam, że jest bardziej przydatny niż globale, aw niektórych przypadkach gorzej.

TempVars.Add myVarName, myVarValue ' To initialize 
TempVars.Item(myVarName) = newVarValue ' To reference and assign a new value 
TempVars.Remove(myVarName) ' To release 

Szybkie wyszukiwanie powinno pokazać więcej odniesień dużo, ale podaję odnośnik do podstawowego jeden

http://blogs.office.com/b/microsoft-access/archive/2010/09/27/power-tip-maximize-the-user-of-tempvars-in-access-2007-and-2010.aspx

+3

Przejmuję, ale nie mogę zaakceptować, ponieważ muszę używać programu Access 2000 (przepraszam, nie sprecyzowałem tego wcześniej). Świetna odpowiedź na rok 2007+. Na pewno będę to pamiętał. – ApplePie

+0

Stary post, ale nadal przydatny, TempVars również trwa po Application.Quit (wszystkie te zdarzenia zwalniające: D), ale przed całkowitym zamknięciem, którego nie mają Globals. –

1

Można stworzyć „fake” zmienną globalną przez

  • tworzenie formularza (np. O nazwie frmGlobal)
  • upewnij się, że formularz jest zawsze otwarty, ale ukryty
  • Utwórz pole tekstowe dla każdej zmiennej globalnej, którą chcesz (np. tVar1)
  • w kodzie, odniesienie jako np. Form_frmGlobal.tVar1

Wadą jest to, że niezwiązane pole tekstowe nie może dać konkretne dane wpisać chcesz

około dwóch sposobów, które są

  • w kodzie, jawnie przekonwertować pole tekstowe na typ danych podczas odwoływania się do zmiennej globalnej, np. Clng (Form_frmGlobal.tVar1)

  • inną opcją jest utworzenie tabeli jednorzędowej i powiązać otaczaniem na ukrytej formy do stołu, dzięki czemu typy danych są egzekwowane

premię tej metody jest to, można użyć do pamięci trwałej pomiędzy sesjami Zastrzeżenie: upewnij się, że ta tabela jest lokalny pojedynczy tylko użytkownik, w przednim pliku bazy danych (nie chcę umieszczać go w bazie danych zaplecza, ponieważ wielu użytkowników przesyła się nawzajem).Zakłada to, że korzystasz z oddzielnych baz danych z przodu i z tyłu, z dystrybucją przedniego końca do stacji roboczej każdego użytkownika.

3

Mam nadzieję, że odwiedzający zobaczą ten post, ponieważ zapewnia on ważny dodatkowy element.

Nawet jeśli zadeklarujesz zmienną globalnie, wydaje się, że - w przypadku, gdy ustawisz wartość tej zmiennej w module formularzy - ta wartość zostanie utracona po WYCOŁNIENIU formularza.

Rozwiązanie (w moim przypadku) było tak proste jak wymiana:

Unload Me

... z ...

Me.Hide

zmiennych (i przedmiotów), które ustawiłem w tym module kodu, a następnie zachowałem ich wartości przez cały okres istnienia instancji aplikacji.

+1

Dziękuję za to - podczas testu zamykałem główny formularz ręcznie (czego nie mogą robić zwykli użytkownicy) i zastanawiałem się, dlaczego moje zmienne globalne nie są ustawiane. Będzie bardziej ostrożny w tym kierunku! –