Italian Dubbi Msgbox2Async e Wait For

GaNdAlF89

Active Member
Licensed User
Longtime User
Ciao a tutti! Vi espongo un dubbio che mi assale da giorni, vorrei capire dove sbaglio/faccio confusione nel ragionamento, oppure, se corretto, vi chiedo lumi in merito XD

Come accennato qui, mi ritrovo a dover aggiornare un vecchio progetto, e mi sono documentato sui nuovi Msgbox2Async e Wait For, rispettivamente qui Async Dialogs e Resumable Subs.
Quindi, a farla breve, utilizzando un Msgbox2Async devo utilizzare la Wait For, la quale però ritorna alla sub chiamante, in attesa che l'utente interagisca col Msgbox2Async. Allora per evitare questo devo invocare la sub in questione come Wait For (Sub in questione). Ma a questo punto il problema si sposta un passo indietro, e così via. Faccio un esempio tramite codice, per essere più chiaro:

Vecchio codice:
B4X:
Sub Activity_Create (FirstTime As Boolean)
    FunzioneStart
End Sub

Sub FunzioneStart
    Funzione1
    Funzione2
    Dim res As Int= Msgbox2("Testo","Titolo","SÌ","","NO",Null)
    If res = DialogResponse.POSITIVE Then
        '...altro codice
End Sub

Sub Funzione1
    Dim res As Int= Msgbox2("Testo","Titolo","SÌ","","NO",Null)
    If res = DialogResponse.POSITIVE Then
        '...altro codice
        Funzione3
End Sub

Sub Funzione2
    Dim res As Int= Msgbox2("Testo","Titolo","SÌ","","NO",Null)
    If res = DialogResponse.POSITIVE Then
        '...altro codice
End Sub

Sub Funzione3
    Dim res As Int= Msgbox2("Testo","Titolo","SÌ","","NO",Null)
    If res = DialogResponse.POSITIVE Then
        '...altro codice
End Sub


Che, per quanto detto sopra, dovrei quindi modificare in:

B4X:
Sub Activity_Create (FirstTime As Boolean)
    Wait For (FunzioneStart) Complete (Result As Object)
End Sub

Sub FunzioneStart As ResumableSub
    Wait For (Funzione1) Complete (Result As Object)
    Wait For (Funzione2) Complete (Result As Object)
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice

Return Null
End Sub

Sub Funzione1  As ResumableSub
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice
        Wait For (Funzione3) Complete (Result As Object)

Return Null
End Sub

Sub Funzione2  As ResumableSub
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice

Return Null
End Sub

Sub Funzione3  As ResumableSub
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice

Return Null
End Sub

Cioè il dubbio principale è: così facendo, andando a ritroso, devo mettere Wait For-Complete ovunque?
Gentilmente, illuminatemi XD

PS: il codice è splittato nelle varie funzioni 1,2,3 poichè ognuna di queste può essere richiamata autonomamente (senza le altre) anche altrove, e per evitare di duplicare codice e modifiche future, ho reso funzioni a sè stanti.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Sì, è giusto.

Per questo ti era stato consigliato di mantenere i vecchi MsgBox, se ne hai tanti, perché non sono un "pericolo".
 

GaNdAlF89

Active Member
Licensed User
Longtime User
Sì sul fatto di essere tanti e non conviene sostituirli sono d'accordo.
Volevo solo capire se la logica che ho inteso io fosse corretta oppure fossero solo "pippe" mentali.
 

GaNdAlF89

Active Member
Licensed User
Longtime User
Come posso gestire il caso in cui la Funzione3 sta su un modulo, e su un altro modulo a parte la invoco tramite CallSub?

Esempio:
Modulo 1:
B4X:
Sub Funzione3  As ResumableSub
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice

Return Null
End Sub

Modulo 2:
B4X:
Sub Prova
    CallSub(Modulo1,"Funzione3")
End Sub
 

Star-Dust

Expert
Licensed User
Come posso gestire il caso in cui la Funzione3 sta su un modulo, e su un altro modulo a parte la invoco tramite CallSub?

Esempio:
Modulo 1:
B4X:
Sub Funzione3  As ResumableSub
    Dim ro As Object = Msgbox2Async("Testo","Titolo","SÌ","","NO",Null,False)
    Wait For (ro) Msgbox_Result (res As Int)
    If res = DialogResponse.POSITIVE Then
        '...altro codice

Return Null
End Sub

Modulo 2:
B4X:
Sub Prova
    CallSub(Modulo1,"Funzione3")
End Sub
Ha risposto proprio oggi alla mia stessa domanda
 

GaNdAlF89

Active Member
Licensed User
Longtime User
Ha risposto proprio oggi alla mia stessa domanda
Perfetto, grazie mille!
In tutto ciò, mi solleva scoprire che le mie non sono "pippe" mentali 😅
 

Star-Dust

Expert
Licensed User
Perfetto, grazie mille!
In tutto ciò, mi solleva scoprire che le mie non sono "pippe" mentali 😅
Non lo so , perchè ho scoperto di aver fatto una domanda sciocca. In effetti come dice @LucaMs provandolo funzionava
 
Top