Come risolvere "Risorsa di sistema superata" durante la migrazione a Windows 10
Messaggio di errore di superamento della risorsa di sistema
Ultimamente abbiamo assistito a una raffica di client che hanno ricevuto "Risorsa di sistema superata" durante la migrazione a Windows 10, anche se il sistema funzionava bene nelle versioni precedenti di Windows. In alcuni casi abbiamo rintracciato il problema in app che utilizzano molte sottomaschere in un controllo struttura a schede, quindi descriverò una tecnica che impedirà il problema nei casi in cui ogni scheda ospita una sottomaschera.
Le schede creano un'interfaccia utente eccezionale:fino a quando i ricordi non si esauriscono
Proprio l'altro giorno stavo lavorando con l'app di un cliente che era tre livelli di scheda in profondità:schede all'interno di schede, tutte caricate con sottomoduli ogni volta che il modulo è stato aperto. L'app ha funzionato bene in Windows 7 ma ha causato messaggi di errore "Risorsa di sistema superata" in Windows 10. La soluzione è caricare la sottomaschera solo quando l'utente fa clic sulla scheda e scaricare la sottomaschera quando fa clic su un'altra scheda.
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 Caso 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 Imposta LastSubform =Me .frmPayments
48 LastSubform.SourceObject =“frmPayments_sub”
50 End If
52 End Select
End Sub
Revisione del codice
La magia si verifica sull'evento Modifica della scheda, che si verifica quando l'utente fa clic su ciascuna scheda del controllo. Nell'esempio di codice sopra sono interessato solo le schede che hanno sottomoduli, in questo caso tre schede. (La tecnica è inutile per le schede senza sottomoduli).
L'oggetto statico LastSubForm, (riga 10), tiene traccia dell'ultima sottomaschera utilizzata e imposta il suo valore SourceObject su null nella riga 16. Ciò eliminerà il modulo della scheda precedente dalla memoria e manterrà l'utilizzo della memoria al minimo quando l'utente si spegne in un'altra scheda.
L'istruzione select nella riga 22 viene utilizzata per identificare su quale scheda è stato fatto clic, quindi impostare l'oggetto LastSubForm sulla sottomaschera contenuta nella scheda e infine impostare il SourceObject della sottomaschera nella riga 28. In questo modo caricherà immediatamente la sottomaschera in memoria. L'elaborazione viene ripetuta per le altre due schede del controllo con sottomaschere.
Tieni a mente
Per ridurre al minimo l'utilizzo della memoria è necessario impostare la proprietà SourceObject di ciascuna scheda in questione su una stringa vuota in visualizzazione progettazione, altrimenti verranno caricati tutti i moduli secondari, il che vanifica lo scopo della tecnica.
La prima scheda del tuo controllo dovrebbe essere caricata poiché è ciò che i tuoi utenti vedranno quando apriranno il tuo modulo.
Basta aggiungere più istruzioni select secondo necessità se è necessario utilizzare questa tecnica con più schede, l'ho usata per un controllo struttura a schede con 8 schede.
Se disponi di schede nidificate, dovrai ripetere l'approccio per ciascun controllo struttura a schede.
Se i nomi dei tuoi moduli secondari sono gli stessi della tua proprietà SourceObject, puoi ottimizzare ulteriormente il codice utilizzando una variabile stringa nel codice.
Se ti piace questo post condividilo!
Condividi questo post su LinkedIn, Twitter e Facebook, sarà molto apprezzato!
Unisciti a me alla prossima riunione di Access con SQL Server l'8 maggio, alle 18:30 CST, per maggiori dettagli fai clic qui.