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:
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