Beiträge von BugFix

    das Dim nicht mehr benutzt werden sollte, obwohl in der AutoIt-Hilfe kein Wort diesbezüglich zu finden ist

    Und das ist auch völlig richtig. Denn unabhängig, ob die Hilfe das empfiehlt oder nicht, ist es sinnvoll, wenn man sich für das Deklarieren von Variablen entscheidet, dieses im korrekten Scope zu tun. Dim ist und bleibt unkonkret wischiwaschi und ist aus Gründen eines guten Styles besser außen vor zu lassen.

    Soweit mein Senf dazu.

    ANSI? ==>> UTF-8!

    Jein.

    Ich kann damit (sicher) ausschließlich die Zeichen des ANSI Zeichensatzes identifizieren. Natürlich nutze ich dazu deren UTF-8 Darstellung. Aber eine Erkennung aller Zeichen des UTF-8 Bereiches ist damit nicht gesichert. Ich habe nicht analysiert, wie das Verhalten von erstem Byte und Zeichenlänge bei allen deren Zeichen ist. Für den ANSI Bereich hat dazu eine kleine Schleife gereicht. ;)


    EDIT:

    Ich habe mal die Kodierungsregeln für UTF8 näher angeschaut. Das lässt sich doch einfacher als vermutet umsetzen. Werde dann die Funktionen noch anpassen für den gesamten UTF8 Bereich.

    Die erste Version der Toolsammlung hatte ich hier gepostet.

    Da ich das aber sicher Schritt für Schritt erweitern werde, erstelle ich nun einen eigenen Thread dafür.


    Version 0.2

    Ich habe mich schon oft geärgert, dass man Probleme mit den Stringfunktionen bekommt, wenn ANSI Zeichen im String sind. Die Funktion string.len ermittelt die Länge anhand der Bytes. Bei ASCII Zeichen passt das, aber nicht bei ANSI. Dort sind die Zeichen 2 oder 3 Byte lang. Meine Funktion StringAnsiLen ermittelt neben der korrekten Anzahl der Zeichen auch deren Byte-Position (Start,Ende) im String. Das ist besonders dann von Interesse, wenn ich mich im Editor zeichenweise bewegen möchte.

    Auch beim Splitten eines Strings mit ANSI Zeichen in ein Table mit einzelnen Zeichen hat man die Probleme mit der Bytelänge. Das habe ich hier mit StringAnsiSplit gelöst.

    Als weitere Funktion habe ich GetIncludePathes erstellt, da ich in verschiedenen Anwendungen die Speicherorte der Includes benötige.


    Version 0.3

    Statt der Begrenzung auf den ANSI Zeichensatz, wird für die neuen Funktionen jedes UTF8 Zeichen erkannt.

    Dazu erforderlich: conversion.lua


    geändert:

    Code
    StringUTF8Len     Ermittelt die Anzahl der Zeichen (nicht - wie String.Len - die Anzahl der Bytes) bei Strings, die  UTF8 Zeichen enthalten
    StringUTF8Split   Splittet einen String und ohne Trennzeichen wird auch jedes UTF8 Zeichen korrekt als einzelner Eintrag erfasst

    Es geht nur um eine INFO-MSGBOX die am Programmanfang direkt aufgeht. Zu diesem Zeitpunkt hat der User die Maus wegen des Proggi-Starts sowieso noch in der Hand und bräuchte nur klicken, damit das Proggi weiter macht...

    Wenn der Inhalt der MsgBox ohne jeden Einfluß auf das Programm ist, setze doch ein Timeout von 1s (oder länger, wenn mehr zu Lesen ist).

    Es ist nicht möglich die Position des Buttons abzufragen und die Maus dorthin zu bewegen, weil das Skript pausiert, bis die MsgBox wieder verschwindet.

    Alternative: Bastele dir eine eigene MsgBox, wenn dir die Mausposition so wichtig ist.

    Du kannst natürlich die User auch animieren mal über den Tellerrand zu gucken und festzustellen, dass es eine Tastatur gibt, bei der mit einem ENTER die MsgBox zugeht. :rofl:

    Ich verwende in meinem SciTE ja ein Lua-Skript um den TimeStamp automatisch beim Speichern einzutragen.

    Der TimeStamp hat eine durch Property festgelegte Zeile, in der er eingefügt wird.

    Wenn ich jedoch ein Skript kompiliere, grätscht der Au3Wrapper ungefragt dazwischen, indem er

    a) seine Direktiven im Skript hinterlegt (was ich nicht will und erst nach dem Kompilieren passiert und somit nicht erforderlich ist)

    b) Diese Einträge werden einfach an den Skriptanfang gesetzt. Der User hat da andere Vorstellungen? - Ja leck mich, als Wrapper bin ich Chef!


    Dadurch wandert natürlich der TimeStamp im Skript unter die Zeilen mit den Wrappereinträgen. Ich kann natürlich nach dem Kompilieren einfach nochmal Speichern und dann wird das mit meinem Lua-Skript korrigiert - viel schöner wäre es doch, wenn man das mittels AutoIt automatisiert. Der Wrapper kann per INI gesteuert werden und enthält einen Schlüssel zum Ausführen danach:

    Ini
    [Other]
    Run_After=

    Nun habe ich ein Skript geschrieben, das mittels SciTE-Interface den Pfad der zum Kompilieren in SciTE geöffneten Datei holt, diese Datei in ein Array einliest und im Array die Zeilen an die gewollte Position verschiebt. Das funktioniert auch soweit, wie gewollt.

    Jedoch das Rückschreiben in die Datei ist wirkungslos. Ich hatte eigentlich erwartet, dass "Run_After" auch tatsächlich erst nach Beendigung des Wrappers läuft. Aber dem scheint nicht so zu sein. Die letzte Aktion des Wrappers ist, wenn ich dessen Code jetzt richtig verstanden habe, dass die Änderungen, die er intern an einer Tmp-Datei durchführt, im Skript landen und der Inhalt anschließend in den Editor eingefügt wird. Somit sind meine zwischenzeitlichen Änderungen am Skript wieder futsch.

    Die Bezeichnung "Run_After" ist somit m.M.n. irreführend und sollte heißen: "Run_After_Compile", ich hatte es nämlich als "Run_After_Wrapper" interpretiert.


    Falls ihr aber eine Idee habt, wie man NACH Beendigung des Wrappers automatisch ein Skript startet - lasst hören.


    Hier übrigens das Skript:

    Ich kompiliere ausschließlich 32bit. Das lief und läuft problemlos auf allen Systemen. Bei 64bit war (und ist?) das nicht immer der Fall. Und doppeltes Kompilieren mit Abfrage Systemumgebung ist mir zu overdressed. Ich habe auch noch keine Anwendung gefunden, die 64bit erfordert hätte. Und solange ich keinen echten Mehrwert davon habe, ändere ich das auch nicht.

    Bei der Installation wähle ich ebenfalls 32bit.

    Worauf bist du konkret gestoßen dass du dir überhaupt diesen Gedanken machst da eine Unterscheidung machen zu müssen?

    Hmm, ich hatte eigentlich gedacht, dass mein Code-Bsp. das recht verständlich aufzeigt.

    Ich versuche nochmal das zu abstrahieren:

    Die UDF beinhaltet Funktionen, mit denen der Anwender GUI-Elemente in seiner GUI erstellt. Diese Ctrl haben durch die UDF festgelegte Eigenschaften, die von den Standards abweichen. Zu diesem Zweck muss die Auswertung dieser Ctrl auch innerhalb der UDF passieren, da sonst die UDF-spezifischen Eigenschaften der Ctrl nicht zum Tragen kommen.

    Und da spielt es schon eine Rolle, welcher Event-Modus genutzt wird. Die alternative Nutzung des direkten Message Queues hatte ich ja ebenfalls als Möglichkeit erwähnt.

    Bei CommonTools.FolderExists prüfst du ja nicht wirklich, ob _Folder ein Verzeichnis ist... weil du kein BitAND in Lua hast?

    Ich prüfe nicht über die Attribute, sondern (genauso wirksam) über try-and error, indem ich versuche eine Datei in diesem Ordner zum Schreiben zu öffnen:

    Lua
    local file = _folder..'/CommonTools_Folder.Exists'
    local fh = io.open(file, 'w+') -- try to write to passed folder
    if fh ~= nil then fh:close() os.remove(file) return true
    else return false end


    Apropos Bit-Library - ich hatte mir mal eine etwas veraltete Biblothek auf neuere Lua-Syntax angepasst (dort wurde noch table.getn verwendet) und funktional etwas erweitert:

    Edit: Bekomme folgenden Fehler angezeigt...

    f:\\AutoIt\\AutoIt3_LuaScripts\TimeStampBackup.lua:76: bad argument #1 to 'PositionFromLine' (number expected, got nil)

    OK, das kann nur passieren wenn "'TimeStamp.Type.Line'" nicht gesetzt ist. Da muss ich wohl die Fehlerabfrage erweitern.

    Jetzt nervt mich nur, dass die AutoIt3Wrapper_GUI die eingefügten Zeilen an den Anfang des Scripts setzt und der TimeStamp dann nicht mehr in der gewünschten Zeile steht.

    Ja, das stimmt - ist nervig. Ich reagiere ja auf "OnBeforeSave". Anscheinend nutzt der Wrapper auch das Event. Somit muss ich mal versuchen, ob ich zusätzlich "OnSave" auswerten kann um auf Einträge des Wrappers zu reagieren. Ich hoffe nur, dass sich da nichts beißt und ich in einem Loop lande. :P

    Ich würde gerne Verzeichnisse/Dateinamen angeben, bei denen kein TimeStamp eingefügt und auch kein Backup gemacht wird. Das hatte ich mir in der alten Version eingebaut.

    Werde ich mit aufnehmen in der nächsten Version.

    Zudem, denke ich, musst du dein Script Au3OptMustDeclareVars.lua anpassen... denn das verschiebt den TimeStamp evtl. wieder in die erste Zeile, oder in eine andere, falls beim Speichern bereits Text eingegeben wurde.

    Da hast du leider Recht.

    Ich hatte ja bereits ein Skript (AutoStampSaveVersion) zum Einfügen eines TimeStamp und dem Erstellen eines Versionsbackups gefertigt.

    Das habe ich nun nochmal komplett überarbeitet. Wesentliche Funktionen, die auch für andere Skripte nutzbar sind, habe ich in das Modul "CommonTools.lua" ausgelagert.

    Das Skript kommt ohne die shell.dll aus (falls vorhanden - und von der verwendeten SciTE-Version ladbar - wird sie aber genutzt).

    Einige Properties haben neue Namen und Wirkungsweisen, hier mal mein Properties-Block für TimeStamp:


    Es wird also die gewünschte Zeile für den TimeStamp des Dateityps angegeben. Sollte die Datei noch leer sein landet der TimeStamp in Zeile 1, wird beim Speichern der Datei mit Inhalt dann aber verschoben, falls anders angegeben.

    Es werden jetzt die korrekten EOL für die aktuelle Datei ausgelesen und verwendet. Dadurch stimmt nun auch die Cursorposition nach dem Speichern.

    Wenn die Datei ein Coding-Cookie enthält, welches beim Einfügen des TimeStamp aus dem Erkennungsbereich (Zeile 1 & 2) verschoben wurde, wird das Cookie in die Zeile 2 verschoben.

    Der TimeStamp kann grundsätzlich in jeder Zeile stehen. Falls ein Cooding-Cooking vorhanden ist und dieses sich in der Zielzeile des TimeStamp befindet, genießt das Coding-Cookie Priorität und der TimeStamp wird danach platziert.

    Beim Speichern sprang die Ansicht immer zur Cursorposition - jetzt bleibt sie unverändert.


    Nochmals kurz zur Installation (ausführlich habe ich das in einem eigenen Post beschrieben):

    - Moduldatei "CommonTools.lua" speichern (in eigenem Lua-Skripte Ordner - diesen dann in der "SciTEStartup.lua" den package.path zufügen - oder in "..\SciTE\Lua"

    - "TimeStampBackup.lua" speichern

    - Die Datei muss beim SciTE-Start geladen werden, dazu diese in der "SciTEStartup.lua" eintragen (LoadLuaFile).


    Wie geht's?

    - Bei jedem Speichern wird der TimeStamp in der vordefinierten Zeile eingetragen/aktualisiert

    - Ist der Dateityp für das Backup registriert, wird beim ersten Speichern der TimeStamp mit der Versionsnummer "v 0.1" eingetragen und die Datei als Backup mit dieser Version gespeichert.

    - Möchte man für die aktuelle Datei das Backup vermeiden, obwohl es für den Dateityp aktiv ist, muss man an die erste Position im Editor ein Asterisk * eintragen (wird beim Speichern wieder entfernt). Es wird dann nur der TimeStamp ohne Versionierung eingetragen.

    - Um ein erneutes Speichern eines Backups zu erreichen, muss hinter den vorhandenen TimeStamp ein Marker gesetzt werden:

    • "v" Beim Speichern wird die SubVersion hochgezählt, die Mainversion wird beibehalten.

    • "V" Beim Speichern wird die MainVersion hochgezählt, die Subversion wird zurück auf "0" gesetzt.

    • "n" Eine neue Versionsnummer wird von Hand vergeben, indem man die vorhandene vor dem Speichern überschreibt (z.B. für Versionssprung)

    - Soll eine Datei, die nur einen TimeStamp enthält ohne Versionsnummer jetzt in das Backup übernommen werden, braucht einfach nur die Zeile mit dem TimeStamp gelöscht werden.



    Oh nee, diese UDF ist mal gar nicht up to date. Da sind sicher etliche Dinge verbesserungswürdig. Aber ob ich da noch mal dran gehe....

    Könntest Du mir ein Beispiel schreiben mit allgemeinen Parametern, welches ich mir dann apassen kann? Vielleicht für 2 Programmstarts, damit ich sehe, wie die Hirarchie aufgebaut sein muss.

    Ist wirklich einfach:

    AutoIt
    ;===================================================================
    ; vom Remote-PC 
    ; zum Start P1
    FileWrite("\\PC1\Run\P1.txt")
    
    ; zum Start P2
    FileWrite("\\PC1\Run\P2.txt")

    Bisher wird der Text eben abgeschnitten wenn das Fenster verkleinert wird anstatt angepasst..

    Das Resizing hat nur Einfluss auf die Abmessung des Labels, die Fontgröße hat damit nichts zu tun. Wenn du das zusätzlich anpassen möchtest, musst du WM_SIZING auswerten und im Verhältnis zur Größenänderung die Schriftgröße anpassen.

    Aber den Zahn kann ich dir gleich ziehen - denn das funktioniert einfach nicht!

    Ursache: Durch das Ermitteln des Verhältnisses musst du zwangsläufig runden. Die Rundungsdifferenzen führen dazu, dass bei mehrfacher Größenänderung du niemals zurück zur Anfangsgröße gelangst. Irgendwann wird die Schrift dann überproportional groß oder klein. Habe ich schon mal probiert.

    mikush

    Ich hatte mal in einem Netzwerk irgendwelche Rechteprobleme und es war mir zu blöd da meine Zeit zu verschwenden. Ich habe eine recht simple Lösung gefunden, da der Zugriff auf Freigaben funktionierte:

    Auf dem PC, wo ein Programm gestartet werden soll, dümpelt ein AutoIt Skript und prüft jede Sekunde ob eine Datei "start.txt" in der Freigabe existiert. Wenn ja - lokal das gewünschte Programm starten und die Datei wieder löschen. Du musst also vom Remote PC nur diese Datei in die Freigabe schreiben.

    Das erspart das Gefrickel mit Client-Server Konstrukten und funktioniert problemlos.


    [OT]

    Dieses Jahr trete ich auch dem Club der "60" bei. 8o

    [/OT]

    Nachtrag:


    In der Version im vorigen Post hatte ich die Reihenfolge der Fenster aus WinList ausgelesen, musste nun aber feststellen, dass WinList diese Liste ungeordnet erstellt. Somit wurde bei gleicher Klasse immer auf das zuerst erstellte Fenster zugegriffen.

    Habe ich in dieser Version korrigiert. Zusätzlich noch einen Fehler beim Auslesen aus Rootlaufwerken (Backslash wurde als Pfad mit übernommen).


    Bitte beachten:

    Diese Funktion setzt voraus, dass der Datei Explorer im Moment der Abfrage das aktive Fenster ist. Den Aufruf müsstest Du dann z. B. auf einen Hotkey legen in einem AutoIt Skript, das im Hintergrund dümpelt. ;)


    Hier mal noch eine Version, in der der Datei-Explorer nicht aktiv sein muss! Es wird das topmost Explorerfenster verwendet:


    EDIT: Eine Besonderheit von Windows muss man aber selbst beachten. Hat man im Explorerfenster im Tree einen Bibliotheksnamen ausgewählt, liefert Windows nicht den Speicherpfad, da es sich hier um eine Verlinkung handelt. Man bekommt stattdessen einen Leerstring. Hat man die Standardoption mit Ordneranzeige gewählt, erhält man dann einen Backslash und Dateinamen. Wählt man jedoch im Tree den unterhalb des Bibliotheksnamens stehenden Ordner, läuft alles wie gewollt.

    Das kann ich sicher noch in einem anderen Projekt gebrauchen.

    Ich hatte mir vor etlicher Zeit mal Möglichkeiten zum Erstellen von GUID zusammengesucht, vielleicht kannst du das auch brauchen: