Beiträge von alpines

    Ein Tipp für den Interpreter,


    sofern du die Variablen $switch_e und den Rest nicht abrufst kannst du die StringReplaces auch für die gleiche Variable nutzen, bsp:

    Global $sString = "Hallo1234"
    $sString = StringReplace($sString, "H","h")
    $sString = StringReplace($sString, "a","A")
    ;...

    Das spart Platz im RAM.


    Und ein weiterer Tipp für die Zukunft, bitte gewöhn dir an, die neuen Versionen im ersten Thread einzubinden bzw. hotzulinken, sonst findet man die neuen Versionen in den ganzen Seiten nicht!

    Ich finde es schön das du versuchst eine eigene Scriptsprache zu entwickeln aber da fallen mir einige Dinge dabei auf:


    1. Wozu Zeilenangabe ganz oben? Bei deinem Interpreter kannst du doch die Anzahlen der @CRLFs zählen und dann sieht der Code besser aus.
    2. Wenn du mit der neuen Sprache Sachen einfacher gestalten kannst, dann halte ich das für eine sehr gute Idee, aber


    wenn bei einem komplizierteren Syntax nichts besseres/neues dazukommt dann ist das nicht viel wert. Da ist die Zeit in AutoIt besser investiert.

    Ich bin mir nicht ganz sicher ob es dir hilft aber wenn im Source-Code im Link unter name= nichts vermerkt ist kannst du es ja mal mit _IEFormSubmit versuchen?
    Wird wahrscheinlich nicht funktionieren aber kannst du ja mal testen.

    Wenn welche vorhanden sind dann steht da für Benutzername 1 was in der Ini in Id1 steht.
    Wenn nichts steht steht da glaub ich gar nichts oder 0.


    Schreib erstmal die Ini per GUI + Speichern und ruf die dann nochmal auf!
    Dann sollte es dort angezeigt werden.

    Da haben es wir ja mit einem ganz neuen Frischling zu tun :D
    Auch das ist leicht getan!


    Du musst aufpassen bei dem SendOne und SendTwo, dann es kann ja sein das du nicht beides hintereinander haben möchtest.
    Wenn die ID hallo wäre und das PW toaster dann wäre das bei dieser Variante wenn du den HotKey dafür drückst: hallotoaster
    Wenn du aber ein Enter dazwischen haben möchtest wäre dazwischen noch ein Send("{ENTER}"), die Tastenbefehle dafür kannst du in der Hilfe hier nachschlagen.

    HotKeySet("{F7}", "SendOne")
    HotKeySet("{F8}", "SendTwo")
    HotKeySet("{F9}","Edit")


    While 1
    Sleep(2000)
    WEnd


    Func SendOne()
    Send(IniRead(".\\settings.ini", "Login", "Id1", ""))
    Send(IniRead(".\\settings.ini", "Login", "Pw1", ""))
    Endfunc


    Func SendTwo()
    Send(IniRead(".\\settings.ini", "Login", "Id2", ""))
    Send(IniRead(".\\settings.ini", "Login", "Pw2", ""))
    Endfunc


    Func Edit ()
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1_1 = GUICreate("Form1", 135, 182, 436, 141)
    $Benutzername1 = GUICtrlCreateInput(IniRead(".\\settings.ini", "Login", "Id1", ""), 8, 24, 121, 21)
    $Passwort1 = GUICtrlCreateInput(IniRead(".\\settings.ini", "Login", "Pw1", ""), 8, 48, 121, 21)
    $Benutzername2 = GUICtrlCreateInput(IniRead(".\\settings.ini", "Login", "Id2", ""), 8, 80, 121, 21)
    $Passwort2 = GUICtrlCreateInput(IniRead(".\\settings.ini", "Login", "Pw2", ""), 8, 104, 121, 21)
    $Speichern = GUICtrlCreateButton("Speichern", 8, 136, 113, 33)
    GUISetState(@SW_SHOW)


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Speichern
    IniWrite(".\\settings.ini", "Login", "Id1", GUICtrlRead($Benutzername1))
    IniWrite(".\\settings.ini", "Login", "Id2", GUICtrlRead($Benutzername2))
    IniWrite(".\\settings.ini", "Login", "Pw1", GUICtrlRead($Passwort1))
    IniWrite(".\\settings.ini", "Login", "Pw2", GUICtrlRead($Passwort2))


    EndSwitch
    WEnd
    EndFunc

    Freut mich das es jemandem gefällt :)


    Zu der Sache mit der ganzen Funktion zu integrieren.
    Ich weiß nicht wie man einen String solven lassen kann.
    Wenn man in AutoIt einen String hat z.B.
    $sFunction = "12*(x-2)+4"
    Dann kann man den String ja nicht solven lassen, es gibt keine Funktion dafür, deshalb muss man das leider so machen.
    Man braucht diese Funktion wenn man das in eine GUI einbauen möchte die für die Gleichung eine statt viele InputControls hat.


    Wenn man eine Solve-Funktion hat dann kann man ich die ganze Funktion integrieren und dann die Werte von 1-3 auslesen.
    Das gleiche ist bei Punktsteigung und Ableitung von Funktionen so.

    Du kannst auch Send("lala" & "lala" & "{ENTER}")
    statt Send("lala")
    Send("lala")
    Send("{ENTER}")



    HotKeySet("{F7}", "SendOne")
    HotKeySet("{F8}", "SendTwo")
    HotKeySet("{F9}","Edit")


    While 1
    Sleep(2000)
    WEnd


    Func SendOne()
    Send(IniRead(".\\settings.ini", "Login", "Id1", ""))
    Send(IniRead(".\\settings.ini", "Login", "Pw1", ""))
    Endfunc


    Func SendTwo()
    Send(IniRead(".\\settings.ini", "Login", "Id2", ""))
    Send(IniRead(".\\settings.ini", "Login", "Pw2", ""))
    Endfunc


    Func Edit ()
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1_1 = GUICreate("Form1", 135, 182, 436, 141)
    $Benutzername1 = GUICtrlCreateInput("Benutzername", 8, 24, 121, 21)
    $Passwort1 = GUICtrlCreateInput("Passwort", 8, 48, 121, 21)
    $Benutzername2 = GUICtrlCreateInput("Benutzername", 8, 80, 121, 21)
    $Passwort2 = GUICtrlCreateInput("Passwort", 8, 104, 121, 21)
    $Speichern = GUICtrlCreateButton("Speichern", 8, 136, 113, 33)
    GUISetState(@SW_SHOW)


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Speichern
    IniWrite(".\\settings.ini", "Login", "Id1", GUICtrlRead($Benutzername1))
    IniWrite(".\\settings.ini", "Login", "Id2", GUICtrlRead($Benutzername2))
    IniWrite(".\\settings.ini", "Login", "Pw1", GUICtrlRead($Passwort1))
    IniWrite(".\\settings.ini", "Login", "Pw2", GUICtrlRead($Passwort2))


    EndSwitch
    WEnd
    EndFunc

    Hi,


    ich hab mir letztens mal das Thema Integralrechnung angeschaut und dachte mir das wäre doch in AutoIt machbar.
    Falls jemand nicht weiß, was ein Integral ist hier eine kurze Erklärung + Rechnung:



    Das wars auch eigentlich schon, die Rechnung könnt ihr euch im Script anschauen, es gibt noch Besonderheiten bei negativen Werten deshalb ist das If da.


    Wichtig für beide Versionen!!!
    Ihr müsst die Werte unterschiedlich bei unterschiedlichen Funktionen runden da es nur Näherungswerte sind.
    So wäre bei f(x) = x an der Stelle 1 bis 3 3.99970000500089 bei einem Step von 0.0001 4!

    Wichtig für die Version ohne Solver!!!


    Script hier oder im Anhang


    Da die Performanz in AutoIt in einigen Bereichen oder generell zu wünschen lässt, kann es bei kleineren Schritten länger dauern.


    Wenn jemand eine andere Methode kennt das Integral rauszufinden oder einen anderen Lösungsweg weiß bitte her damit!
    Ich weiß das man die ganze Funktion integrieren kann aber allein um die Funktion "12*(x-2)+4" zu trennen bzw. den String zu solven dauert das ein bisschen.
    Mit Execute und StringReplace geht das ganze viel besser von der Hand.


    Hoffentlich gefällts euch, Kritik und Lob erwünscht!

    Meine Messmethode war folgende:


    TimerInit vor dem $sUpdatePacket und TimerDiff hinter TCPCloseSocket.
    So hab ich es bei meiner Methode gemessen.


    Bei der InetRead-Methode kommt die Zeit zum konvertieren dazu:
    TimerInit vor dem BinaryToString(InetRead(... und das TimerDiff dahinter.


    Ich hab das ein paar mal durchlaufen lassen und bei meiner Methode waren es rund ~100-105ms und bei InetRead + BinaryToString waren es ~120-190ms.
    Da sich der 190ms Wert aber nicht häufig wiederholte und sich bei etwa 120-150 einpendelte ist somit meine Methode (wenn man meine Messmethode beachtet) schneller.


    So wie du das hast hab ich das in etwa auch gemessen, und bei mir war meine Methode schneller.
    An der Internetleitung kann es nicht liegen, weil du ja beide Messungen an der gleichen Leitung durchgeführt hast, ich hab auch dieselbe Leitung benutzt.


    Woran es aber liegen könnte wäre folgendes:


    Da man nicht weiß was InetRead genau macht, kann man nur spekulieren. So könnte InetRead bei wiederholtem benutzen die Verbindung zum Server aufrechterhalten haben bzw. kein TCPShutdown benutzt haben.
    Wenn wenn ich InetRead 1x oder 2x benutze ist es langsamer als meine Variante.


    Und da man die Versionsnummer ja nur einmal braucht und nicht 50x wäre meins im einmaligen Gebrauch schneller :)

    Wenn du den ersten Eintrag hast schneidest du alles was links von dem was noch nicht angeschaut wurde weg und wiederholst das bis RegEx einen Fehler bzw. keinen Eintrag returnt.
    Der Return-Code für Error/keine Einträger sollte in der Hilfe stehen.

    Wenn es möglich ist, dann kannst du die Control im TaskMgr auslesen und bearbeitet reinschreiben.
    Dann würde dein Prozess wegfallen, aber es wäre möglich ihn per AutoIt Commands zu beenden, sofern man den Prozessnamen weiß.

    Du kannst aber auch statt InetRead auch einfach per TCPSend / TCPRecv und einem Paket die Website abfragen.
    Dann fällt StringToBinary weg aber du hast ein paar Zeilen an Code mehr aber der Code ist schneller als InetRead.
    Meine Methode braucht (auf meinem System) nur ~100ms während InetRead knapp ~120-190ms braucht.



    $sUpdatePacket = "GET /test/update.txt HTTP/1.1" & @CRLF & _
    "Host: http://www.v1dr333s.nl" & @CRLF & _
    @CRLF
    TCPStartup()


    Do
    $hServer = TCPConnect(TCPNameToIP("v1dr333s.nl"), 80)
    Until $hServer <> -1


    TCPSend($hServer, $sUpdatePacket)


    Do
    $sUpdateHTML = TCPRecv($hServer, 512)
    Until $sUpdateHTML <> ""


    $sUpdateVersion = StringTrimLeft($sUpdateHTML, StringInStr($sUpdateHTML, @CRLF, 1, -1) + 1)


    TCPCloseSocket($hServer)
    TCPShutdown()


    MsgBox(64, "Update-Version", "Die aktuelle Version ist: " & $sUpdateVersion)


    Hoffentlich blickt ihr da durch :D

    Dateien

    Bin mir nicht ganz sicher ob die If-Verzweigung so funktioniert.
    ProcessExists returnt die PID, wenn es aber den Prozess nicht findet dann returnt es (lt. Hilfe) 0.


    Ich würde es so vorschlagen:

    If ProcessExists("Programm1.exe") > 0 Then
    Run("Programm2.exe")
    Else
    Run("C:\Skript.exe")
    Sleep(550)
    EndIf


    Hab es nur theoretisch durchdacht, hab es nicht ausprobiert.

    Nur so als Tipp am Rande, fürs saubere coden.

    $header = $header & ;...
    ;ist das gleiche wie
    $header &= ;...


    Desweiteren musst du folgendes beachten, wenn du nicht _WinHTTP benutzt.


    Wenn der Server die Einstellung "Transfer-Encoding" auf "chunked" stellt. So musst du solange TCPReceiven bis du keine neuen Daten mehr dazu bekommst!

    Das brennt ja in der Seele :D
    Achtung, "Programm2.exe" muss sich im selben Ordner wie das Skript (was ich unten gepostet hab) befinden, ansonsten geht die Pfadangabe!!


    So sollte es vermutlich richtig sein:

    ProcessWait("Programm1.exe")
    If ProcessExists("Programm1.exe") Then
    Run("Programm2.exe")
    Else
    Run("C:\Skript.exe")
    Sleep(550)
    EndIf

    Du könntest die Mausposition abfragen und dazu noch abfragen ob das Fenster aktiv ist.
    Anschließend _isPressed (#include <Misc.au3> nicht vergessen) abfragen ob ein rechtsklick getan wurde.


    Wenn du die Anzahl aller Labels weißt dann einfach
    ClipPut(GUICtrlRead($Label1)&GUICtrlRead($Label2));...


    Wenn es ein fremdes Fenster sein soll kann ich dir nur raten AutoIt Window Info zu nehmen und zu prüfen ob neue Label da sind.

    m-obis Vorschlag kann ich nur zustimmen.


    Source-Code Optimierung zahlt sich immer aus.
    Du kannst auch das

    _FileCreate

    weglassen, da FileWrite automatisch die Datei erstellt wenn sie nicht existent ist.
    Dann sparst du an einem include, wenn du es nicht andersweitig verwendest.


    Eventuell solltest du auch prüfen ob die Dateien gelöscht wurden (funktioniert immer wenn man die Rechte dazu hat, einige haben sie aber vielleicht nicht).
    Aber das ist eigentlich überflüssig, wollt ich nur mal am rande gesagt haben!


    Desweiteren machen mich dein Variablennamen ein bisschen nervös :)

    $File = FileRead

    man weiß nicht wenn man die Variable $File irgendwo anders verwenden möchte, welcher Typ sie ist.
    Ein Fehler befindet sich aber in der Zeile. (Ich hab nur den Snippet angeguckt.) Wenn du die Datei die du FileReaden möchtest nicht geöffnet hast dann ist das nicht gut.
    Gewöhn es dir an

    $hFile = FileOpen ;h steht für Handle. Die einzelnen Buchstaben bzw. Variablenamen kannst du unter "ungarische Notation" googlen.
    $sFile= FileRead($hFile) ;s steht für String.
    FileClose($hFile)


    Aber das sind nur Schönheitsfehler, bzw. Code-Optimierungsfehler aber das kommt sicherlich noch!