Funktion per Codeblock - unbekannte Funktion

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Funktion per Codeblock - unbekannte Funktion

Beitrag 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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag 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
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag 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
Antworten