Beiträge von Kanashius

    Ich hab das ganze Script mal überarbeitet und einiges ausgebessert.

    Also:

    1. Erstelle Controls wenn möglich direkt mit dem Fenster und ändere nur den Inhalt/State später. (Neben $GUI_DISABLE gibt es auch $GUI_HIDE). Dabei hab ich auch gleich die Größe dynamischer gestaltet => Einfach die Variablen über der Gui ändern und alle Controls ändern die Größe entsprechend. Wenn es mehr Controls werden ist das Gold wert.

    Normalerweise braucht es bei einem Login auch keiner Anleitung, was als nächstes zu tun ist... deshalb hab ich die mal rausgenommen. Die Information welcher User ausgewählt wurde muss auch nicht extra als Label dazukommen... Der User hat es ausgewählt und SIEHT was er ausgewählt hat. Es ist halt nur fürs debugging für dich interessant und sollte deshalb temporär mit dem ConsoleWrite/MsgBox ausgegeben werden. (Außer du hast es mit Menschen zu tun, die noch nie einen Computer gesehen haben... dann könnte es sinn machen).

    2. Die Nutzer in einem Array speichern. Dadurch kannst du mit 1ner Zeile später Nutzer hinzufügen,... ohne die ganzen Funktionen,... zu erstellen. Zumal der Code immer gleich war. Merke: Wenn du mehrmals fast exakt den gleichen Code hast, dann solltest du ein Array/eine Funktion dafür benutzen.

    3. Es wäre extrem unsicher, die Passwörter der Nutzer direkt in der Anwedung zu speichern. Wenn das unbedingt notwendig ist, speicher zumindest nur hashes. Also: Wenn ein neuer Nutzer dazukommt einfach in der Region: Generate passwordhash... die Zeilen auskommentieren und die passwörter eintragen, hashes generieren lassen und diese mit dem salt in das array $arUsers speichern. Danach UNBEDINGT die passwörter wieder aus der Region entfernen. (Alternativ einfach die passwörter als commandlineargument beim start übergeben, keine Ahnung, wie gut du dich mit so etwas auskennst.)

    Hintergrund: Man kann die .exe am ende mit einem Texteditor öffnen und die Passwörter rauslesen. Mit hashes wird es sehr viel schwieriger (und extremst rechenintensiv) => fast unmöglich für normale nutzer und auch für experten zumindest sehr schwer. Falls dich das Thema interessiert such einfach mal nach "Passwörter sicher speichern" und hashes, dann wirst du schnell fündig.

    Edit: Fix mistake Line 136 using #sPasswort instead of the control $idInputPassword

    Ja, das hast du richtig erkannt. In Windows ist ein Child-Window über dem Parent und kann auch dafür genutzt werden, das Parent unbenutzbar zu machen, sodass das Child erst geklickt werden muss, bevor das Parent wieder funktioniert (z.B. für error-meldungen,...).

    Ich vermute mal, dass das Child das WinSetOnTop vom Parent erbt und weiterhin über dem Parent bleibt, hab das aber noch nie probiert^^.

    Evtl. interessant: Controls sind oft auch Child-Windows, die in dem Parent platziert sind.

    Ich würde dir Empfehlen statt AutoIt einfach mit VirtualAudioCable (https://vac.muzychenko.net/en/) ein virtuelles Mikrofon+Lautsprecher zu erstellen. Dabei nimmst du dann in Soundplay das virtuelle Gerät als Audioausgang (Ab Win10 kannst du auch das Standardausgabegerät für einzelne Programme ändern, falls Soundplay das nicht unterstützt) und im Discord das virtuelle Gerät als Mikrofon.

    Diese virtuellen Geräte haben den Vorteil, dass sie verknüpft sind und alles, was in den Lautsprecher gesendet wird als Mikrofon Input verwendet wird. Das ist sonst meist nicht so einfach möglich.

    Wenn du dann mit dem selben Discord Nutzer noch dein normales Mikrofon gleichzeitig wiedergeben möchtest kannst du das, indem du unter "Sound" unter den Aufnahmegeräten dein Mikrofon auswählst und unter "Listen" (Zuhören?) -> playback through this device (Keine Ahnung wies im Deutschen Windows heißt; ist das einzige Dropdown Menü dort) das virtuelle Gerät wählen.


    Ansonsten ist es sehr schwer, die Audioausgabe von anderen Programmen als Mikrofon zu verwenden. Du kannst natürlich immernoch mit AutoIt die Ausgabe empfangen, verarbeiten und an ein weiteres virtuelles Gerät senden. Dabei würde ich dir dann empfehlen, dir die BASS UDF einmal genauer anzuschauen.


    MfG Kanashius.

    Ja, das erste Codebeispiel war nur zum zeigen und noch keine Lösung.

    Ich hab beim zweiten nicht ganz aufgepasst. Also: Es ist schon alles richtig, was ich betreffend der Strings erklärt habe, aber bei SQL statements gibt es noch eine Besonderheit.

    Auch die Datenbank muss wissen, dass du dort einen String (bzw. bei SQLite TEXT) übergibst.

    So wie du in AutoIt einen String angibst, indem du ihn mit " umschließt (nebenbei: wenn du " in einem String haben möchtest kannst du das mit verdoppelung erreichen, dementsprechend wird bei $sData="Dies ist ein ""cooler"" Text" das cooler in Anführungszeichen stehen.),

    musst du bei SQL auch zeigen, dass es ein String ist. Das geht, indem du dort ' oder ` verwendest.

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values (`" & $Vorname & "`, `" & $Name & "`, `" & $Telefon & "`)")

    Vorher wusste SQLite nicht, dass das ein String sein soll und hat stattdessen nach der Spalte mit dem Namen Holger gesucht, anstatt den String `Holger` in die Tabelle einzufügen. => no such column: Holger

    Die Query muss also so aussehen: INSERT INTO Tabelle (Name, Vorname, Summe) Values (`Holger`, `Esseling`, `99874`)


    P.S.: Mit Code ist es schon richtig, das hab ich auch verwendet. Wwenn du den Quellcode nach dem einfügen nochmal anklickst kannst du oben als Syntax-Hervorhebung AutoIt auswählen, dann wird der Code auch farbig hervorgehoben.

    Hallo :)

    Alles zwischen den " (double quotes) wird als String gewertet.

    Es ist also ab dem Moment kein Code mehr, sondern einfach nur Text, der in eine Variable (den Arbeitsspeicher) gespeichert werden soll. Hier wird nicht direkt eine Variable angelegt, sondern der String direkt an die Funktion übergeben.

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values ($Vorname, $Name, $Telefon)")
    ; und
    local $sInsertStatement = "INSERT INTO Tabelle (Name, Vorname, Summe) Values ($Vorname, $Name, $Telefon)"
    _SQLite_Exec($DB, $sInsertStatement)

    ist also (fast) das gleiche. Es ist ja auch sinnvoll, denn wenn du in einem String z.B. den Text $Vorname verwenden willst, geht das nicht mehr. Deshalb musst du im Code sagen, dass du an der Stelle nicht den Text "$Vorname", sondern die Variable verwenden willst.

    In AutoIt wird das meistens gemacht, indem mehrere Strings genommen und zusammengefügt werden:

    AutoIt
    _SQLite_Exec($DB, "INSERT INTO Tabelle (Name, Vorname, Summe) Values (" & $Vorname & ", " & $Name & ", " & $Telefon & ")")

    Hier wird der String hinter "Values (" beendet und die Variable $Vorname angehängt. Dann wird der String ", " angehängt, usw.

    & ist der Operator (wie + für addition) um Strings, bzw. Variablen hintereinander als Text zusammenzufügen.

    Eine andere Möglichkeit wäre StringFormat. Dabei ist es möglich die Variable zu formatieren. Es wird zb. mit %s ein String angegeben, der dann später durch den Inhalt der Variable ersetzt wird. Dabei können z.b. Dinge angegeben werden, wie die Länge der Variable soll mindestens 10 Zeichen sein, und wenn welche fehlen, werden Leerzeichen davor eingefügt uvm. Am besten kannst du dir dazu die Hilfe zu StringFormat durchlesen.

    AutoIt
    local $sVorname="Max", $sName="Mustermann", $sTelefon="1023734634"
    ConsoleWrite("INSERT INTO Tabelle (Name, Vorname, Summe) Values (" & $sVorname & ", " & $sName & ", " & $sTelefon & ")"&@crlf)
    ConsoleWrite(StringFormat("INSERT INTO Tabelle (Name, Vorname, Summe) Values (%s, %s, %s)", $sVorname, $sName, $sTelefon)&@crlf)
    
    local $arNames=[["Max","Mustermann"],["Test","Other"],["Names","Multiple"],["Example","Names"],["Other","Name"]]
    ConsoleWrite(StringFormat("% 10s % 10s)", "Vorname", "Nachname")&@crlf)
    for $i=0 to UBound($arNames)-1 step 1
        ConsoleWrite(StringFormat("% 10s % 10s", $arNames[$i][0], $arNames[$i][1])&@crlf)
    next

    MfG, Kanashius.


    Edit: Schaut aus als ob das einfügen von Code mit dem "Inline-Code"-Button eine schlechte Idee ist.

    Sieht aus als würde jemand versuchen mit einer Tastatur, die keine Umlaute hat (z.B. EN-Layout), diese über einen Umweg zu simulieren.

    Ich würde empfehlen, ein eigenes Layout zu erstellen. Das sollte deutlich einfacher/sinnvoller sein, wenn dies tatsächlich das Ziel ist.

    Ich nutze ebenfalls eine Tastatur mit US-Layout und kann nur empfehlen, das International Layout ohne DEAD Keys zu verwenden.


    Ansonsten kann man mit dem Tool "Keyboard Layout Creator" von Microsoft nen eigenes Layout erstellen.


    MfG, Kanashius.

    Der Ressourcenmonitor ist dort auch etwas unterschiedlich. Meine Vermutung wäre, dass der Taskmanager eventuell nur die absolute Arbeitsspeicher Nutzung anzeigt, nicht aber, wenn Daten in den swap ausgelagert werden. Normal passiert das ja nur, wenn der Arbeitsspeicher zu wenig wird, teilweise wird das aber auch mit Teilen der benötigten Ressourcen gemacht, welche nie genutzt werden.

    Aber wenn es dir darum geht, memory leaks zu finden würde ich einen anderen Ansatz nehmen:
    Alles durchschauen, ob man selbst Arbeitsspeicher allociert und nicht wieder freigibt. Wenn dort alles ausgeschlossen werden kann würde ich als nächstes UDFs verdächtigen und zu guter letzt AutoIt selbst (da kann man nur leider dann nichts mehr machen) ;)
    Im zweifel das Programm in Abschnitte aufteilen (normalerweise hat man ja eh viele funktionen,...) die einzeln getestet werden können und diese dann härtetests unterziehen => Sehr oft ausführen und die Arbeitsspeichernutzung ansehen.


    MfG Kanashius

    Ich würde einen anderen Ansatz nehmen.

    Es gibt dictionary files. Mit diesen würde ich alle Worte im text lowercase vergleichen und dann das passende Wort nehmen.

    Dementsprechend mit dem dictionary file, was ich für ein Wortfinde/Buchstabensalatpuzzle nutze (ca. 1,7 millionen worte) kann man das recht gut umsetzen:

    Auszug aus dem dictionary:

    Dann den Code etwa so:

    - Satz in Wörter splitten

    - Für jedes Wort: lowercase vergleich des Wortes mit dem Dictionary, wenn es gefunden wird das original Wort aus dem Dictionary eingefügt, ansonsten mit dem Ansatz, den du hast das Wort anpassen.


    (Ich weiß grad nicht mehr, wo ich das dictionary her habe, ich hatte ne weile gesucht. Wenn du es haben möchtest kann ich dir nen Link per PM schicken)

    Ich würde aber aus performance gründen eher nicht AutoIt verwenden. In dem Wortfindepuzzle dauert es mit Java etwa 1-2 Minuten, wenn ich ein 50x50 feld mit 1000 zufälligen, unterschiedlichen Wörtern mit mind. länge 3 füllen will. (8 Richtungen; horizontal, vertikal und diagonal, vorwärts und rückwärts) Ich will nicht wissen, wie lange AutoIt dafür brauchen würde, da dabei jede mögliche Position für jedes zufällige Wort in zufälliger Reihenfolge durchgegangen wird, ob es irgendwo hinpasst; solange, bis die X Wörter untergebracht sind oder alle Wörter durchgegangen wurden.


    MfG Kanashius

    Ich hab mal reingeschaut. Ich weiß nicht, ob du den Zugang zur API mitgebucht hast, aber wenn ja ist das der einfachste und sicherste weg, damit auch nichts schief geht.

    Mit https://app.billbee.io//swagge…ts/Shipment_ShipWithLabel kann man das Gewicht setzen und mit https://app.billbee.io//swagge…derApi_CreateDeliveryNote das PDF für die Auslieferungsnachricht anfordern.

    Ich schätze, das sind die beiden Aufrufe, die du brauchst.


    Authentifizierung schaut auch sehr einfach aus:

    • "Contain a valid API Key identifying the application/developer. It has to be sent as the HTTP header X-Billbee-Api-Key" => HTTP Header mit X-Billbee-Api-Key und dem key als value
    • Contain a valid user login with billbee username and api password in form of a basic auth HTTP header => Authorization mit Basic auth

    Beispiel:

    X-Billbee-Api-Key: <your api key>

    Authorization: Basic AXVubzpwQDU1dzByYM==


    AXVubzpwQDU1dzByYM== ist der Base64 string von "username:Pa$$w0rd"


    Du musst dann die URLs die beim Link angegeben wurden mit ! https ! aufrufen und die geforderten JSON daten übergeben.


    So ähnlich dürfte der Code dann aussehen.


    MfG Kanashius.

    Ich hab für beides gestimmt. Mit deutschem Layout ist STRG+SHIFT+Z grauenvoll, aber im US-Layout (was ich mittlerweile benutze) ist es echt angenehm.

    US layout ist eher zum Programmieren geeignet (zeichen wie {}[],... sind einfacher zu erreichen und das ist echt angenehm) und deshalb bin ich gewechselt, unter anderem aber auch, weil Intellij die Belegung anders hat:

    Zitat


    The default IntelliJ / Android Studio "Redo" action shortcut is CTRL + Shift + Z and this is a common problem for Windows users. A bigger problem is CTRL + Y is mapped to the "Delete line" action - and this causes the undo stack to be lost.

    Das Problem hatte ich schon öfter und es hat mich jedesmal genervt... :D

    Ich kann mich Musashi da nur anschließen.

    Übersetzungen sind nicht leicht, besonders mit vielen verschiedenen Bedeutungen. Die Probleme erkennt man sehr schön, wenn man sich die Videos anschaut, wo Text mehrfach durch einen Übersetzer geschickt werden und am Ende ein komplett anderer Text herauskommt.

    Sprachen sind nicht eindeutig, sondern Kontextabhängig. Je nachdem, welche Wörter zusammen vorkommen, wie sie angeordnet sind,... kann sich alles ändern.

    Du kannnst es vielleicht hinbekommen, mit Wortdatenbanken Wörter zu übersetzen/ersetzen und dir dann daraus (als Person) den Sinn des Satzes ableiten, aber wie gut das am Ende aussieht, wage ich zu bezweifeln, insbesondere, wenn du mit den existierenden Programmen nicht zufrieden bist... ich bezweifle etwas, dass dein Programm das Level dieser Programme erreicht, wenn du noch Anfänger bist. (Das schließe ich mal daraus, dass du mit Kodi eine Oberfläche zusammenbaust und erwähnst, dass du den Text in eine Variable bekommst...)


    Außerdem ist AutoIt definitiv nicht die Programmiersprache, mit der du ein solches Vorhaben umsetzen möchtest.

    Zum Übersetzen wird einiges an Leistung benötigt, da es so komplex ist und so viel Berücksichtigt werden muss. Da ist eine Scriptsprache definitiv kein guter Ansatz.

    Da sich der Code gerade dahin entwickelt, dass sehr viel Copy&Paste Code (Code duplicates) vorkommen, danchte ich, ich überarbeite den Code einmal vollständig und zeige dabei einige Konzepte, die ich empfehlen würde um den Code einfach und Wartbar zu halten.

    Zum einen sollten unbedingt Arrays verwendet werden, um immer denselben code zu vermeiden (siehe z.B. Zeile 58-67 und 69-80 oben). Dort wird derselbe Code verwendet, das einzige was sich verändert sind die Daten in den Textfeldern => Die Daten in ein Array und es muss nurnoch eine Test1/Test2 Funktion erstellt werden und dementsprechend auch nur eine Funktion verändert werden.

    Falls du arrays noch nicht kennst: Unbedingt anschauen, sie bilden das Grundkonzept jeglicher dynamischer Programmierung in AutoIt. (Gutes Tutorial von BugFix : http://www.bug-fix.info/array_tut.htm)

    Bei meinen Modifikationen hab ich auch gleich Variablen zur Fenster-Erstellung genutzt. Dadurch kann z.B. die Fenstergröße oben in der Variable geändert werden und alle Controls,... passen immernoch zum Fenster.

    Schau die das Programm am besten in Ruhe an, ich denke, du kannst dabei einiges/einige Konzepte lernen.



    MfG,

    Kanashius.


    Edit: Ich hab den Fehler behoben, der Musashi aufgefallen ist, das hatte ich übersehen (war kein Versionsfehler) :)

    Ah, ich hatte nur geschaut, ob überhaupt quelltext ankommt.

    Die Seite wird mit JavaScript geladen und der IE unterstützt das scheinbar nicht mehr.

    Hab auf die schnelle auch nur ne adresse finden können, die ausschaut als wär sie nicht fix.


    Ich würde dir empfehlen, stattdessen den Quelltext der Releasenotes anzusehen und dort zu parsen:

    https://www.oracle.com/java/te…javase/8all-relnotes.html

    Dort sollte dann die erste h4 überschrift, in der JDK steht, die aktuelle (empfohlene) sein. (=>Build releases ignorieren)

    Zumindest wenn ich es richtig verstehe, dass du nur die empfohlene Versionsnummer haben möchtest.

    Hi :)

    Ich denke, das hier dürfte etwa das sein, was du haben möchtest:

    MfG Kanashius

    Y und z ist leider auch nicht überall gleich... Ich benutz US layout und da ist es vertauscht... Bei den beiden Zeichen merkt man auch oft, wenn sich programmierer keine Gedanken über layouts gemacht haben...

    Ich bin extra zum US-Layout gewechselt, weil Standartmäßig in vielen IDEs STRG+Z für undo und STRG+SHIFT+Z für redo genutzt wird. Und STRG+SHIFT+Z ist echt ungut im DE layout :)

    Hier steht etwas von einem Event für WinProc (SC_MOVE), welches das verschieben verhindert, falls es nicht weitergegeben wird.

    https://stackoverflow.com/ques…-windows-from-being-moved

    Es gehört zum gleichen Typ, wie WM_NCLBUTTONDOWN, was du ja schon verarbeitest.

    Wenn man dann schaut, ob das Fesnter in eine der Ecken verschoben wird und dabei mehrere Pixel springt könnte man das verhindern.

    Ist aber zugegebenermaßen nicht die schönste Methode.

    Ich hab das ganze mal auf _FileListToArrayRec umgeschrieben. Du bekommst jetzt ein 2Dimensionales Array mit den sortierten Dateien zurück.

    In dem Code steht auch, wie du den neuen Ordner vorher ausgeben kannst.

    Der zweite Parameter ist zum filtern der Extensions.

    Der dritte Parameter sorgt für das Hinzufügen der Extrainfos (TimeLastModified, TimeCreated, TimeLastAccessed, FileSize, FileSizeFormatted).