Beiträge von BugFix

    Für deine Zwecke ist eine GUI dann aber weniger geeignet. Sowohl bewusst als auch unterbewusst wird in dieser kurzen Zeitspanne nur das Bild der aufpoppenden GUI wahrgenommen.

    Um gezielt Text erfassen zu können, solltest du diesen direkt auf den Desktop schreiben, über das jeweils offene Fenster.

    Das ist doch unrelevant. Helft ihr mir oder nicht?

    Nein, es ist nicht irrelevant.

    Nach deinem Rumgemaule bin ich mir ziemlich sicher, dass der Hinweis auf deinen Blog wohl eher eine Alibiaussage ist, da dir klar ist, dass für das tatsächliche Ziel hier keine Hilfe zu erwarten ist.

    Ich kann mich irren, aber ich irre selten.

    Es geht darum, dass automatisch auf eine bestimmte Stelle des Screens geklickt werden soll, sobald sich dort die Farbe ändert.

    Es geht um meine eigene Seite

    Wenn es deine eigene Seite ist, gestaltest doch DU SELBST die Inhalte. Wieso willst du dann mit einem Skript überwachen, welche Änderungen DU vornimmst?! :Face:

    So, nach ewigem Probieren und Suchen habe ich es (hoffentlich) hinbekommen. Teste mal, ob das wie von dir gewünscht funktioniert.



    EDIT:

    Hmm, das scheint so auch nicht zu gehen, wenn ich in die Async-Proc eine Schleife hänge, wartet Button_event bis die Schleife beendet ist - also nicht async.

    Das klassische TimerInit() / TimerDiff() aus AutoIt, allerdings in Nanosekunden Genauigkeit:

    Ich denke mal, das sollte auch mit asyncdispatch zu lösen sein. Leider sind die Beispiele nicht sehr hilfreich, basieren alle auf client-server Geschichten.

    Ich habe das so verstanden.

    - Mann benötigt ein Future-Objekt, das den Wert enthält der erreicht werden soll um die Async-Proc zu starten. Ich habe kein Bsp. gefunden, wie man newFutureVar den Zielwert zuweisen kann.

    - In der Async-Proc warte ich dann darauf, dass Future erreicht wird (so etwa: await future). "await" pausiert nur die Async-Proc.

    - die Async-Proc wird gestartet mit asyncCheck procXY()


    Aber ich habe hin-und herprobiert. Die Arbeit mit Future geht immer irgendwo daneben, Typ passt nicht oder Instanzierung der Prozedur nicht möglich. X(

    Da hatte ich auch schon mal gesucht.

    mainLoop() (wApp.nim #212) verwaltet nur die eigentliche Schleife: messageLoop() (wApp.nim #181).

    Aber wie man dort eigenes Handling einbringen kann....:?:

    Ich vermute, dass man alles über eigene Events regeln muss, die dann mit frame.wEvent_Irgendwas ausgeführt werden.

    Angeregt durch einen Beitrag von Oscar habe ich eine Art AdlibRegister erstellt. Ist allerdings an ein Fenster gebunden, da das Timer-Event über das Fenster registriert wird.

    Funktionen:

    • TimedProcRegister - Registriert eine (parameterlose) Funktion zum Intervallaufruf

    • TimedProcUnRegister - Löscht die Funktion aus der Aufrufverwaltung

    • TimedProcPause - Pausiert den Aufruf einer zuvor registrierten Funktion

    • TimedProcResume - Setzt die Ausführung einer zuvor pausierten Funktion fort

    • TimedProcGet - Gibt den Index für das gespeicherte Objekt in der Aufrufverwaltung zurück

    • TimedProcChangeTime - Ändert das Zeitintervall des Aufrufs


    EDIT:

    Alle Prozeduren (ausser ..Register) können jetzt wahlweise über den Prozedurnamen oder die Timer-ID aufgerufen werden.

    Neue Funktion zum Ändern der Timerdauer.

    Ich poste hier mal meine weiteren Schritte in diesem Projekt. Dann könnt ihr bei Bedarf auch experimentieren.

    Momentan sind es 3 Dateien ("sciteConstants.nim", "nsiface.nim", "main.nim") im Projekt (den Anhang in einen gemeinsamen Ordner entpacken). Stört euch nicht an "UnusedImport" in der main. Zum Testen braucht man die Imports dann doch, somit lasse ich sie immer drin.


    Hier mal die "main"


    Ich habe eine Prozedur LuaFuncGet zum Aufrufen von Lua-Funktionen (LuaCurrPos) mit Rückgabewert und wahlweise Übergabe von Parametern (2.ter Aufruf $(lcp.pos - 50).

    Für das Parsen des Returnwertes ist eine Funktion erforderlich (ParseLuaCurrPos), ebenso wird der Datentyp benötigt (EditorPosition) in dem der geparste Return gespeichert ist.

    Was mir fast den Nerv geraubt hat, war das Einbringen der Lua-Funktion. In meiner AutoIt-Version des Interfaces lief diese anstandslos. 1:1 übertragen und immer meckerte Lua, es würde ein "end" am Dateiende fehlen. Das ist erfahrungsgemäß ein Fehler der kommt, wenn z.B. versucht wird eine UTF8BOM-Datei in Lua zu verwenden, aber auch wenn vergessen wurde ordentlich zu maskieren. Das traf hier aber nicht zu. -- Die Lösung: In Nim darf der String mit der Lua-Funktion keine Zeilenumbrüche enthalten!

    Ich habe das jetzt zur Verwendung mit den Interface-Funktionen angepasst. Das Ergebnis einer Funktion wird in der Variablen "received" abgelegt.



    Jetzt kann ich mal ein wenig spielen und AddOns, die ich in Lua erstellt hatte, mit Nim ausführen.

    Ich habe nun versucht mein SciTEInterface auf Nim Basis auszuführen.

    Das Übertragen in Richtung SciTE klappt. Aber ich bekomme es nicht gebacken, die Callbackfunktion zu installieren. Sie muss vom Typ SENDASYNCPROC sein - das bekomme ich nicht umgesetzt. Die entsprechenden Bereiche sind auskommentiert.


    Zum Testen muss SciTE geöffnet sein, ich habe noch keine Fehlerbehandlung drin und gehe davon aus, dass ich ein Handle bekomme.

    Vielleicht habt ihr einen zündenden Gedanken .


    Das bedeutet, wenn ich das "Or" nicht mit Klammern von einander trenne, kann ich es auch gleich weg lassen und habe das gleiche Ergebnis?

    Du musst anders vorgehen.

    - 2 Kombinationen von Abfragen bringen ein gültiges Ergebnis, könne also mit Or verknüpft werden

    - da in jeder Kombination ein And verwendet wird ist die Kombination eindeutig durch Klammersetzung abzugrenzen

    Also: "Ereignis AND Person" stellt die Kombination dar.

    Werden mehrere der Kombinationen abgefragt, muss gesichert werden, dass diese nicht falsch verknüpft werden. Dazu einfach die einzelnen Ausdrücke einklammern.


    Das Or kannst du nicht weglassen, wenn es Bestandteil deiner Logik ist. In deinem Fall war die Abfragelogik einfach falsch.

    Ich sehe jetzt den Fehler, verstehe ich aber noch nicht.... Was ändert sich dann an dem Oder durch die Klammern?

    Hier mal deine Befehlszeile, so, wie AutoIt sie Interpretiert (And hat eine höhere Priorität als Or) - s. rote Klammern

    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") Or ($Aufgabe_auslesen = "Teller") And StringInStr($sSource, "Dennis")


    Du hast somit ein: If A And B Or C And D

    A & B & D müssen somit wahr sein, damit der gesamte Ausdruck wahr ist. Das Or spielt dadurch keine Rolle

    Du musst beide Or - Blöcke auch voneinander trennen. Im Moment hast du nur EINE Anweisung, die gemischte And/OR enthält. Wenn du diese nach ihrer Wertigkeit auflöst ist das False.

    So gehts:

    AutoIt
    $Aufgabe_auslesen = "Messer"
    $sSource = "bla bla Max Muster bla bla"
    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") Then MsgBox(0,$Aufgabe_auslesen, "geht doch 1" )
    If ($Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster")) Or ($Aufgabe_auslesen = "Teller" And StringInStr($sSource, "Dennis")) Then MsgBox(0,$Aufgabe_auslesen, "geht doch 2" )



    EDIT:

    Falls du mehrmals einen gleichartigen Vergleich vornehmen musst, kann es sich auch lohnen, das in eine Funktion auszulagern. Besser lesbar ist es dann meist auch:

    AutoIt
    $Aufgabe_auslesen = "Messer"
    $sSource = "bla bla Max Muster bla bla"
    If _Compare("Messer", "Max Muster") Or _Compare("Teller", "Dennis") Then MsgBox(0, $Aufgabe_auslesen, "geht doch 2")
    Func _Compare($p1, $p2)
    Return ($Aufgabe_auslesen = $p1) And StringInStr($sSource, $p2)
    EndFunc