Includen und manuelles aufrufen einer automatisch startenden UDF

  • Guten Abend :)

    Ich hole für ein vermutlich einfaches Problem ziemlich weit aus, daher gibt es einmal die Kurzfassung und einmal die ausführliche Version :D

    Kurzfassung:

    Spoiler anzeigen

    Wie schaffe ich es dieses Skript aus einer anderen au3 Datei, per Funktion aufrufbar zu machen?

    Quelle:

    https://pastebin.com/n2cpRNS0 & https://pastebin.com/mre6xLhc

    Laaaannnnggggeeee Version:

    Spoiler anzeigen

    Ich habe mir mit Autoit bzw. SciTE4AutoIt3 ein recht umfangreiches Programm erstellt, das soweit auch wie gewünscht funktioniert, allerdings nur solange auf dem System Autoit installiert ist.

    Das Programm selbst besteht aus etwa 15 Au3 Dateien, die sich alle im selben Verzeichnis befinden, die einzelnen Skripte werden werden über eine GUI, z.B. über den folgenden Befehl aufgerufen:

    Code
    Run(@AutoItExe & " " & @ScriptDir & "\Skript_Nr9.au3")

    Nachdem kompilieren des "Haupt-Skriptes", welches die GUI beinhaltet und dazu verwendet wird alle anderen Skripte aufzurufen, können die au3 Skripte auf einem System auf dem Autoit nicht installiert ist natürlich nicht aufgerufen werden.

    (Dies ist mir leider erst im nachhinein aufgefallen, da ich zunächst nicht darüber nachgedacht hatte...)

    Normalerweise würde ich die au3 Skripte nun jeweils beispielsweise per

    Code
    #include "Skript_Nr9.au3"

    Befehl im Haupt-Skript einbinden und die einzelnen Skripte so umschreiben, dass diese nicht mehr direkt beim aufrufen des Skriptes ausgeführt werden, sondern über eine Funktion gestartet werden. Bei meinen selbst geschrieben Skripten funktioniert das auch, ich habe nun aber in den Tiefen des WWW, eine UDF gefunden, bei der mir das nicht gelingt.

    Konkret geht es bei der UDF um ein Programm zum abspielen von animierten GIF Dateien, das Programm besteht aus zwei Teilen, diese können hier Teil1 & hier Teil2 bezogen werden. Die Datei "DancingOnMyScript.au3" wird beim starten sofort ausgeführt und legt fest welche Animation abgespielt werden soll, die Animation selbst wird dann über Funktionen, dankt der "GIFAnimation.au3" Datei abgespielt.


    Wenn ich nun jedoch die Zeilen 8-43 des Skriptes "DancingOnMyScript.au3" in eine Funktion packe z.B.:

    Code
    Func _PlayGIF()
        .....
    EndFunc

    und diese Funktion anschließend über mein Haupt-Skript ausführe, wird die Animation nicht abgespielt, entweder beendet sich das Haupt-Skript direkt nach dem Start oder aber bleibt in einer Endlosschleife hängen, ohne dass ich nachvollziehen kann warum.

    Natürlich habe ich schon versucht mir den Zeitpunkt wann der Fehler auftritt in der Kommandozeile oder per MsgBox ausgeben zu lassen, diese wird aber gar nicht erst aufgerufen...

    PS:
    Die original URL, die im Skript angegeben ist, gibt es leider nicht mehr, daher sollte diese in Zeile 18 angepasst werden z.B. durch "https://media.giphy.com/media/MF1kR4YmC2Z20/giphy.gif"

    PPS: Den Thread GIF-Animation mit GDI+ hatte ich gesehen und auch alle dort genannten Skripte getestet, auch diese werden jedoch immer sofort, direkt nachdem starten der au3 Datei ausgeführt ohne dass dies über eine Funktion gesteuert werden kann...

    Außerdem gefällt mir die Version von "trancexx" einfach am besten, da diese die Animation ohne Rahmen darstellen kann und auch die Größe der Animation nicht händisch angegeben werden muss.

  • Hallo Getti


    Nachdem kompilieren des "Haupt-Skriptes", welches die GUI beinhaltet und dazu verwendet wird alle anderen Skripte aufzurufen, können die au3 Skripte auf einem System auf dem Autoit nicht installiert ist natürlich nicht aufgerufen werden.

    Ganz so ist das nicht. Du kannst einfach zu den Skripten oder in einen weiteren Ordner die AutoIt3.exe ablegen. Dort erstellst du einfach noch einen Include Ordner, in den die notwendigen Includes kommen und startest deine Skripte als Parameter.

    Etwa so: Run(@ScriptDir & "\AutoIt3\AutoIt3.exe" & @ScriptDir & "\Skript_Nr9.au3")

    Da musst du an deiner Struktur nichts ändern (wenn das hier für dich das beste ist..).

    Wenn du das besagte Skript als Funktion in dein Skript integrieren möchtest und deine Haupt-GUI bedienbar bleiben soll, dann darfst du nicht in einer While-Schleife in der Funktion verbleiben. In dieser Zeit reagiert dein Hauptskript nicht. Das ist der Grund für das einfrieren.

    Du kannst z.B. die GUI von der Animation global deklarieren (am besten oben in deinem Hauptskript) und steuerst das Beenden dann aus der Haupt-GUI. In der Funktion dann also keine weitere Schleife nutzen, sondern nur die GUI erstellen und sichtbar machen.

    EDIT: Hier habe ich mal ein Bsp. gemacht, wie man das machen könnte. Das Skript ist fast unverändert. Ich habe nur die Schleife entfernt und die Option "Schließen mit Escape" entfernt. Dafür wird nun Escape als Hotkey zum Schließen verwendet.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (29. Oktober 2017 um 07:47)

  • Hallo Getti !

    Grundsätzlich läßt sich eine .au3-Datei ausführen, indem Du den AutoIt-Interpreter verwendest, der sich in jeder kompilierten .exe-Datei befindet (hier z.B. Haupt.au3). Dazu muss AutoIt selbst nicht auf den Rechner installiert sein !

    Du musst an den Anfang der Haupt.au3 folgenden Befehl setzen :

    #pragma compile(AutoItExecuteAllowed, true)

    da AutoItExecuteAllowed defaultmäßig false ist.

    Aufruf eines Skriptes aus der Haupt.au3 :

    $PathToAu3Script = @ScriptDir & "\MeinSkript.au3"

    Run('"' & @AutoItExe &'" /AutoIt3ExecuteScript "' & $PathToAu3Script & '"')

    Es reicht jetzt aus, die Haupt.au3 zu 'kompilieren'. Dabei wird, wie gesagt, der Autoit-Interpreter in die Haupt.exe eingebunden.

    Dieser eingebundene Interpreter kann nun weitere .au3-Dateien verarbeiten, quasi genauso wie ein installiertes AutoIt !

    Zu deinem Gesamtkonzept gäbe es natürlich einiges mehr zu sagen ! Das ist, soweit erkennbar, nicht wirklich optimal;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    3 Mal editiert, zuletzt von Musashi (29. Oktober 2017 um 08:25) aus folgendem Grund: Tippfehlertag