Beiträge von BugFix

    Immer wieder im Einsatz: INI-Dateien. Nim stellt dazu das Modul parsecfg bereit. Eine Ini (Config) - Datei wird nach dem Laden temporär in einer Art Dictionary gehalten (ein OrderedTable of OrderedTables). Werden Änderungen vorgenommen, ist also am Programmende ein Schreiben in die Datei zwingend erforderlich (ini.writeConfig(ini_file)).

    Hier mal ein kleines Bsp.:


    EDIT

    Ich habe mal noch ergänzt um den Default-Wert beim Lesen eines Key.

    Für Delete- und Schreiboperationen gibt es Prozeduren im Modul.

    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.