Comment réparer la "ressource système dépassée" lors de la migration vers Windows 10
Message d'erreur de dépassement de ressource système
Dernièrement, nous avons vu un déluge de clients obtenir une "ressource système dépassée" lors de la migration vers Windows 10, même si le système fonctionnait correctement dans les versions précédentes de Windows. Dans certains cas, nous avons attribué le problème à des applications qui utilisent de nombreux sous-formulaires dans un contrôle d'onglet. Je vais donc décrire une technique qui évitera le problème dans les cas où chaque onglet héberge un sous-formulaire.
Les onglets font une excellente interface utilisateur - jusqu'à ce que les souvenirs soient épuisés
L'autre jour, je travaillais avec l'application d'un client qui était trois niveaux d'onglet profonds :onglets dans les onglets, qui étaient tous chargés avec des sous-formulaires à chaque fois que le formulaire était ouvert. L'application fonctionnait bien sous Windows 7 mais provoquait des messages d'erreur "Ressource système dépassée" sous Windows 10. La solution consiste à charger le sous-formulaire uniquement lorsque l'utilisateur clique sur l'onglet et à décharger le sous-formulaire lorsqu'il clique sur un autre onglet.
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 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
Révision du code
La magie se produit sur l'événement Changer de l'onglet, qui se produit lorsque l'utilisateur clique sur chaque onglet du contrôle. Dans l'exemple de code ci-dessus, je ne m'intéresse qu'aux onglets qui ont des sous-formulaires, dans ce cas trois onglets. (La technique est inutile pour les onglets sans sous-formulaires).
L'objet statique LastSubForm, (ligne 10), garde une trace du dernier sous-formulaire utilisé et définit sa valeur SourceObject sur null à la ligne 16. Cela videra le formulaire de l'onglet précédent de la mémoire et maintiendra l'utilisation de la mémoire au minimum lorsque l'utilisateur s'éteint vers un autre onglet.
L'instruction select à la ligne 22 est utilisée pour identifier l'onglet sur lequel on a cliqué, puis définir l'objet LastSubForm sur le sous-formulaire contenu dans l'onglet et enfin définir le SourceObject du sous-formulaire à la ligne 28. Cela chargera immédiatement le sous-formulaire en mémoire. Le traitement est répété pour les deux autres onglets du champ avec sous-formulaires.
Gardez à l'esprit
Afin de minimiser l'utilisation de la mémoire, vous devez définir la propriété SourceObject de chaque onglet en question sur une chaîne vide en mode conception, sinon tous les sous-formulaires se chargeront, ce qui va à l'encontre de l'objectif de la technique.
Le premier onglet de votre contrôle devrait se charger car c'est ce que vos utilisateurs verront lorsqu'ils ouvriront votre formulaire.
Ajoutez simplement plus d'instructions de sélection si nécessaire si vous avez besoin d'utiliser cette technique avec plus d'onglets, je l'ai utilisée pour un contrôle d'onglet qui avait 8 onglets.
Si vous avez des onglets imbriqués, vous devrez répéter l'approche pour chaque contrôle d'onglet.
Si vos noms de sous-formulaires sont les mêmes que votre propriété SourceObject, vous pouvez optimiser davantage le code en utilisant une variable de chaîne dans le code.
Si vous aimez ce post, partagez-le !
Veuillez partager ce message sur LinkedIn, Twitter et Facebook, ce sera très apprécié !
Rejoignez-moi lors de la prochaine réunion Access with SQL Server le 8 mai à 18h30 CST, pour plus de détails, cliquez ici.