Nel precedente post avevo trattato la possibilità di verificare se il nostro codice in esecuzione fosse in modalità debug oppure no.
Mi sono accorto, però, che le routine d'esempio avevano qualche problema rendendo inutile la funzione isDebugMode.
Il motivo è proprio nella chiamata
debug.assert.Diamo un'occhiata al codice difettoso:
Public Function isDebugMode() As Boolean
Debug.Assert Not myCheck(isDebugMode)
End Function
Private Function myCheck(ByVal bValue As Boolean) As Boolean
mycheck = True
End FunctionLa prima chiamata, quella pubblica, esegue un'istruzione di Debug.Assert testando la function myCheck la quale restituiva
sempre true. In questo modo la dichiazione "Not" posta prima del test avrebbe sempre restituito False.
Una cosa come scrivere:
Public Function isDebugMode() As Boolean
Debug.Assert Not False
End FunctionCosì impostata Debug.Assert avrebbe
sempre rilasciato lo stack di chiamate arrestando
sempre l'esecuzione del codice in fase di debug.
La versione corretta della nostra è questa:
Public Function isDebugMode() As Boolean
Debug.Assert Not myCheck(isDebugMode)
End Function
Private Function myCheck(ByRef bValue As Boolean) As Boolean
bValue = True
End Function
La differenza sta nel fatto che alla myCheck viene passato per riferimento un valore Boolean (isDebugMode per l'appunto) che viene forzato a
True (in caso di debug mode), ma questa volta la routine myCheck restituirà
False dato che non vi è nessun valore di ritorno esplicito.
Il tutto diverrebbe a runtime:
Debug.Assert Not FalseIn questo modo il codice non si blocca più e "isDebugMode", passato per riferimento alla myCheck verrebbe impostato a
True in fase di debug altrimenti ignorato ed impostato a
False dopo la compilazione.
Private Sub Form_Load()
If isDebugMode Then
'Codice da eseguire solo se sono in debug
Else
'Codice da eseguire solo una volta compilato
End If
End Sub
Ora che il tutto sembra essere tornato a funzionare spero di non aver complicato ulteriormente le idee.