Evaluierung dynamischer Ausdrücke für AutoHotFlow

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
bichlepa
Posts: 167
Joined: 15 Aug 2014, 06:44
GitHub: bichlepa
Contact:

Evaluierung dynamischer Ausdrücke für AutoHotFlow

14 Feb 2015, 07:33

Bei der Arbeit an AutoHotFlow stehe ich vor einer schweren Herausforderung. Ich möchte eine Aktion "Skript" und eine Bedingung "Expression" einführen. Dafür muss ein Code, der zuvor in ein Edit-Feld eingegeben wurde, ausgeführt werden. Eine Erschwernis ist, dass alle Instanzen der Flow Ausführung eigene Variablen besitzen, was eine unabhängige parallele Ausführung verschiedener Instanzen erlaubt. Beim Setzen und Holen von Variablen muss eine der beiden von mir geschriebenen Funktionen aufgerufen werden:
  • v_setVariable(InstanceID,name,value,VariableType="Normal")
  • v_getVariable(InstanceID,name,VariableType="Normal")
Ich habe schon verschiedene Möglichkeiten probiert:
  • ExprEval von Uberi. Im Allgemeinen funktioniert es super, nur das Holen und Setzen von Variablen mithilfe der erwähnten Funktionen ist nicht möglich. Vielleicht könnten man die Funktion umschreiben, aber der Code ist zu kompliziert für mich.
    Oder man könnte vielleicht in einer neuen Funktion alle Variablen einer Instanz als lokale Variablen schreiben und dann den Text evaluieren (was aber erfordert, dass die Evaluierung auf die lokalen variablen zugreifen kann oder innerhalb der Funktion erfolgt)
  • Eval - Dynamic expression evaluation for AutoHotkey_L von Fincs. Dieselbe Geschichte wie bei ExprEval.
  • Generierung eines externen Skripts, in dem vor der Ausführung des eigentlichen Skripts alle Variablen gesetzt werden und am Ende alle Variablen zurückgesendet werden. Dies habe ich bereits umgesetzt, aber die Performanz ist sehr niedrig, da dafür ein neuer AHK Prozess gestartet werden muss.
  • Ersetzen von Variablennamen im Skript durch neue mit einem Präfix, z.B. Instance_5_var_... Dafür müsste man aber sämtliche Variablen erkennen, was schwierig sein dürfte bei der Fülle an ahk Befehlen.
Denkbar wäre auch, eigene Funktion zur Evaluierung zu schreiben, was aber zu kompliziert und zeitraubend wäre.

Habt ihr Ideen, wie das zu machen ist?
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
User avatar
bichlepa
Posts: 167
Joined: 15 Aug 2014, 06:44
GitHub: bichlepa
Contact:

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

15 Feb 2015, 11:56

Ich habe jetzt doch eine eigene Funktion geschrieben. Eine sehr hilfreiche Anleitung habe ich unter http://www.sunshine2k.de/coding/java/Si ... arser.html gefunden. Es ist halb so wild, wie ich mir vorgestellt habe.
Es hat bei weitem nicht die Funktionalität von AutoHotkey und hat wahrscheinlich deutliche Performance Einbußen, aber es ist besser als nichts. Es werden folgende Operatoren unterstützt: =, ==, !=, <, >, <=, >=, +, -, *, /, || bzw or, && bzw and, ! bzw not.

Ganz vom Tisch ist das Problem nicht. Es wäre wünschenswert, dass AutoHotFlow alles unterstützt, was AHK auch kann, daher ist jede Hilfe weiterhin willkommen.
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

15 Feb 2015, 12:49

Das funzt hier ganz wunderbar

Code: Select all

ExprInit() ;initialize the Compile() and Eval() functions
x := 12
e := ExprCompile("x**2")
y := ExprEval(e)
msgbox,% y
...aber vllt misverstehe ich deine Problemstellung.
Um beliegigen ahk code (also nicht nur expressions) auszuführen vllt mal ahk_h/ahkdll antesten.
User avatar
bichlepa
Posts: 167
Joined: 15 Aug 2014, 06:44
GitHub: bichlepa
Contact:

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

15 Feb 2015, 13:15

So weit war ich auch. Ich schreibe mal einfach ein Beispielcode, der das Problem ohne viele Worte beschreibt:

Code: Select all

	InstanceID=5 ;Instanznummer einer Ausführung eines Flows
	Instance_%InstanceID%_LocalVariables:=Object() ;Erstelle Objekt, in den alle lokalen Variablen für eine Ausführung gespeichert werden
	v_setVariable(InstanceID,"kontostand",5000) ;Setze Variable kontostand
	v_setVariable(InstanceID,"schulden",4000) ;Setze Variable schulden
	MsgBox % "Gesetzte Variablen:`nkonstostand: " v_getVariable(InstanceID,"kontostand") "`nschulden: " v_getVariable(InstanceID,"schulden")
	
	teststring=% "kontostand - schulden"
	
	MsgBox I am starting
	;Evaluiere den Ausdruck. Dabei werden die Variablen "kontostand" und "schulden" über die Funktion  "v_GetVariable(InstanceID,varname)" geholt
	res:=v_EvaluateExpression(InstanceID,teststring) 
	MsgBox % "Result of " teststring " is " res 
Hier kann man den Code herunterladen zum Ausprobieren:
https://www.dropbox.com/s/wxcxtcefewqwy ... es.7z?dl=0
Scripting is too complicated? Try AutoHotFlow, the graphical automation tool! Written in AutoHotkey.
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

23 Feb 2015, 09:54

So weit war ich auch.
Dann kann man aber das
Ersetzen von Variablennamen im Skript durch neue mit einem Präfix, z.B. Instance_5_var_... Dafür müsste man aber sämtliche Variablen erkennen, was schwierig sein dürfte bei der Fülle an ahk Befehlen.
im Falle der expressions durchführen. Wenn du allgemeinen ahk code ausführen willst brauchst du einen Interpreter, und iirc wird der, und da wiederhole ich mich gerne, von ahk_h/ahkdll geliefert.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 1 guest