German Unklares Verhalten von CallSub / unclear behavior of CallSub

kpmais

Member
Licensed User
Longtime User
Hallo Leute.
Folgender Sachverhalt:
Ich nutze verschiedene Klassen von Custom Views in einer Library.
Nun möchte ich aus der App heraus (von irgendwo her aus der Anwendung) über CallSub eine Subroutine
der gewünschten Viewklasse ausführen.
Also zum Beispiel:
Ich habe eine CustomView (bsp. CvButton) initialisiert und auch erzeugt (den cvbutton).
mybutton=cvbutton(... und die ganze erzeugung)
Nun möchte ich eine Routine in der Instanz des erzeugten CvButtons (zum Beispiel getTextSize) aufrufen.
callsub(mybutton,"gettextsize")
in diesem Fall findet er die Sub "gettextsize" nicht.
Seltsamerweise werden jedoch die ebenfalls vorhandenen Routinen "getleft", "gettop", getwidth, getheight und noch einige problemlos gefunden
und liefern auch die korrekten werte. Andere wiederum nicht.
alle Routinen sind public declariert.

Natürlich könnte ich die properties auch direkt mit mybutton.irgendwas ausführen.
Aber das andere Gründe.

Es ist mir ein Rätsel, warum die einen Routinen der Klasse gefunden werden und die anderen nicht. Ein Muster kann ich dabei nicht erkennen.
Fällt jemandem etwas dazu ein? Kann mir jemand auf die Sprünge helfen?
Ich glaube, da ist ein Denkfehler meinerseits aber kein Programmierfehler.

========================================================================

Hello folks.

The following situation:

I use different classes of custom views in a library.
Now I want to create a subroutine from within the app (from somewhere within the application) via CallSub
of the desired view class.

So for example:
I have initialized and created a CustomView (e.g. CvButton) (the cvbutton).

mybutton=cvbutton(... and all generation)

Now I want to call a routine in the instance of the created CvButton (eg getTextSize).

callsub(mybutton,"gettextsize")

in this case it does not find the "gettextsize" sub.

Oddly enough, however, the routines "getleft", "gettop", getwidth, getheight and others that are also present are found without any problems
and also deliver the correct values. Others don't.
all routines are declared public.

Of course I could also execute the properties directly with mybutton.something.
But the other reasons.
It is a mystery to me why some routines of the class are found and others are not. I can't see a pattern here.
Anyone have any thoughts on this? Can someone help me out?
I think there is a mistake in thinking on my part but not a programming error.
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Es wäre einfacher für uns zu helfen wenn Du uns den genauen Code, den Du verwendest, schicken würdest.
In eimen meiner Programme habe Ich folgendes getestet:
Log(CallSub(xGauge3, "getCornerRadius"))
Und das funktioniert.
CallSub2(xGauge3, "setCorneRadius", 10dip)
Funktioniert auch.

Aber
Log(xGauge3.CornerRadius)
und
xGauge3.CornerRadius = 10dip
sind einfacher !

Routinen die mit get oder set anfangen werden als Properties anerkannt.
Wenn Du generelle Routinen benutzen willst kannst Du Get oder Set benutzen.
Public Sub getTextSize = Property
Piblic Sub GetTextSize = Routine.
 
Last edited:

kpmais

Member
Licensed User
Longtime User
Hallo Klaus.
Vielen Dank für deine Antwort.

Ja, mit Code wäre es einfacher. Aber das ist etwas viel an Code. Da würde sich kaum jemand einarbeiten wollen, nur so zum Spaß.

Zur Sache.
Du hast recht. Ich habe das Ganze nochmals nachvollzogen und die Warnungen ignoriert.
Jede Sub wird ordnungsgemäß ausgeführt.
Was mich verwirrte ist, wenn sich die bezogene Klasse als Code innerhalb der IDE befindet wird
beim Erstellen der CallSub die Subroutine ohne Kommentar eingefügt.
Befindet sich die Klasse jedoch in einer Library, erhält man beim Erstellen der CallSub den Hinweis,
dass sich die bezogene Subroutine nicht in der Klasse befindet (obschon sie drin ist).
Die IDE gibt dann auch eine entsprechende Warnung (Warning 25) aus.
Seltsamerweise führen eben die in der ersten Mail genannten gettop, getleft etc. NICHT zu einer Warnung
und werden anscheinend erkannt. Andere jedoch nicht. Ausgeführt werden sie jedoch alle.
Ich denke, das ist ein Problem in der B4A IDE, welche die Library Klassen nicht soooo korrekt einliest.

Bis auf die Warnungen ist das Problem jedoch behoben.
Danke nochmals und Gruß

Klaus-Peter
 

DonManfred

Expert
Licensed User
Longtime User
Alle Klassen werden korrekt geladen.
Du kannst jedoch nicht erwarten dass die B4A IDE dir alle Methoden und properties von irgendeiner JAR anzeigt welches Du einbindest.
Das funktioniert nur bei Libraries die für B4A geschrieben wurden. In der dazugehörigen XML werden alle Properties und Methoden aufgelistet.

Versuche dein Problem in einem KLEINEN Projekt nachzuvollziehen und uploade das Projekt. Dann können wir da reingucken und verstehen das Problem auch besser.
Alles andere führt nur zur planlosen raterei unsererseits.

Vielleicht hast Du aber auch das Konzept von Klassen nicht so recht verstanden.
Wenn Du eine customview-klasse hast brauchst Du eine Instanz der Klasse um Methoden daraus aufzurufen. Nach eingabe des klassenobjectnamens kommt eine Liste aller Methoden und Properties die Du direkt aufrufen kannst. ohne callsub.
 
Top