Hur man åtgärdar "Systemresurs överskriden" vid migrering till Windows 10
Felmeddelande om systemresurs överskriden
På sistone har vi sett en störtflod av klienter som fått "System Resource Exceeded" vid migrering till Windows 10, även om systemet fungerade bra i tidigare versioner av Windows. I vissa fall har vi spårat problemet till appar som använder många underformulär i en flikkontroll, så jag kommer att beskriva en teknik som kommer att förhindra problemet i de fall då varje flik är värd för ett underformulär.
Flikar ger bra UI – tills minnena tar slut
Häromdagen arbetade jag med en klients app som var tre fliknivåer djupa:flikar inom flikar, som alla laddades med underformulär varje gång formuläret öppnades. Appen fungerade bra i Windows 7 men orsakade felmeddelanden "System Resource Exceeded" i Windows 10. Lösningen är att bara ladda underformuläret när användaren klickar på fliken och ladda ur underformuläret när de klickar av till en annan flik.
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 Välj 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 End If
32 Case Me.Invoices.PageIndex
34 If Me.frmInvoices.SourceObject =vbNullString Then
36 Set LastSubform =Me.frmInvoices
38 LastSubform.SourceObject =“frmInvoices_sub”
40 End If
42 Case Me.Payments.PageIndex
44 If Me.frmPayments.SourceObject =vbNullString Then
46 Set LastSubform =Me .frmPayments
48 LastSubform.SourceObject =“frmPayments_sub”
50 End If
52 End Select
End Sub
Kodgranskning
Magin händer på flikens Change-händelse, som inträffar när användaren klickar på varje flik i kontrollen. I kodexemplet ovan är jag bara intresserad av flikar som har underformulär, i det här fallet tre flikar. (Tekniken är värdelös för flikar utan underformulär).
Det statiska LastSubForm-objektet, (rad 10), håller reda på det senast använda underformuläret och ställer in dess SourceObject-värde på null på rad 16. Detta kommer att lämna den tidigare flikens formulär från minnet och hålla minnesanvändningen nere på ett minimum när användaren stängs av till en annan flik.
Select-satsen på rad 22 används för att identifiera vilken flik som klickades på, ställ sedan in LastSubForm-objektet till underformuläret som finns i fliken och ställer slutligen in SourceObject för underformuläret på rad 28. Om du gör det kommer underformuläret omedelbart att laddas in i minnet. Bearbetningen upprepas för de andra två flikarna i kontrollen med underformulär.
Kom ihåg
För att minimera minnesanvändningen måste du ställa in SourceObject-egenskapen för varje aktuell flik till en tom sträng i designvyn, annars kommer alla underformulär att laddas, vilket motverkar syftet med tekniken.
Den första fliken i din kontroll bör laddas eftersom det är vad dina användare kommer att se när de öppnar ditt formulär.
Lägg bara till fler utvalda uttalanden efter behov om du behöver använda den här tekniken med fler flikar, jag har använt den för en flikkontroll som hade 8 flikar.
Om du har kapslade flikar måste du upprepa metoden för varje flikkontroll.
Om dina underformulärsnamn är samma som din SourceObject-egenskap kan du optimera koden ytterligare genom att använda en strängvariabel i koden.
Om du gillar det här inlägget, dela det!
Dela gärna detta inlägg på LinkedIn, Twitter och Facebook, det kommer att bli mycket uppskattat!
Följ med mig på nästa Access med SQL Server-möte den 8 maj kl. 18:30 CST, klicka här för mer information.