B4J Question CallSubDelayed causes exception for sub not found

Didier99

Member
Licensed User
In a class module, I have the following code:
B4X:
Sub doStuff()
    ' do stuff...
    CallSubDelayed( Me, "setHeight" )
End Sub    ' SetRows()

Private Sub setHeight
    Log( "Height = " & frmMessage.WindowHeight )
End Sub ' setHeight

and I get this:
B4X:
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.Exception: Sub setheight was not found.
    at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:523)
    at anywheresoftware.b4a.keywords.Common.access$0(Common.java:494)
    at anywheresoftware.b4a.keywords.Common$CallSubDelayedHelper.run(Common.java:568)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
    at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.RuntimeException: java.lang.Exception: Sub setheight was not found.
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:140)
    at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:100)
    at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:514)
    ... 9 more
Caused by: java.lang.Exception: Sub setheight was not found.
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:118)
    ... 11 more
 

LucaMs

Expert
Licensed User
Longtime User
In B4X, routines whose names begin with "set" and "get" are considered properties; this is probably the error. Change the name to SetHeight.


P.S.
No, this code work as expected:
B4X:
Sub Class_Globals
   
End Sub

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

Public Sub DoIt
    CallSubDelayed(Me, "setHeight")
End Sub

Public Sub setHeight
    Log("set")
End Sub
 
Last edited:
Upvote 0
Top