Beiträge von nnako

    Sauber, Bitnugger, vielen Dank.


    Der Fehler lag in meiner eigenen Berechnung. Ich hatte die Fensterbreite falsch ermittelt und das hat das Chaos verursacht. Konnte dies allerdings erst finden, als ich mir über ein geeignetes Debugging (per AutoitStudio und DBUG) gedanken gemacht hatte, bei dem man ALLE Variablen auf einmal checken konnte. _ScreenCapture_CaptureWnd() funktioniert also auch mit negativen Werten zuverlässig.

    Danke, Oscar, für die schnelle Rückmeldung :) .


    Du fragtest nach der Notwendigkeit für das Koordinaten-Auslesen. Ja, ich möchte eigentlich beim Screenshot den linken (und rechten) Rand der jeweiligen Darstellung wegschneiden und benötige daher eine Möglichkeit, die spezifischen Koordinaten für den ScreenShot anzugeben. Allerdings scheint es bei _ScreenCapture_CaptureWnd() so zu sein, dass obwohl man ja einen Window-Handle angibt, die Angabe von einschränkenden Koordinaten ABSOLUT interpretiert werden. Bei Angabe einer X-Position wird also nicht die Position RELATIV zum Rand des gewünschten Fensters $hGUI verwendet, sondern der ScreenShot startet im linken Bildschirm. Nicht im gewünschten Fenster.


    Weiterhin ist es so, dass ich (trotz Angabe von $hGUI und ohne weitere Koordinaten) immer auch den rechten Bildschirm im ScreenShot erhalte. So, als würde die Funktion nicht rechtzeitig "halt" machen.


    Habe es also weiterhin leider noch nicht lösen können.


    Gibt es weitere Möglichkeiten, die ich probieren könnte, um einen ScreenShot eines klar definierten Bereichs innerhalb eines Fensters zu erhalten, wenn ich mehrere Bildschirme angeschlossen habe?

    Hallo,


    ich möchte gern mehrere Screenshots machen, habe allerdings drei Bildschirme angeschlossen und fürchte, dass die ScreenShot-Funktion bei negativen Koordinatenangaben durcheinander kommt...



    AUSFÜHRUNGSUMGEBUNG


    - Windows v10 (aber gleicher Effekt bei Windows v7...)

    - Autoit v3.3.15

    - drei Bildschirme am Rechner angeschlossen:



    Die Ecke links/oben des "screen 01" hat die Koordinate (0,0). Die Koordinatenangaben entsprechen den Ausgaben des Programms "Autoit Window Info". Es ergeben sich negative x-Koordinaten für die Bildschirme 2 und 3



    TEST-PROGRAMMCODE




    PROGRAMMABLAUF


    Nach dem Start des Skripts passiert folgendes:


    (1) die Präsentation wird geöffnet und im Präsentationsmodus auf "screen 03" (mittlerer Bildschirm angezeigt.

    (2) die Fenster-Koordinaten werden detektiert. Diese entsprechen den Angaben in "Autoit Window Info" (x=-1920, y=0, width=1920, height=1080)

    (3) es wird auf eine "leere" Präsentation geprüft (dies ist hier aber nicht relevant und funktioniert auch)

    (4) der Bildschirmausschnitt wird aufgezeichnet (capture)


    -> erwartet hätte ich, dass lediglich der mittlere Bildschirm "screen 02" aufgezeichnet wird

    -> allerdings werden Bildschirme "screen 02 " und "screen 01" als großes Gesamtbild aufgezeichnet


    Wenn ich das Testscript mit einem Rechner ausführe, an dem nur EIN Bildschirm angeschlossen ist, so erfolgt das aufzeichnen wie erwartet. Daher würde ich vermuten, dass _ScreenCapture_Capture() möglicherweise mit negativen Angaben nicht gut klarkommt.


    Kennt das jemand? Kann mir jemand helfen?


    Danke erstmal.

    Hallo,


    vielen Dank erstmal für die Antworten.



    Was erwartest du? ...
    Debuggen/Fehler suchen läuft darauf hinaus den Fehler zu analysieren, ...
    Dazu muss man sich intensiv mit dem Code auseinandersetzen...


    Was "debuggen" heißt, wissen wir wahrscheinlich beide ;) . Es ging mir nur um die Verfügbarkeit und Verwendbarkeit eines passenden Werkzeugs, das einem die Arbeit erleichtern könnte. Händisch zusätzlichen Code zur Ausgabe von Statuswerten oder Zwischenergebnissen in den zu debuggenden Code einzufügen, halte ich einfach für aufwändiger als das Arbeiten mit einem ECHTEN Werkzeug, wie es der "Autoit Debugger" versucht zu sein. Vorteile wären (Du fragtest, was ich erwarte):


    - keine Notwendigkeit zur Eingabe von zusätzlichem Code um das Debugging durchzuführen
    - dynamische Unterbrechbarkeit des Programmdurchlaufs an beliebiger Stelle
    - Einzelschritt-Modus der Programmabarbeitung sowie Breakpoints und Trigger
    - dynamische Konfigurierbarkeit der Ausgabe beliebiger Variablen und Speicherauszüge
    - ...


    Einfach so, wie es das für andere Programmiersprachen i.d.R. auch gibt (egal, ob kommandozeilenbasiert wie z.B. PDB für Python oder grafisch wie per Eclipse). Die Verwendung eines solchen Debuggers bewahrt mich davor, mein AutoIt-Skript immer und immer wieder von vorn ablaufen lassen zu müssen, mich dann durchzuklicken, bis ich an die fragliche Stelle komme,... dann zu merken, dass ich die Ursache für das merkwürdige Programmverhalten dort nicht in der erwarteten Weise (mit den codierten Print-Ausgaben) finden kann,... dann das ganze nochmal von vorn...


    Ich nehme also mit, dass es für AutoIt kein nutzbares, echtes Debugging-Werkzeug der in diesem Beitrag beschriebenen Art gibt.



    Da kann ich in AutoIt auch DebugMsgboxen oder Consolenausgaben per Tastaturshortcut in den Code eingeben, den Fehler finden und per Shortcut alle wieder loswerden!

    Gibt es zur Einrichtung solcher Tasten-Shortcuts und der entsprechenden Code-Teile bereits nutzbare Anleitungen hier im Forum?


    Danke.
    nnako

    Hallo,


    ich bin nach wie vor auf der Suche nach einer Möglichkeit, meinen (teilweise länglichen) AutoIt-Code schmerzfrei zu debuggen. Weiter oben in diesem Thread wurde (vor einigen Jahren) eine händische Methode beschrieben, die auf jeden Fall für das Debugging kleiner und kleinster Programme geeignet ist, und die sicher heute noch Gültigkeit haben wird. Aber wie sieht es mit dem Debugging von großen Projekten aus? Ich lese ab und zu mal was von einem "AutoIt Debugger", der seit vielen Monaten in der Version 0.47.0 z.B. über heise.de erhältlich ist, dessen Homepage aber nicht besonders lebendig aussieht.


    - Hat damit schon jemand Erfahrungen gesammelt?
    - lohnt sich eine (zunächst aufwändig wirkende) Installation?
    - ist dieses Tool brauchbar? Mit welchen Einschränkungen?


    Danke.
    nnako

    Nun muss ich aber doch nochmal bzgl. _EXCEL_RangeCopyPaste() nachfragen. Und zwar versuche ich beim Kopieren OHNE das Clipboard auszukommen. Also direkt die SourceRange (als Objekt) in die TargetRange (als Objekt) eines anderen Workbooks einzufügen. Mir scheint es so, als würde es folgendermaßen aussehen:


    -> es ist für die Operation irrelevant, ob der Parameter $oWorkbook das Source- oder das Target-Workbook ist
    -> die beiden Parameter $iPaste und $iOperation sind irrelevant für den direkten Kopiervorgang
    -> es wird immer ALLES (incl. Formeln, bedinten Formatierungen,...) von Source nach Target kopiert


    Ist das wirklich so? Soll das so? Oder habe ich einen Fehler gemacht?


    Eigentlich möchte ich nur die "Values" der Zellen direkt übertragen, nicht die anderen Eigenschaften.

    Hallo,


    habe mir beide Vorschläge angeschaut und dann festgestellt, dass es am einfachsten wäre, ich täte Folgendes:


    - Einlesen der gesamten strukturierten Textdatei in eine Stringvariable
    - Durchsuchen des Strings nach interessierendem "Knoten" per StringInStr()
    - Sprung an den Beginn des Knotens und sukzessives Auslesen der weiteren Komponenten


    Eigentlich brauche ich ja gar nicht die komplette Struktur des Dokuments, sondern immer nur Einzelinformationen. Und da ist dann das direkte Suchen doch angebracht.


    Vielen Dank erstmal für die Rückmeldungen und Ideen.

    er ist leider bereits sehr lang... daher hier gekürzt und hoffentlich lauffähig...


    EDIT, 16.11.2014: CODE auf wesentliche Inhalte gekürzt


    Hallo,


    seit vielen Stunden versuche ich die Excel UDF der Autoit v3.3.12.0 produktiv zu verwenden. Folgende Aufgabe:


    - es sollen eine Reihe von Spalten mit jeweils fester Länge
    - von einem Workbook in ein anderes kopiert werden
    - dabei können die Inhalte der Spalten jeweils Werte, Text, Datumsangaben oder Mischungen derselben enthalten


    Die Grundstruktur des Code ist hier dargestellt:


    - in einer FOR-Schleife werden ca. 10 vordefinierten Zellnamen durchgegangen
    - zunächst werden die Koordinaten der entsprechenden Zellbereiche ermittelt
    - und die Zellen per _Excel_RangeRead() in einer Arrayvariable zwischengespeichert
    - dann erfolgt das Aufspüren der jeweiligen Zielzellen im anderen Workbook
    - und das Hineinschreiben der zwischengespeicherten Arrayvariable per _Excel_RangeWrite()


    Es ergibt sich folgendes Problem: Die Zellen in meinem Quell-Workbook enthalten nicht nur Zahlen ("Values"), sondern auch manchmal mehrzeiligen Text oder Datums-Werte. Wenn ich also bei _Excel_RangeRead() den Parameter "iReturn" mit [1=values] wähle, läuft die Kopiererei so lange durch, bis beim Lesen per _Excel_RangeRead() eben dieser mehrzeilige Zelleninhalt erkannt wird und folgende Fehlermeldung erscheint:


    "Error: The requested action with this object has failed"
    Der Fehler bezieht sich dabei auf Zeile 732 in der "Excel.au3" der oben erwähnten Version. Dort scheint ein Transpose nicht zu funktionieren.


    In einem weiteren Schritt versuchte ich, die reinen Textkomponenten der Zellen auszulesen. In der Hoffnung, dass die Werte auf diese Weise als Text mit berücksichtigt werden. Wenn ich aber _Excel_RangeRead() mit dem Parameter "iReturn" = [3=the displayed text] aufrufe, bleiben ALLE Zellen nach dem Kopieren in das andere Workbook LEER.


    Weiter versuchte ich, zunächst per <range>.NumberFormat = "@" eine Umwandlung der Values (und Texte) in Texte zu bewirken und dann mit "iReturn" = [3] zu kopieren, aber auch dann bleiben die Zielzellen komplett leer.


    Hat jemand eine Idee, wo möglicherweise mein Denkfehler liegt?


    Danke.

    Hallo,


    ich möchte auf komfortable Weise das Erzeugen und Auswählen eines Verzeichnisses ermöglichen. Der Dialog, der bei FileOpenDialog() geöffnet wird, ist prinzipiell genial. Auch die Auswahlmöglichkeiten beim Dialog des FileSelectFolder() scheint brauchbar. Eine reine Erzeugungsfunktion wäre DirCreate(). Allerdings gibt es jeweils ein Problem:


    - bei FileOpenDialog() kann man zwar Verzeichnisse erzeugen, den Dialog aber nicht ohne Dateiauswahl erfolgreich beenden
    - bei FileSelectFolder() kann man keine Verzeichnisse anlegen, sondern nur bestehende Verzeichnisse auswählen
    - bei DirCreate() hat man keinen Dialog, sondern muss das Verzeichnis bei Funktionsausführung schon kennen


    Gibt es eine Funktion, die mir per Dialog das ERZEUGEN eines Verzeichnisses und das AUSWÄHLEN des Verzeichnisses mit anschließender Verzeichnisnamen-Rückgabe ermöglicht?


    Danke und Gruß
    nnako