Beiträge von alpines

    Hat zwar nichts mit einem Bot, aber sei's drum.

    Ach und gelesen habe ich sie. Danke, für den sehr freundlichen Hinweis. :)

    Neue User, insbesondere Anfänger, versuchen immer am falschen Ast zu sägen, da sie sehr unerfahren sind.


    Erzähl uns doch mal genau was du wo machen möchtest (in welchem Programm willst du Controls betätigen, Mausklicks senden, etc), dann können wir dir vielleicht besser helfen.

    Eventuell kommst du ohne Send-Funktionen aus, dann läuft dein Skript auch robuster.


    Vielleicht kannst du dir deine Arbeit direkt sparen, weil jemand dir zuvorkam und bereits eine Lösung hat?

    Warum sollte es keinen Sinn machen komplexe Programme in Autoit zu schreiben, wenn die Performance dafür ausreicht?

    Die Frage nach der Performance von AutoIt stellt sich nicht. Moderne CPUs können AutoIt ausführen und sind schnell genug.


    Das Problem ist, dass AutoIt nicht dafür ausgelegt ist. Nur weil mein Drucker einen Mikrocontroller beinhaltet und ich darauf DOOM spielen könnte, heißt es nicht, dass ich das auch machen sollte.

    AutoIt hält an anderen Paradigmen und Konzepten fest, als dass es sich eignet komplexe Programme damit zu schreiben.


    Ich sage nicht, dass es nicht möglich sein, ich sage nur, dass es viel bessere Alternativen gibt die einen nicht mit den Problemen belästigen die AutoIt einem an den Kopf wirft.

    Typensicherheit, DLL-Export, Inline-Assembly, Objektorientiertheit, Multithreading / Multiprocessing, Vernünftiges IPC, Prototypenimport von DLL-Funktionen wie bei Hochsprachen statt alles separat wrappen zu müssen, ...


    Versuch mal in C++ eine GUI zu erzeugen die auf Klick von Buttons die Maus umherfährt oder in Fenstern herumklickt.

    Und jetzt versuch mal in AutoIt eine (gut ein wenig übertrieben) Krankenhausverwaltung zu programmieren.


    Jede Sprache hat ihre eigene Daseinsberechtigung. Natürlich kann man in AutoIt Programme schreiben, und das kann ich auch nur jedem empfehlen der mal die Füße ins kalte Wasser namens Programmieren stecken möchte,

    aber wenn du auch nur etwas modulares bzw. wartbares basteln möchtest, dann geht es halt nicht in AutoIt ohne dafür UDFs ranzuziehen um diese Funktionen bereitzustellen (die wiederum dein Skript ausbremsen obwohl andere Sprachen das schon von Haus aus haben).

    AutoIt funktioniert einwandfrei, auch unter Windows10.

    Die Gegenfrage lautet dann : Welche Funktionalität fehlt?

    WPF Elemente ansteuern und das in der STL von AutoIt, nicht als UDF nachgeliefert.


    AutoIt ist schon etwas in die Jahre gekommen, das ist nicht zu leugnen, insbesondere wird das Manpulieren von GUIs in Zukunft wesentlich schwieriger werden weil Win32-Controls einfach ausgetauscht werden.

    Wenn da nichts kommt, fällt ein wesentlicher Teil davon weg.


    Auch ist meiner Meinung nach der Trend dazu, alle möglichen Feature Requests zu erfüllen ein Schritt in die falsche Richtung.

    Jetzt mal ganz ehrlich. DllCallAddress um u.a. expliziten Assembly-Code zu callen? In einer Skriptsprache????


    AutoIt4, sollte es je dazu kommen, oder wir schlauen Füchse im deutschen Forum entwickeln es einfach selbst x), sollte wieder auf die Wurzeln zurückgehen, nämlich Abläufe zu automatisieren.

    Klar, man kann mit Au3 auch komplexere Programme schreiben, aber das ist ja nicht der Sinn davon oder? (Ja... hab ich auch schon öfters gemacht)

    Ich verstehe die Hilfe zu diesem Befehl nicht, sieht für mich so aus, als ob ich eine Datei von irgendwo nach irgendwo anders kopiere. Falls tatsächlich inkludiert, sehe ich auch nicht, wie ich die Icons im Programm nutzen kann.

    Dann lies dir doch mal die Beschreibung in der Hilfe durch die ich verlinkt habe und probier das dazu verlinkte Skript auch gleich mal aus, vielleicht wird es dann klar?


    Die FileInstall-Funktion sorgt beim Kompilieren dafür, dass die Datei die du angibst in deine Exe eingeschrieben wird. Beim Start der Exe, wird die Datei dann in den vorgegebenen Pfad extrahiert, und steht dir zur Verfügung.

    Also FileInstall nutzen und dann später einfach auf den extrahierten Pfad zeigen lassen in deiner GUICtrlCreateIcon (oder welche Funktion du dafür verwendest).


    Du könntest natürlich auch die Icons selber erzeugen (scheint ja nicht sonderlich kompliziert auszusehen) indem du Gdi+ anschmeißt aber ohne herablassend klingen zu wollen, scheint das über deinem Wissensstand zu liegen und ist schon wesentlich komplizierter.

    Ich rate dir daher zur FileInstall-Variante, probier sie einfach mal aus.

    Das ist doch unrelevant.

    Wenn dem so wäre dann würden wir doch nicht rumstänkern oder? Es gibt bessere Wege das zu machen wie BugFix es vorgeschlagen hat.

    Wieso willst du noch eine Schicht Software dazwischenschieben? Löse es doch gleich über deinen Webserver / php-Skript. Da hast du direkten Zugriff und da kann auch nichts schiefgehen.

    Weißt du noch, alpines, früher

    Oh man, alleine vom Thumbnail ging mein Grinsen von einem bis zum anderen Ohr, absoluter Klassiker.


    Das scheint zu funktionieren. :)

    Na ist doch super, siehst du. Wenn man sein Erstgeborenes opfert und den falschen Göttern huldigt ist RegEx doch kein Hexenwerk.


    und später werde ich vielleicht ein angepasstes Demo-Script hochladen, falls es jemand interessiert.

    Nicht vielleicht, auf jeden Fall!

    Kennst du PassIt2 ? (Der Autor heißt genau wie du!) :D Lass mal die PassIt2.au3 von meinem Demo-Script durchsuchen und schau dir an was passiert, bzw. ob da bei dir überhaupt was passiert.

    So ein Zufall aber auch, wenn ich den Typen in die Finger kriege der meinen Namen einfach so klaut.


    Bei mir ist das Demo-Script abgestürzt.

    Das Pattern verursacht wohl einen Stack Overflow, denn wenn man nach und nach ein paar Zeilen löscht gibt er irgendwann ein Ergebnis aus. Ich schätze mal das Pattern sucht solange was bis es das findet und da platzt der Stack einfach.


    Hm, Ich reime mir das Pattern folgendermaßen zusammen.


    ...


    OK, Pause! - RegExp! :cursing: Es hat sich noch mehr dazugesellt, was ich nicht verstehe.

    Keine Sorge, das einzige was ich da geändert habe war das \h* einzufügen und das \R? durch \R zu ersetzen.


    Dein Regex sucht im Grunde zwei Patterns (das siehst du an dem Oder | weiter hinten.


    Im 1. Fall versuchst du gültige Funktionsheader zu matchen, das was ich da noch hinzugefügt habe war, dass nach der Klammer-zu \)\h*\R nur noch horizontale Whitespaces und ein Zeilenumbruch folgen muss.

    Wenn das Pattern nun gefunden wird, würde es ohne weiteres mit nichts ersetzt werden (nutzt ja StringRegExpReplace mit Replace = ""). Aber beim Fund überspringen wir das Ergebnis und lassen es mit (*F) ungültig werden, denn schließlich wollen wir ja gültige Funktionsheader nicht löschen.

    Wir überspringen damit auch Quasi den Oder-Zweig der danach kommt mit ^.*\R?

    Das Verfahren ist ähnlich zu dem was ich im CalltipViewer für PSPad4AutoIt3 angewandt habe. Wir suchen hier lieber nach der Zeichenfolge die gültig ist und negieren das Ergebnis, da die Menge an ungültigen Zeichenfolgen unendlich wäre.


    Im 2. Fall ersetzt du, sofern der Fall vor dem Oder nicht gematcht wurde einfach jede Zeile mit nichts und löscht sie quasi damit raus.


    wieso findet das hier nicht "EndFunc "?

    Tut es doch? Probier das Skript mal isoliert von anderen Patterns aus, ich nehme mal an, du entledigst dich den EndFuncs auf dem Weg und siehst sie deshalb nicht.

    Nochmal Edit:


    AutoIt
    StringRegExpReplace($sAllLines, '(?m)^\h*(?i)(\Q' & $sFuncTag & '\E)\h*\w+\h*\(.*\)\h*\R(*SKIP)(*F)|^.*\R?', "")

    So klappt das zwar, aber das Pattern hat glaube ich generell einen Fehler.


    Wenn die letzte Zeile einen Funktionskopf hat dann wird diese (auch vom vorherigen Pattern) nicht erkannt, das liegt an dem \R? (welches mittlerweile ein \R geworden ist) Eigentlich müsste da noch ein Oder String-Ende hin.

    Bin halt kein Regex-Profi, ein schneller Workaround wäre einfach den Inputtext mit einem @CRLF am Ende zu padden.


    Professor Bernd

    Eine Test-Datei packe ich in den Anhang, weil sie auch Whitespace am Zeilenende enthält und ich nicht weiß, ob das mit der Forensoftware erhalten bliebe. Deshalb bitte auch die Testdatei NUR mit einem Editor öffnen, der die training white space NICHT entfernt.

    Kannst du auch bitte direkt ein Testskript hochladen damit man sich nicht alles zusammensuchen muss und deinen 'Fehler' replizieren kann?

    Also anstatt die Mühe zu investieren, einen Watchdog zu programmieren würde ich lieber einfach das eigentliche Programm überarbeiten und Fehlerfälle abfangen, dann haste diese Sorgen auch nicht mehr.

    Mir kommts so vor als ob du dein 1. Skript ziemlich schlampig programmiert hast. Wenn du uns es zeigst können wir es uns ja mal ansehen und mit ein paar Hinweisen, wo es sich aufhängt dir helfen?

    Wenn der Name der Datei eindeutig ist, dann solltest du mit ProcessExists prüfen können ob der Prozess bereits existiert, und mit ProcessClose auch dementsprechend beenden können.

    Achtung, bei mehreren Instanzen kannst du da durcheinander kommen, weshalb du ProcessList verwenden solltest um auf die verschiedenen ProcessIDs zugreifen zu können um sie dann gezielt mit ProcessClose beenden zu können.

    Also erst werden die ganzen Sicherheitsmaßnahmen abgeschafft oder gelockert und jetzt geht die Ansteckungszahl wieder steil. Wer hätte das kommen sehen... Hab ich was verpasst oder ist meine Logik einfach nur falsch?

    Wie kannst du nur so herzlos und herablassend über die arme Wirtschaft reden, hast du nicht mehr alle Latten am Zaun?

    Ist doch egal ob ein paar Milliarden Menschen eine milde Erkältung bekommen werden und davon sterben könnten, wenn das vorbei ist hätten wir sonst eine am Boden liegende Wirtschaft und nichts würde mehr funktionieren!

    Also echt, manchmal glaube ich hier laufen nur empathielose User rum...


    Falls es nicht offensichtlich war, ja, das war nicht mein Ernst.

    Was genau machen $1 und $2? Sind das Variablen, die die erste und die zweite Gruppe des Pattern enthalten? Oder deren Treffer?

    Die haben unterschiedliche Bedeutungen in RegEx und RegExpReplace und sind back-references. Damit kannst du in RegEx z.B. rekursive Ausdrücke erzeugen.

    In RegExpReplace kannst du damit die gecapturete Gruppe einfügen, es sind also die Funde der Gruppen die du angegeben hast.


    Was ich verstehe ist das Ersetzen: 1 Space vor die Klammer, 1 Space nach der Klammer/vor dem Rest des Strings. Was ich nicht verstehe ist, wieso nur die erste Klammer ersetzt wird.

    Das ist auch sehr einfach, die Antwort steckt im Pattern: "(\()(.*)".

    Gesucht wird zuerst die 1. Klammer auf, welches du daran erkennst, dass vor der Klammer keine anderen Ausdrücke stehen, also wird das als erstes gematcht.

    Nach der Klammer soll (.*) gematcht werden, das bedeutet nichts weiteres als matche so viele Zeichen (oder wenn keine existieren, dann halt null), wie nur irgendwie möglich.

    Der Stern *-Quantifikator bedeutet dabei 0 oder unendlich viele Zeichen (greedy) und weil dahinter kein ? steht, ist es nicht lazy, d.h. er matcht bis ihm der String ausgeht.


    Ok, durch meine Spitzklammern im Demo Script habe ich gesehen, dass beim Einfügen von Space hinter der ")" ein Space fehlte. Ich habe das Replacement geändert von

    " $1 $2" zu

    "$1 $2 "

    Erst damit wird ein Space hinter die letzte ")" gesetzt.

    Ich dachte du wolltest nur Spaces nach dem Bezeichner und zwischen den Klammern, deshalb habe ich dahinter keine mehr eingefügt aber ja, so wie du das gemacht hast, kann mans machen.


    Es stellen sich folgende Fragen: Erstens, ist das richtig, oder ist das Zufall, dass am Ende der Zeile mit dem Treffer aufgehört wird? (Ich vermute mal, das ist so, solange ich kein "(?m)" voranstelle!?)

    Ja, kannst du machen. Du könntest auch (?s) nutzen, dann matcht das . auch New-Line Zeichen.


    Und zweitens, ist es nötig das abzufangen, weil "normalerweiser" hinter der letzten ")" eines Funktionskopfes nichts mehr stehen darf, außer Kommentar (und Kommentare werden schon vorher entfernt). - Naja, wenn ich keinen Fehler im Pattern und Replacement habe, schadet es ja auch nichts, oder?

    Wenn du sicher bist, dass da nichts steht, dann musst du das auch nicht abfangen, läuft dein Pattern halt 'etwas' flotter (sollte noch nicht mal messbar sein) durch.


    Jetzt war ich mal ganz mutig und habe folgendes probiert, um die beiden Aufrufe in einem zu vereinen. Es scheint zu funktionieren, aber ist es auch richtig? (Einen Geschwindigkeitsvorteil konnte ich nicht erkennen.)

    Ja kannst du so machen, das funktioniert auch, dann würde ich aber dieses extra-capturing von dem Teil dahinter (der nach deinen Angaben sowieso nicht existiert) weglassen.

    AutoIt
    StringRegExpReplace($sString, "(\()(.*)(\))", " $1 $2 $3 ")