Ausführen von Function via String

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Ausführen von Function via String

Beitrag von Dominik Krebs »

Guten Morgen zusammen,
Ich hoffe Ihr seit alle gut ins neue Jahr gekommen.

Ich suche nach einer Möglichkeit in Xbase++ eine Function via String aufzurufen. zB:

Code: Alles auswählen

PROCEDURE MAIN
LOCAL cFunction := "TEST()"

*** Hier wird es benötigt. *** 
? CallFunction(cFunction)

RETURN

FUNCTION TEST()
RETURN "123"
Ist jemanden eine Solche Funtion bekannt. Ich bin bei meiner Suche über den Befehl Eval() gestoßen. Weiß aber nicht ob ich hier richtig bin.

Ich freue mich auf Antworten.

Liebe Grüße aus Hanau !
Gruß Dominik
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: Ausführen von Function via String

Beitrag von brandelh »

ich denke ein CodeBlock ist das was du brauchst:

Code: Alles auswählen

cCode := "{|p1,p2,p3,...| Test(p1,p2,p3,...) }" // wenn man keine Parameter braucht, kann vorne auch einfach {|| stehen
bCode := &(cCode) // je nach Bedarf sollte man diese Zeile per Errorhandler vor Runtime Error schützen.
eval(bCode)
Falls die Funktion TEST() nicht im Quellcode programmiert wurde, sondern z.B. in einer DLL liegt, muss man diese sonst wo im Quellcode einbauen, damit eine Referenz erstellt wird, z.B. am Ende von MAIN:

Code: Alles auswählen

if .f. // Hier die Liste der Funktionen, die man für Macros bereitstellen will
   Test()
   ...
endif
Gruß
Hubert
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: Ausführen von Function via String

Beitrag von Tom »

Das geht auch ohne Codeblock.

Code: Alles auswählen

FUNCTION Test()
MsgBox('Juhu')
RETURN NIL

FUNCTION Main(cCallFunction)
&(cCallFunction)
RETURN NIL
Wenn Main ohne was aufgerufen wird, gibt's einen Laufzeitfehler. Ruft man es mit "Test()" auf, wird "Test()" ausgeführt und die Messagebox angezeigt.
Herzlich,
Tom
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Ausführen von Function via String

Beitrag von Dominik Krebs »

Super, vielen Dank!
Das ist genau das was ich gesucht habe :)
Vielen Dank euch beiden!

Liebe Grüße
Gruß Dominik
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Ausführen von Function via String

Beitrag von Dominik Krebs »

Tom hat geschrieben: Di, 07. Jan 2020 11:12 Das geht auch ohne Codeblock.

Code: Alles auswählen

FUNCTION Test()
MsgBox('Juhu')
RETURN NIL

FUNCTION Main(cCallFunction)
&(cCallFunction)
RETURN NIL
Wenn Main ohne was aufgerufen wird, gibt's einen Laufzeitfehler. Ruft man es mit "Test()" auf, wird "Test()" ausgeführt und die Messagebox angezeigt.
Ist es hierbei auch möglich Parameter zu übergeben?
Gruß Dominik
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Ausführen von Function via String

Beitrag von georg »

Hallo, Dominik -

vom Grundsatz her immer: einfach mal ausprobieren:

Code: Alles auswählen

FUNCTION Main()
	Local cCallFunc
	cCallFunc := "Test('Hugo')"
	&(cCallFunc)
RETURN (.T.)

FUNCTION Test(cP1)
	IF cP1 == NIL
		MsgBox('juju')
	ELSE
		MsgBox(cP1)
	ENDIF
RETURN (.T.)
Aber: wenn Du Parameter übergibst, die als LOCAL definiert sind, dann wird das nicht funktionieren (können). Literale oder Private/Public sollten keine Probleme machen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: Ausführen von Function via String

Beitrag von brandelh »

bist du sicher dass die Funktion auch in einer local Var stehen darf ?
Ich dachte Macros machen nur publics ?

Immer schön an die Fehlerbehandlung denken, wenn der Code im Programm von Eingabe zusammengebaut wird.
Gruß
Hubert
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: Ausführen von Function via String

Beitrag von Tom »

Nur der Inhalt eines Makros darf ausschließlich PRIVATEs oder PUBLICs referenzieren - und keine Funktionen, die STATIC sind. Das Makro selbst darf ohne Zweifel in einer LOCAL gespeichert werden. Es wird ja der Inhalt ausgeführt. :wink:
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: Ausführen von Function via String

Beitrag von brandelh »

Ja ja das mit dem Kalk :oops:
Gruß
Hubert
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Ausführen von Function via String

Beitrag von Dominik Krebs »

Super, vielen Dank für die Hife.

Kennt sich denn zufällig noch jemand mit der ADS PHP Erweiterung auf einen Ubuntu 16.04 aus?
Habe probierte diese zu aktivieren/installieren jedoch möchte er den PHP Installationspfad von mir haben.
Er akzeptiert ihn aber leider nicht.

Hat jemand hiermit Erfahrung?
Gruß Dominik
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Ausführen von Function via String

Beitrag von georg »

Hallo, Dominik -


nein, keine direkte Berührung, aber schick doch mal per Privater Nachricht einen Screenshot.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten