Mensaje de error de recursos del sistema excedido

Últimamente hemos visto un bombardeo de clientes que obtienen «Recursos del sistema excedidos» cuando migran a Windows 10, a pesar de que el sistema funcionó bien en versiones anteriores de Windows. En algunos casos, hemos rastreado el problema a las aplicaciones que usan muchos subformularios en un control de pestaña, por lo que voy a describir una técnica que evitará el problema en aquellos casos en que cada pestaña alberga un subformulario.

Crear pestañas para un magnífico UI – Hasta acabarse los recuerdos

El otro día estaba trabajando con la aplicación de un cliente que tenía tres niveles de pestaña: pestañas dentro de pestañas,de las cuales todas se cargaban con subformularios cada vez que se abría el formulario. La aplicación funcionó bien en Windows 7, pero causó mensajes de error «Se han excedido los recursos del sistema» en Windows 10. La solución es cargar solo el subformulario cuando el usuario hace clic en la pestaña y descargar el subformulario cuando hacen clic en otra pestaña.

 

 

 

 

 

 

 

 

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

Revisión de código

La magia ocurre en el evento Cambiar de pestaña, que ocurre cuando el usuario hace clic en cada pestaña del control. En el ejemplo de código anterior, solo me interesan las pestañas que tienen subformularios, en este caso tres pestañas. (La técnica es inútil para pestañas sin subformularios).

El objeto estático LastSubForm, (línea 10), realiza un seguimiento del último subformulario utilizado y establece su valor de SourceObject en nulo en la línea 16. Esto vaciará de la memoria el formulario de la pestaña anterior manteniendo el uso de memoria al mínimo cuando el usuario se cambia a otra pestaña.

La instrucción select en la línea 22 se usa para identificar en qué pestaña se hizo clic, luego establece el objeto LastSubForm en el subformulario contenido en la pestaña y finalmente establece el SourceObject del subformulario en la línea 28. Hacerlo cargará inmediatamente el subformulario en la memoria. El proceso se repite para las otras dos pestañas del control con subformularios.

Tenga en cuenta

Para minimizar el uso de memoria, debe establecer la propiedad SourceObject de cada pestaña en una cadena vacía en la vista de diseño; de lo contrario, se cargarán todos los subformularios, lo que anula el propósito de la técnica.

La primera pestaña de su control debería cargarse, ya que es lo que verán sus usuarios cuando abran su formulario.

Simplemente agregue más declaraciones select según sea necesario si necesita usar esta técnica con más pestañas, particulamente la he usado para un control de pestañas que tenía 8 pestañas.

Si tiene pestañas anidadas, deberá repetir el enfoque para cada control de pestañas.

Si sus nombres de subformulario son los mismos que su propiedad SourceObject, puede optimizar aún más el código utilizando una variable de cadena en el código.