Jak naprawić „Przekroczenie zasobów systemowych” podczas migracji do systemu Windows 10
Komunikat o błędzie przekroczenia zasobów systemowych
Ostatnio widzieliśmy lawinę klientów, którzy migrują do systemu Windows 10, którzy otrzymują „przekroczenie zasobów systemowych”, mimo że system działał dobrze we wcześniejszych wersjach systemu Windows. W niektórych przypadkach prześledziliśmy problem w aplikacjach, które używają wielu podformularzy w kontrolce karty, więc opiszę technikę, która zapobiegnie problemowi w przypadkach, gdy każda karta obsługuje podformularz.
Zakładki tworzą świetny interfejs użytkownika – do wyczerpania wspomnień
Niedawno pracowałem z aplikacją klienta, która miała trzy głębokość zakładek:zakładki w zakładkach, z których wszystkie były ładowane podformularzami przy każdym otwarciu formularza. Aplikacja działała dobrze w systemie Windows 7, ale powodowała komunikaty o błędach „Przekroczono zasoby systemowe” w systemie Windows 10. Rozwiązaniem jest załadowanie podformularza tylko wtedy, gdy użytkownik kliknie kartę i wyładowanie podformularza, gdy przejdzie do innej karty.
Private Sub TabTasks_Change()
10 Static LastSubform As Access.SubForm
12 If Not LastSubform Is Nothing Then
14 If Len(LastSubform.SourceObject) Then
16 LastSubform.SourceObject =vbNullString
18 End If
20 End If
22 Select Case Me.TabTasks.Value
24 Case Me.Orders.PageIndex
25 If Me.frmOrders.SourceObject =vbNullString Then
26 Set LastSubform =Me.frmOrders
28 LastSubform.SourceObject =“frmOrder_sub”
30 Zakończ If
32 Sprawa Me.Invoices.PageIndex
34 If Me.frmInvoices.SourceObject =vbNullString Then
36 Ustaw LastSubform =Me.frmInvoices
38 LastSubform.SourceObject =“frmInvoices_sub”
40 End If
42 Case Me.Payments.PageIndex
44 If Me.frmPayments.SourceObject =vbNullString Then
46 Ustaw LastSubform =Me .frmPayments
48 LastSubform.SourceObject =“frmPayments_sub”
50 End If
52 End Wybierz
End Sub
Przegląd kodu
Magia dzieje się w zdarzeniu Zmiana karty, które ma miejsce, gdy użytkownik kliknie każdą kartę kontrolki. W powyższym przykładzie kodu interesują mnie tylko zakładki, które mają podformularze, w tym przypadku trzy zakładki. (Technika jest bezużyteczna w przypadku kart bez podformularzy).
Statyczny obiekt LastSubForm (wiersz 10) śledzi ostatnio użyty podformularz i ustawia jego wartość SourceObject na null w wierszu 16. Spowoduje to usunięcie poprzedniej karty z pamięci i ograniczy użycie pamięci do minimum, gdy użytkownik się wyłączy do innej karty.
Instrukcja select w wierszu 22. służy do określenia, która karta została kliknięta, a następnie ustawia obiekt LastSubForm na podformularz zawarty w karcie i ostatecznie ustawia obiekt SourceObject podformularza w wierszu 28. Spowoduje to natychmiastowe załadowanie podformularza do pamięci. Przetwarzanie jest powtarzane dla pozostałych dwóch zakładek kontrolki z podformularzami.
Pamiętaj
Aby zminimalizować zużycie pamięci, musisz ustawić właściwość SourceObject każdej karty na pusty ciąg w widoku projektu, w przeciwnym razie wszystkie podformularze zostaną załadowane, co jest sprzeczne z celem tej techniki.
Pierwsza zakładka kontrolki powinna się wczytać, ponieważ to właśnie ją zobaczą użytkownicy po otwarciu formularza.
Po prostu dodaj więcej instrukcji select w razie potrzeby, jeśli chcesz użyć tej techniki z większą liczbą kart. Użyłem jej do kontroli kart, która miała 8 kart.
Jeśli masz zagnieżdżone karty, musisz powtórzyć podejście dla każdej kontrolki karty.
Jeśli nazwy podformularzy są takie same jak właściwości obiektu SourceObject, możesz dodatkowo zoptymalizować kod, używając w kodzie zmiennej ciągu.
Jeśli podoba Ci się ten post, udostępnij go!
Udostępnij ten post na LinkedIn, Twitterze i Facebooku, będzie to bardzo mile widziane!
Dołącz do mnie na następnym spotkaniu Access with SQL Server 8 maja o 18:30 CST. Aby uzyskać więcej informacji, kliknij tutaj.