Seite 1 von 1

Funktion per Codeblock - unbekannte Funktion

Verfasst: Mi, 12. Jan 2011 14:52
von Armin
Hallo zusammen,

ich meine, dass folgender Code in normalem Xbase++ laufen sollte. Im WAA kommt die Fehlermeldung "Unbekannte Funktion".
Hat jemand eine Idee?
Grüsse, Armin

Code: Alles auswählen

oPackage:registerForm("AB_TEST90")     // ist nicht unebdingt nötig
oPackage:registerForm("AB_TEST99")     // ist nicht unebdingt nötig


function AB_TEST90(oHTML, oContext)
local bFunc
local cFunc := ""

ab_test99()                            // funktioniert
bFunc := {|| ab_test99()}
eval(bFunc)                           // funktioniert

cFunc := "ab_test99()"
&(cFunc)                               // Absturz: Unbekannte Funktion

cFunc := "{|| ab_test99()}"
bFunc := &(cFunc)
eval(bFunc)                           // Absturz: Unbekannte Funktion

return .t.

function ab_test99()

return .t.

Re: Funktion per Codeblock - unbekannte Funktion

Verfasst: Mi, 12. Jan 2011 16:15
von Tom
Hallo, Armin.

Ich nutze den WAA nicht, aber in reinem Xbase läuft der Code problemlos durch.

Wenn ich die Doku richtig verstehe, sorgt RegisterForm() dafür, dass eine Funktion im Browser zur Verfügung steht. Vielleicht bewirkt diese Methode zugleich, dass die Funktion "STATIC" (oder vergleichbar) wird. In diesem Fall würde nämlich auch der Code in Xbase an den von Dir genannten Stellen abstürzen, also wenn aus:

function ab_test99()

static function ab_test99()

würde.

Re: Funktion per Codeblock - unbekannte Funktion

Verfasst: Mi, 12. Jan 2011 16:26
von brandelh
Hi,

bei "normalen" Programmen kann es vorkommen, dass eine Funktion die NUR in einem Text-Codeblock
aufgerufen wird nicht referenziert (also eingebunden) wird. Daher muss man diese Funktion
in einer "Toten Ecke" aufrufen, damit der Linker sie einbindet:

Code: Alles auswählen

proc Main()
   local cFunk, bFunc
   cFunc := "{|| ab_test99() }"
   bFunc := &(cFunc)
   eval(bFunc) 
   if .f.  // wird nie ausgeführt, aber bindet Funktion ein.
      ab_test99()
   endif
return

function ab_test99()
return "Test"
Für Code aus der gleichen EXE ist das NIE nötig, aber Funktionen aus DLLs brauchen das.
Der WAA nutzt ja ausschließlich DLL, also vielleicht hilft es ja ;-)

Re: Funktion per Codeblock - unbekannte Funktion

Verfasst: Mi, 12. Jan 2011 16:50
von Armin
Hallo Tom,

ok, Dein Gedanke ist gut. Ich habe aber diese Zeile erst als es nicht funktionierte eingefügt - habe sie jetzt aber nochmals gelöscht und getestet - geht nicht :scratch: .
oPackage:registerForm("AB_TEST99") // ist nicht unebdingt nötig.

Hallo Hubert,

dann müsste ja mein Test-Code funktionieren - ich ruf die Funktion ja weiter oben schon auf:

Code: Alles auswählen

...
ab_test99()                            // funktioniert
...
Grüsse, Armin

Re: Funktion per Codeblock - unbekannte Funktion

Verfasst: Mo, 30. Mär 2015 14:56
von Armin
Hallo zusammen,

ich hatte gerade mal wieder das gleiche Problem und habe jetzt die Lösung gefunden:

Der Package-Name muss direkt vor den Funktionsnamen!

z.B. in USERDLL.DLL:

Code: Alles auswählen

function hallo
   local cTest := ""
return cTest

function testfunction(oHTML, oContext)
   local cString := {|| USERDLLhallo()} 
 ...
return 0
Grüße, Armin