German gleich nochmal: Problem mit Resumable Sub

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,

ich setze schon längere Zeit zur vollsten Zufriedenheit diesen Code ein, um ein versehentliches Beenden meiner App zu verhindern:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    Select KeyCode
        Case KeyCodes.KEYCODE_BACK
            If ListFile="" Then
                Msgbox2Async("Möchten Sie die App beenden?", "App beenden", "Ja", "", "Nein", Null,False)
                Wait For Msgbox_Result (Result As Int)
                If Result = DialogResponse.NEGATIVE Then
                    CallSubDelayed(Me, "codewahl")
                End If
            Else
                Msgbox2Async("Möchten Sie die App beenden?", "App beenden", "Ja", "neue Liste", "Nein", Null,False)
                Wait For Msgbox_Result (Result As Int)
                If Result = DialogResponse.NEGATIVE Then
                    CallSubDelayed(Me, "codewahl")
                else If Result = DialogResponse.CANCEL Then
                    ListFile=""
                    CallSubDelayed(Me, "turnierwahl")
                End If
            End If
    End Select
End Sub
Jetzt erhalte ich beim Compilieren diese Fehlermeldung:
Fehler beim Parsen des Programms:
Fehlerbeschreibung: Der Rückgabewert von Resumable Subs muß entweder ResumableSub oder keiner sein.
Die Sub wird als "resumable sub" gekennzeichnet, (wie) kann ich meine Sub weiternutzen?
 

b4x-de

Active Member
Licensed User
Longtime User
Hallo,
versuch doch bitte mal:
B4X:
Sub Activity_KeyPress (KeyCode As Int) As ResumableSub ' anstelle von As Boolean
Viel Erfolg!
Thomas
 

peternmb

Well-Known Member
Licensed User
Longtime User
Danke für den Tipp.
Ich bekomme beim Compilieren keine Fehlermeldung aber mit der zurück-Taste stürzt die App ab (App wurde beendet)
 

b4x-de

Active Member
Licensed User
Longtime User
Das ist schwer zu sagen, woran das liegt... Aber es fehlt bei dir das Return eines Boolean.

Activity_KeyPress muss entweder True oder False zurückgeben. Gib True zurück, falls du das KeyPress-Ereignis selbst verarbeitet hast (selber konsumiert). Gib False zurück, falls du möchstest, dass Android die Verarbeitung übernimmt.

An deinem Beispiel bedeutet das konkret, dass falls der Benutzer "Nein" (Negativ) oder "Neue Liste" (Cancel) wählt, nach dem CallSubDelayed ein Return True folgen sollte. Hinter deinem End Select sollte ein Return False stehen.

Viel Erfolg,
Thomas
 

b4x-de

Active Member
Licensed User
Longtime User
Noch ein Gedanke zu dem ResumableSub als Rückgabewert: Damit endet in B4X die Typprüfung des Compilers und Typfehler zeigen sich erst zur Laufzeit. Das ist eine komplexe Fehlerquelle....
 

pucki

Active Member
Licensed User
Longtime User
Das mit der "zurück-Taste" ist Kinderleicht zu umgehen, bzw. was ich mache, ich nutze sie zu Navigtions-Hilfe in meinen Apps.

Du brauchst dazu nur eine GLOBALE Variable als String. Die Variable heißt bei mir my_back. Sie muss nur am start jeder relevanten Änderung (Aufruf eines Frames z.b) den Wert so geändert bekommen, das man das Resultat richtig abfängt. Siehe mein Code.
Da wird bei klicken auf ein Button "Beschreibung" die Varibel mit beschreibung gefüllt, und my_panel_3 aufgerufen und bei beim klicken auf ein Button "suche" die Varibel mit suche gefüllt, und my_panel_2 aufgerufen.
Ich habe dir mal nur den Code der Activity_KeyPress routine reingeschrieben da es sonst zu verwirrend wird.

B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
   
    Dim key_raus As Boolean
    key_raus = False
    If KeyCode = KeyCodes.KEYCODE_BACK Then
        If my_back = "beschreibung" Then
            my_panel_1.Visible = True
            my_panel_3.Visible = False
            hp_alte_daten_anzeigen.Visible = True
            my_back = "prg-daten"
            key_raus = True
       End If
           
       If my_back = "suche" And key_raus = False Then
            my_panel_1.Visible = True
            my_panel_2.Visible = False
            key_raus = True
        End If
        Return True
    End If

Wichtig ist also nur das du der Variable my_back immer den richtigen Status zuweist. Ein String hilft dabei später den Überblick zu bewahren. Es gibt zu den Thema sogar ein Thread von mir eröffnet hier im German-Bereich. Ich war nur zu faul den Link zu suchen. Der einzige Nachteil ist an der Routine das ein "beenden" extra ausgelöst werden muss. Wo bei ich mir eh nicht sicher bin, ob die App wirklich beendet wird wenn man die Taste nicht abfängt. Ich hatte Sie vor dieser Routine immer noch in der "Ausführenden App" Anzeige.

Der Grund warum ich diese Routine in JEDEN meiner Programme drin habe ist meine Dummheit. Ich benutze die "Zurück-Taste" als Zurück-Taste. ;) Nur zuviel zurück, bedeutet bei Android halt RAUS. Und das fange ich halt ab. Nur gibt es kein "zuviel-zurück" mehr, und ich schmeiße die App auf die gute alte Methode raus. ;)

Vielleicht hilft dir das ja, zu verhindern das du aus deiner App raus fliegst.

Gruß

Pucki

*edit* Hier der Link zu den Thread : https://www.b4x.com/android/forum/t...-abfangen-der-zurück-taste.96672/#post-609945
 
Top