Access
 sql >> Base de Dados >  >> RDS >> Access

Como corrigir 'Recurso do sistema excedido' ao migrar para o Windows 10

Como corrigir "Recurso do sistema excedido" ao migrar para o Windows 10

Mensagem de erro de recurso do sistema excedido


Ultimamente, temos visto uma enxurrada de clientes recebendo "Recursos do sistema excedidos" ao migrar para o Windows 10, mesmo que o sistema funcionasse bem em versões anteriores do Windows. Em alguns casos, rastreamos o problema para aplicativos que usam muitos subformulários em um controle de guia, então vou descrever uma técnica que evitará o problema nos casos em que cada guia hospeda um subformulário.

As guias são uma ótima interface de usuário – até que as memórias se esgotem


Outro dia eu estava trabalhando com o aplicativo de um cliente que tinha três níveis de guias profundos:guias dentro de guias, todas sendo carregadas com subformulários toda vez que o formulário era aberto. O aplicativo funcionou bem no Windows 7, mas causou mensagens de erro “System Resource Exceeded” no Windows 10. A solução é carregar o subformulário apenas quando o usuário clicar na guia e descarregar o subformulário quando clicar em outra guia.

Private Sub TabTasks_Change()
10 Static LastSubform As Access.SubForm


12 If Not LastSubform é Nothing Then
14 If Len(LastSubform.SourceObject) Then
16 LastSubform.SourceObject =vbNullString
18 End If
20 End If
22 Select Caso Me.TabTasks.Value
24 Caso Me.Orders.PageIndex
25 Se Me.frmOrders.SourceObject =vbNullString Então
26 Defina LastSubform =Me.frmOrders
28 LastSubform.SourceObject =“frmOrder_sub”
30 End If
32 Case Me.Invoices.PageIndex
34 If Me.frmInvoices.SourceObject =vbNullString Then
36 Defina LastSubform =Me.frmInvoices
38 LastSubform.SourceObject =“frmInvoices_sub”
40 End If
42 Case Me.Payments.PageIndex
44 If Me.frmPayments.SourceObject =vbNullString Then
46 Definir LastSubform =Me .frmPayments
48 LastSubform.SourceObject =“frmPayments_sub”
50 End If
52 End Select
End Sub

Revisão de código


A mágica acontece no evento Change da aba, que ocorre quando o usuário clica em cada aba do controle. No exemplo de código acima, estou interessado apenas em guias que possuem subformulários, neste caso três guias. (A técnica é inútil para guias sem subformulários).

O objeto estático LastSubForm, (linha 10), mantém o controle do último subformulário usado e define seu valor SourceObject como nulo na linha 16. Isso desocupará o formulário da guia anterior da memória e manterá o uso de memória no mínimo quando o usuário desligar para outra aba.

A instrução select na linha 22 é usada para identificar em qual guia foi clicado, em seguida, definir o objeto LastSubForm para o subformulário contido na guia e, finalmente, definir o SourceObject do subformulário na linha 28. Isso carregará imediatamente o subformulário na memória. O processado é repetido para as outras duas abas do controle com subformulários.

Lembre-se


Para minimizar o uso de memória, você precisa definir a propriedade SourceObject de cada guia em questão como uma string vazia na visualização de design, caso contrário, todos os subformulários serão carregados, o que anula o objetivo da técnica.

A primeira guia do seu controle deve ser carregada, pois é o que seus usuários verão quando abrirem seu formulário.

Basta adicionar mais instruções select conforme necessário se você precisar usar essa técnica com mais guias, eu usei para um controle de guia que tinha 8 guias.

Se você tiver guias aninhadas, precisará repetir a abordagem para cada controle de guia.

Se os nomes do subformulário forem iguais à propriedade SourceObject, você poderá otimizar ainda mais o código usando uma variável de string no código.

Se você gostou desta postagem, compartilhe!


Por favor, compartilhe este post no LinkedIn, Twitter e Facebook, será muito apreciado!

Junte-se a mim na próxima reunião do Access with SQL Server no dia 8 de maio, às 18h30 CST, para mais detalhes clique aqui.