German callsub verhalten in Libraries

kpmais

Member
Licensed User
Longtime User
Ich habe folgendes Verhalten von callsub festgestellt (wozu ich das benötige sei dahingestellt, ich weiß, dass es etwas "Hin-und-Her" wirkt).

Die drei Klassen eines Testprojektes sind folgend.
1) Main
2) ctestclass
3) cltestclass (diese wird im nächsten Test als Library kompiliert und eingebunden)

- ich rufe in der Main die Methode getMethode aus der Klasse CLTestClass auf.
- Diese Methode beinhaltet die callsub, die über callsub(Classname (hier ctestclass),"getname") die Methode (oder Property)
getname in ctestclass aufruft.
- In der Folge wird der gespeicherte Name aus ctestclass korrekt weitergegeben und angezeigt.

Soweit ist alles wie ich es erwarte.

Binde ich nun jedoch die Klasse cltestclass als kompilierte Library ein, also nicht mehr als "ordentliches" Projektmitglied,
ändert sich das Verhalten.

Nun wird wie auch erwartet die callsub in getmethode (in der Klasse cltestclass) aufgerufen, liefert jedoch als Ergebnis null.
Der Zugriff auf getname in ctestclass erfolgt nun erst nach Abarbeiten der Routine in welcher GetMethode aufgerufen wurde.
Hier also der Activity_Create. Es ist völlig gleichgültig in welcher Routine dies geschieht. Das könnte man verschachteln wie man will.

Mir kommt es so vor, als ob der Stack erst abgearbeitet wird und dann der Zugriff auf die in callsub referenzierte Routine erfolgt, wenn
sich die die Klasse, welche callsub beinhaltet, in einer Library befindet und nicht direkt als Klasse im Projekt.

Ich möchte schon sehr gerne wissen, mit welchem Verhalten von callsub ich rechnen muss bzw. wie die genaue Verarbeitung vor sich geht.
Unterschiedliche Verhalten hat eben auch unterschiedliche Ergebnisse. Womit muss ich also rechnen?

Im folgenden die Projektklassen des Projektes:

Callsub-Test:
<Main>

#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Private clt As CLTestClass
    Private ct As CTestClass
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
End Sub

Sub Activity_Create(FirstTime As Boolean)
    ct.Initialize
    clt.Initialize
    
    Log(clt.GetMethode(ct,"getname"))
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Button1_Click

End Sub



<CTestClass>

Sub Class_Globals
    Private FName As String
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    FName="Test"
End Sub

Public Sub setName(value As String)
    FName=value
End Sub

Public Sub getName As String
    Return FName
End Sub


<CLTestClass> <diese wird aus dem Projekt entfernt und als Library eingebunden>

Sub Class_Globals
    
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
    
End Sub

Public Sub GetMethode(ClassRef As Object,Methode As String) As String
    If SubExists(ClassRef,Methode) Then
        Log("Methode gefunden")
        Log("Rückgabe: " & CallSub(ClassRef,Methode))
        Return CallSub(ClassRef,Methode)
    End If
    Return Null
End Sub
 
Top