Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Funktion per Codeblock - unbekannte Funktion

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 365
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Kontaktdaten:

Funktion per Codeblock - unbekannte Funktion

Beitrag von Armin » Mi, 12. Jan 2011 14:52

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: 6797
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag von Tom » Mi, 12. Jan 2011 16:15

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: 13765
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag von brandelh » Mi, 12. Jan 2011 16:26

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: 365
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag von Armin » Mi, 12. Jan 2011 16:50

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: 365
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Kontaktdaten:

Re: Funktion per Codeblock - unbekannte Funktion

Beitrag von Armin » Mo, 30. Mär 2015 14:56

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