1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. aSeCa

Beiträge von aSeCa

  • Execute bei komplizierterem/mehrzeiligen Code

    • aSeCa
    • 3. März 2019 um 15:53
    Zitat von alpines

    Es ist gar nicht so schwierig das zu tun, ich habe erst gestern ein Beispiel dazu gepostet, mit skalierbarer GUI bei verschiedenen Elementen.

    Ja, das habe ich auch schon genutzt, aber das wird dann halt erst bei Ausführung in der GUI angezeigt und nicht im Editor. Und das macht es etwas "lästig" :)

  • Execute bei komplizierterem/mehrzeiligen Code

    • aSeCa
    • 3. März 2019 um 15:36

    Verstehe, danke.

    Dann bleibt mir, wenn ich die GUI-Elemente nicht in einer Schleife erzeugen will (weil ich den ISN GUI Editor nutzen möchte), wohl wirklich nur die Variante, dass ich mir die einzelnen Variablen alle in ein Array zusammenpacke.

    Danke für die Hilfe, so weiß ich wenigstens, dass es sich nicht weiter optimieren lässt :)!

  • Execute bei komplizierterem/mehrzeiligen Code

    • aSeCa
    • 3. März 2019 um 15:20
    Zitat von alpines

    Was soll dass denn deiner Meinung nach machen?

    Im Endeffekt wollte ich die Frage erst so stehen lassen, dann habe ich noch rumprobiert. Ich dachte mir, dass das, was hinter der Variable mit der Referenz auf die Combobox ist, vllt. auch die Combobox anspricht.

    Also es sollte mir das holen, was hinter "$cb1" (etc.) steht...

    Gibt es eine Möglichkeit, an die Referenz zu kommen, die in einer Variable abgespeichert ist, wenn ich die Variable im Code nur als String habe?

  • Execute bei komplizierterem/mehrzeiligen Code

    • aSeCa
    • 3. März 2019 um 15:08
    Zitat von alpines

    Execute solltest du nicht verwenden, wenn du da den Überblick verlierst kann man da Code injecten und das ist nicht sehr gut.

    Mehrzeilige Anweisungen sind über Execute sowieso nicht möglich.

    Verwende lieber Arrays dafür. Du musst einfach nur ein Array erzeugen und dort die ganzen Handles zu den Labels einspeichern.

    Anschließend rufst du eine For-Schleife auf und gehst das Array durch und setzt die Infos.

    Hey, danke für die schnelle Antwort.

    Stimmt, das kann ich natürlich auch so machen :)

    Kriege ich dieses Array denn auch so generiert?

    Code
    $aComboboxes[2] = [$cb1, $cb2]

    kann ich ja machen, kriege ich das auch über eine Schleife hin? (macht den Code einfacher und kürzer) Also, dass AutoIt versteht, dass ich die Referenz auf ein GUI-Element setzen will?

    So scheint es nicht zu gehen:

    Code
    $iCheckboxCount = 15   
    Dim $aCheckboxes[$iCheckboxCount]
     
        For $h = 0 To UBound($iCheckboxCount) - 1
            $aCheckboxes[$h] = Eval("cB" & $h + 1)
        Next
  • Execute bei komplizierterem/mehrzeiligen Code

    • aSeCa
    • 3. März 2019 um 14:33

    Hey zusammen,

    wie kann ich Execute() nutzen, um z. B. eine Schleife durchzuführen?

    Code
    Execute ('For $i = 0 To 3 MsgBox(4096, "", "Test" & $i) Next')

    Ich habe schon versucht @CR und @CRLF zu nutzen und habe keine Idee, wie ich das zum Laufen bringe.

    Mein Anwendungsfall ist, dass ich diverse Auslöser für eine Funktion habe, die dann 15 Label aktualisieren soll. Ich möchte nun ungern einfach 15x den Dreizeiler schreiben und lieber eine Schleife laufen lassen. Die Label sind alle schön nach einem Muster ala "labInfo1", "labInfo2", etc. aufgebaut und so dachte ich mir, dass ich das mit Execute gut verkürzen/vereinfachen können müsste.

    PS: Ich könnte in dem Beispiel und in meinem Code die Schleife natürlich einfach um das Execute packen, aber ich möchte gerne das Konzept verstehen, da ich Execute wirklich spannend finde :)

    Danke

  • DLL Call (InternetGetCookieW)

    • aSeCa
    • 26. Januar 2019 um 22:22

    BugFix vielen Dank für deine Hilfe :)! Ist ja interessant mit dem Null-terminiert, gut zu wissen.

    Und wirklich nur IE? Herrje... Ja, dann ist das wirklich von fragwürdigem Nutzen. :) Hatte es anders verstanden und mich gefreut, was gefunden zu haben. Die WinHttp.au3 hat ja leider kein richtiges Cookie-Handling und ich dachte, dass ich damit an die Cookies komme oder im Zweifel zumindest die aus Chrome.

    In WinHttp kommt man ja an den Header und "Set-Cookie:", aber mir erschließt sich einfach nicht, wie daraus der wirkliche Cookie wird, den der Server dann wieder erwartet.

    Ich verfolge mal den Hinweis mit dem Auslesen aus den Verzeichnissen, danke dir.

    -> Bei Chrome ist das in einer SQLite-Datenbank hier abgelegt:

    Code
    C:\Users\<your_username>\AppData\Local\Google\Chrome\User Data\Default\

    Aber lässt sich nicht so leicht zugreifen (https://stackoverflow.com/questions/2253…okies-in-chrome)... ^^

  • DLL Call (InternetGetCookieW)

    • aSeCa
    • 26. Januar 2019 um 19:00

    Hallo,

    ich versuche grade das erste Mal, einen DllCall zu nutzen und komme nicht so richtig weiter. Für die gewollte Funktion habe ich sogar ein Beispiel gefunden, das aber auch nicht (mehr) funktioniert.

    Der aktuelle Stand ist folgender:

    Code
    Local $sCookie = _InternetGetCookieW("https://autoit.de")
    If @error Then
        ConsoleWrite(@error & @CRLF)
    Else
        ConsoleWrite($sCookie & @CRLF)
    EndIf
    
    Func _InternetGetCookieW($sUrl, $iBufferSize = 2048) ; WinINet: https://docs.microsoft.com/en-us/windows/desktop/api/wininet/nf-wininet-internetgetcookiew
        Local $tSize, $tCookie, $aResult
    
        $tSize = DllStructCreate("DWORD")
        DllStructSetData($tSize, 1, $iBufferSize)
    
        $tCookie = DllStructCreate("WCHAR[" & $iBufferSize & "]")
    
        $aResult = DllCall("Wininet.dll", _
            "INT", _
            "InternetGetCookieW", _
            "STR",  $sUrl, _
            "PTR",  0, _
            "PTR",  DllStructGetPtr($tCookie), _
            "PTR",  DllStructGetPtr($tSize) _
        )
    
        If @error Then
            Return SetError(1)
        ElseIf $aResult[0] = False Then
            Return SetError(2)
        Else
            Return DllStructGetData($tCookie, 1)
        EndIf
    EndFunc
    Alles anzeigen

    Der DLL-Call gibt mir immer immer einen Fehler zurück und ich verstehe nicht, warum das so ist. Hat jemand eine Idee?

    Vielen Dank

  • ISN AutoIt Studio

    • aSeCa
    • 22. Januar 2019 um 22:18
    Zitat von ISI360

    Kannst du mir das nochmal genauer erklären? Du meinst den "Projekt kompilieren" dialog, oder?
    Normalerweise läuft alles was kompiliert wird über den Wrapper...von daher sollte das eigentlich keinen unterschied machen.

    Über den "Stern" (F7), also "Projekt kompilieren" werden meine

    Opt("TrayAutoPause", 0)

    Opt("TrayMenuMode", 7)

    (aber auch andere Variationen) nicht berücksichtigt. Über Tools -> AutoIt3Wrapper GUI -> Compile Script schon.

  • ISN AutoIt Studio

    • aSeCa
    • 22. Januar 2019 um 08:02

    Hey, wenn ich die ISN-Kompilieren-Funktion nutze, werden die Opt() für TrayAutoPause und TrayMenuMode nicht übernommen. Wenn ich über Tools die AutoIt3Wrapper GUI nutze, dann schon.

  • _ArrayAdd() und Initialisieren von Arrays

    • aSeCa
    • 18. Januar 2019 um 16:20
    Zitat von alpines

    Oder einfach meinen Beitrag nicht gelesen.

    ... Entschuldige! Wirkt sehr unhöflich :/ Danke auch dir!

    Habe das "Redim / ArrayAdd" falsch interpretiert und zu schnell weitergelesen... Ich werde für den nächsten Thread draus lernen. ^^

  • _ArrayAdd() und Initialisieren von Arrays

    • aSeCa
    • 18. Januar 2019 um 16:00

    Cooles Tutorial :)

    Bitnugger: Genau das habe ich gebracht, danke! Habe wohl einfach zu viel nachgedacht und im Kopf einfach ausgeschlossen, dass das mit 0 funktioniert...

    Vielen Dank! (*Kopf auf Tisch*...^^)

  • _ArrayAdd() und Initialisieren von Arrays

    • aSeCa
    • 18. Januar 2019 um 07:15
    Zitat von alpines

    Du vergleichst im 1. Skript die Dimensionen und das ist vollkommen richtig was der Interpreter macht.

    Wenn du Arrays initialisierst und sich im Nachhinein füllen möchtest, kannst du auch als Dimensionsgrößen [0][3] nehmen, musst aber wenn du Einträge hinzufügst ReDim/_ArrayAdd nutzen.

    Das kann bei großen Arrays schon viel Zeit kosten, wenn du vorher berechnest wie viele Einträge dazukommen und du das Array nur einmal erweiterst ist das wesentlich schneller.

    Wenn du uns verrätst was du in den Arrays speicherst und wo die Informationen herkommen und wie du sie im Array speicherst, können andere Datenstrukturen dir vielleicht besser aushelfen.

    Dictionaries sind eine sehr tolle Alternative zu Arrays, und können - richtig eingesetzt - auch schneller sein.

    Hey, alles klar. Ich dachte mir, dass es auch eine Möglichkeit gibt, 2D-Arrays "leer" zu initialisieren. Das hat mich grundsätzlich interessiert.

    Dass andere Datenstrukturen und sicherlich auch AutoIt-Objekt mir an einigen Stellen Optimierungen bieten, habe ich auf dem Schirm, das schaue ich mir mal in Ruhe an, bevor ich dazu um Hilfe/Tipps bitte :)

    z. B. Informationen zu Büchern eines speziell gesuchten Autoren zu sammeln und anzuzeigen, also 1. Dimension die Bücher, 2. Dimension die Informationen zu diesen, das lässt sich ja sicherlich nett mit Objekten regeln, denke ich mir. Und zu den Datenstrukturen gibt es ja auch ein paar Threads!

  • _ArrayAdd() und Initialisieren von Arrays

    • aSeCa
    • 18. Januar 2019 um 00:31

    Hey zusammen,

    ich komme einfach nicht hinter, wie ich mein Problem einfacher löse. Ich habe nun sehr lange nach einem Fehler in meinem Skript gesucht und dann folgendes bemerkt:

    Code
    #include <Array.au3>
    
    Dim $aTest[1][3]
    Dim $aTest2[1][3] = [["A", "B", "C"]]
    
    If UBound($aTest) = UBound($aTest2) Then MsgBox(4096, "Hmmm","Doof!")

    Das war mir nicht klar... Ich habe öfter den Fall, dass ich Ergebnisse einer Funktion in einem Array ablegen lasse und das Array dynamisch in einer Schleife mit _ArrayAdd() gefüllt wird. Dafür initialisiere ich es halt wie im Code angezeigt. Dass ArrayAdd() dann aber sozusagen in beiden Varianten den 2. Wert anlegt, hat mich total irritiert...

    Jetzt löse ich das so...

    Code
    Dim $aTest[1][3]
    _ArrayDelete($aTest, 0)

    und dann fülle ich das Array (mit erstmal unbekannter Größe!) danach mit _ArrayAdd().

    Das kommt mir irgendwie doof vor und ich bin mir sicher, dass es eine bessere Lösung geben muss...

    Jetzt gibt es ja noch andere Datentypen, aber für 2D-Werte und wenn mir immer einfaches durchschleifen reicht scheinen Arrays ja doch die einfachste Lösung zu sein? Ich kann natürlich die Schleifen auch alle mit 1, statt 0 anfangen, jedoch entstehen Arrays ja auch manchmal anders und dann wird das etwas verwirrend, wenn manche mit 0 anfangen, manche mit 1. Der Code soll ja langfristig verständlich sein...

    Vielen Dank

  • Snippets online stellen und nutzen

    • aSeCa
    • 13. Januar 2019 um 11:02

    Hallo,

    ich erinnere, mich dass es mal einen Autoit-Online-Compiler gab, der das Ergebnis dann auch direkt ausgeführt hat. Leider kann ich das oder nichts vergleichbares wiederfinden. Gibt es da etwas, bzw. kennt ihr sowas?

    Ich finde nur Compiler, wo man die Datei dann direkt runterlädt.

    Mir geht es darum, Freunden kleine Snippets zur Verfügung stellen zu können, die einfach nur ein paar Dinge sortieren, berechnen, etc. Aber ich möchte dafür keine GUIs bauen (Ausgabe in der Console stelle ich mir vor) und die sollen dafür kein AutoIt brauchen.

    Oder gibt es eine Möglichkeit, AutoIt-Skripts irgendwie "Website-like" zur Verfügung zu stellen? Ich weiß, dafür ist es nicht da und es wäre vllt. logisch, sich dann mit einer anderen Sprache zu beschäftigen, aber ich mag AutoIt. :)

    Danke!

  • ISN AutoIt Studio

    • aSeCa
    • 5. Januar 2019 um 10:03

    Echt tolles Projekt, wahnsinnig nützlich - vielen Dank :)!

    Ein Hinweis: Beim der GUI-Ansicht, bei Checkboxen fehlt (mir) noch der Style "$BS_PUSHLIKE". Man kann ihn anwenden und er wird auch ordentlich angezeigt. Kein großes Hindernis, ihn selber einzugeben, wenn man erstmal weiß, dass es ihn gibt, dennoch wäre es damit vollständig/er :)

  • Adlibregister() vs. Timer

    • aSeCa
    • 30. Dezember 2018 um 15:51
    Zitat von Oscar

    AdlibRegister ist blockierend!

    Die Funktion, die dort aufgerufen wird, blockiert das Hauptscript und alle weiteren Adlib-Funktionen.

    "_Adlib2()" wird erstmal alle 500 ms aufgerufen, bis das erste Mal "_Adlib1()" aufgerufen wird. Die Funktion braucht 5 Sekunden und wird nicht unterbrochen. Wenn die 5 Sekunden um sind, kommt einmal "_Adlib2()" dran und dann gleich wieder "_Adlib1()".

    Deswegen sollte die aufgerufene Funktion nie länger dauern, als bis zum nächsten Aufruf.

    Hey, das würde meine Vermutung ja bestätigen und ist ja sehr sinnvoll :). Mit dem Wissen kann ich das hoffentlich effektiver einsetzen, vielen Dank!

  • Adlibregister() vs. Timer

    • aSeCa
    • 30. Dezember 2018 um 15:05

    Hey, danke. Also damit ich das richtig verstanden habe: Wenn ein Adlib ausgeführt wird, unregistrierst du alle anderen Adlibs und setzt die dann wieder in einen Intervall, in denen die einige Zeit nicht stören sollten?

    Ist da implizit auch die Antwort mit drin: "Ja, eine zweite Adlib überschreibt die Aktion der ersten Adlib."?


    Spannend wäre auch, wie sich Variablen verhalten, wenn die gleiche Funktion mit Adlib aufgerufen wird, nur mit einem anderen Parameter durch eine Hilfsfunktion.
    Also z. B. ich habe "AdlibA" und "AdlibB", die ich registriere und AdlibA ruft "FUNC" mit dem Parameter "a" auf und AdlibB ruft "FUNC" mit dem Parameter "b" auf. Werden dann die Variablen überschrieben oder ist das dann eine eigene Instanz?


    Ich habe das mal so probiert nachzuvollziehen:

    Code
    #include <Date.au3>
    
    AdlibRegister("AdlibA", 1000)
    AdlibRegister("AdlibB", 2000)
    
    While Sleep(50)
    WEnd
    
    Func AdlibA()
        Test("A")
    EndFunc
    
    Func AdlibB()
        Test("B")
    EndFunc
    
    Func Test($param)
        ConsoleWrite("[" & _NowTime() & "] START: " & $param & @CRLF)
        Sleep(5000)
        ConsoleWrite("[" & _NowTime() & "] STOP: " & $param & @CRLF)
    EndFunc
    Alles anzeigen

    Output ist:

    Zitat

    [15:33:42] START: A

    [15:33:47] STOP: A

    [15:33:47] START: B

    [15:33:52] STOP:B

    [15:33:52] START: A

    [15:33:57] STOP: A

    [15:33:57] START: B

    [15:34:02] STOP: B

    ; usw...

    Alles anzeigen

    Daraus schließe ich, dass die Adlibs sich nicht gegenseitig stören und in einen "Pool" gegeben werden, der nacheinander abgearbeitet wird. Das ist schon mal super :) Ich verstehe nur nicht, warum nun immer A>B>A>B kommt. Ohne den Sleep() gab es immer A>A>B>A>A>B

    Daraus schließe ich, dass das Setzen der Adlibs zwar eine Dominanz nach Reihenfolge der Registrierung setzt, jedoch jedes Adlib nur einmal in diesem Pool sein darf.

    Ist das Skript dazu geeignet, solche Schlussfolgerungen zu ziehen?

  • Adlibregister() vs. Timer

    • aSeCa
    • 30. Dezember 2018 um 14:30

    Hey, ich möchte gerne Adlibregister besser verstehen, um einschätzen zu können, wo sich eher ein Timer und eher ein Adlibregister anbietet. :)

    Meine Suche hat mich da bisher nicht so weitergebracht, sind eher sehr praktische Fragen, außer z. B. https://www.autoitscript.com/forum/topic/19…ister-vs-timer/

    Ich wüsste gerne, wie Adlibregister sich verhält und wie dominant es ist - vor allem bei mehreren Adlibregister'n.

    Aus der Hilfe wird ja klar, dass Adlibregister sich Vorrang verschafft und solange das Hauptscript pausiert. Wie ist das, wenn man mehrere registriert und die zufällig "durcheinander geraten"?

    Habe z. B. 2 Adlibs, eine, die alle 5 Sekunden was ausführt und eine, die alle 60 Sekunden was ausführt und beide Funktionen brauchen auch mal 5 Sekunden oder so. In dem Beispiel würden die beiden regelmäßig gleichzeitig laufen wollen.

    Ich gehe mal davon aus, dass das in AutoIt nicht so einfach parallel passiert.

    Wie verhalten sich die Funktionen nun? Wird die, die zuerst gestartet ist, sich dominant verhalten und nicht stören lassen? Wenn ja, gibt es dann einen "Adlib-Pool" und die andere legt danach sofort los?

    Oder gilt für Adlibregister in Sachen Dominanz nur das Starten der Funktion und danach gilt es als "Hauptskript" und wird von folgenden Adlibregister'n unterbrochen? Wenn ja, macht das 1. Adlibregister dann danach weiter, wo es unterbrochen wurde?

  • Logging und Debugging verbinden

    • aSeCa
    • 28. Dezember 2018 um 13:10

    Hey Moombas, so habe ich mir das auch vorgestellt. Hatte nur die Hoffnung, dass man das vereinfachen kann... Ich schreibe doch recht kurze Funktionen zwecks Wiederverwendbarkeit und das verdoppelt ja fast die Zeilen des Codes (nicht ganz, aber du weißt schon).

    Wenn sich da keiner mit einer Erleuchtung in Richtung Automatik meldet, werde ich das wohl mal genauso starten, wie du es vorgeschlagen hast.

  • Logging und Debugging verbinden

    • aSeCa
    • 28. Dezember 2018 um 11:35

    Hey,

    ich suche eine Möglichkeit, wie ich möglichst einfach ausgeben kann, was mein Skript grade tut. Also welche Funktion wurde aufgerufen (wenn möglich auch mit welchen Parametern), welche danach, etc...

    Gibt es da eine Möglichkeit?

    Ich arbeite immer mit endlos vielen ConsoleWrite und teilweise MsgBox'en, um zu verfolgen, ob Skripte das tun, was sie sollen und neben dem, dass das auch auskommentiert den Code schwerer lesbar macht, ist das recht aufwendig, das überall vorzusehen und es auch wieder auszukommentieren, wenn man den Fokus auf einen bestimmten Teil legen will.

    Am Besten wäre eine einfache Möglichkeit, das auch - sogar im kompilierten Skript - ausgeben lassen zu können.

    :thumbup:

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™