Dynamische Funktionen?

  • Hallo zusammen,


    Ich arbeite derzeit an einem Problem und die Lösung möchte mir nicht so recht einfallen.


    Ich bin auf einen vielversprechenden Ansatz gestoßen:
    https://www.autoitscript.com/f…/17728-dynamic-functions/
    Leider ist es auf das ausgeben von einzelnen Zeilen beschränkt, IF abfragen oder Schleifen sind nicht möglich (soweit ich es zumindest getestet habe)


    Zur Nutzung:


    Der Nutzer soll über eine GUI ein Exportformat festlegen können ( Tabellarisch).
    Dafür ist ein Grundstock an Funktionen, Feldern und Operatoren vorgegeben, weiterhin ist eine Datenquelle vorhanden, auf die zugegriffen werden kann.


    Jetzt soll der Nutzer jeder Spalte eine Überschrift geben können und den Inhalt der Zeile dann eben über kleine Funktionen, z.B:

    AutoIt
    If $sStatus = 1 THEN Return 5 ELSE Return 10 EndIf

    bestimmen können.



    Die Spalte und den Autoit Code speichere ich in einer Datenbank, um die Daten entsprechend abrufen zu können.


    Das meiste ist schon fertig, allerdings fehlt das Herzstück, das aufrufen dieser UDFs.


    Ich habe mir auch schon diverse Plugin-Systeme angesehen, aber die meisten arbeiten nicht mit uncompiliertem AutoIt Code.


    hat jemand von euch schonmal etwas ähnliches geschrieben oder einen Link zu einem Projekt, in dem soetwas genutzt wird?


    Danke schonmal für die Hilfe
    LuBu

  • Mich hat das interessiert, deshalb hab ich mich mal drangesetzt etwas zu bauen, was du verwenden kannst.
    Statt das ganze über String zu machen habe ich mir überlegt, dass man alle Möglichen Spalten in ein Array schreibt (mit Namen, falls er nicht identisch mit dem in der Datenbank sein soll) und dann dort mit Comboboxen die Spalte auswählen kann. Wird nichts ausgewählt bleibt die Spalte leer. Will man Spalten zusammenführen kann man einen Operator anfügen (hab grad +,-,* und /, kannst du aber beliebig selber vergeben) und es erscheint eine neue Combobox, in der man eine Spalte auswählen kann und das "beliebig oft".
    Später kannst du dann einfach über das Array laufen und auslesen, was in den Controls steht und das verarbeiten. (Siehe Zeile 85-105)


    Beim Positionieren der Controls ist noch ein kleiner Fehler und beim Scrollen vertikal muss ich nochmal schauen. Hab grad keine Zeit mehr, mach ich die tage :)
    (Glaube das hängt mit der veränderten Fensterposition beim Scrollen zusammen...)
    EDIT: Fehler behoben. Das Problem war, dass Controls abhängig vom gescrollten sind, da die aktuelle Sichtfläche zum erstellen/verschieben von Controls genommen wird.


    Ich hoffe, das ist es was du umsetzen möchtest :)
    Das ausgelesene kann man dann ja recht einfach in eine passende SQLite abfrage umwandeln :)


    MfG Kanashius

  • Wenn die Daten sowieso schon in einer Datenbank liegen könnte man den Benutzer vielleicht auch einfach SQL Querys eingeben lassen und diese dann mit der SQL-UDF auf die Datenbank werfen?

  • Leider ist es nicht ganz das, was ich suche :)


    Falls es jemand kennt, ich suche nach einer Möglichkeit ähnlich zu Crystal Reports oder anderen Report-Designern.


    Ich bin allerdings heute Nacht auch auf eine Lösung gekommen.


    Execute() kann leider keine If...ElseIf...Else...EndIf oder Switch Anweisungen ausführen.
    Was man aber tun kann, ist die diese in einer Funktion zu bündeln.


    Diese kann dann auch über Execute ausgeführt werden:




    AutoIt
    Execute("IIf(10 = 11, 20, 30)")


    Ich mache mal weiter und poste das Ergebnis, vielleicht wird auch eine UDF draus ;)


    TheLuBu

  • Execute() kann leider keine If...ElseIf...Else...EndIf oder Switch Anweisungen ausführen.
    Was man aber tun kann, ist die diese in einer Funktion zu bündeln.

    Oder ein kpl. AutoItskript temporär erstellen und ausführen lassen. Dann kannst du problemlos mit allem, was AutoIt bietet arbeiten.
    Im Bsp. wird die AutoIt.exe aus der Installation bezogen, zum Ausführen kannst du aber auch ein kompiliertes Skript dazu mißbrauchen, denn die User werden sicher keine AutoIt-Installation haben.
    Hier mal für dein Bsp.: If $sStatus = 1 THEN Return 5 ELSE Return 10 EndIf