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. BugFix

Beiträge von BugFix

  • Kommandozeilen parsen ( _CmdLine_Parse )

    • BugFix
    • 19. Juli 2019 um 08:51

    Ich habe hier ganz bewusst ausschließlich String-Funktionen verwendet, weil die API-Funktionen allesamt keine Abweichung vom Idealfall zulassen. Steht auch in den jeweiligen Remarks immer erwähnt, dass den Funktionen eigentlich grundsätzlich nicht zu vertrauen ist und man sie nur anwenden soll, wenn sicher ist, dass der auszuwertende String zu 100% den (viel zu engen) Anforderungen der Funktion entspricht. [Das ist jetzt meine etwas überspitzte Interpretation der Remarks]

    Natürlich ist es korrekt zu sagen: Das kann die Funktion, aber nur bei den und den Bedingungen. Mir war aber das Korsett zu eng. Mir ist es lieber, dass eine Funktion auch evtl. abartige Sonderfälle behandelt. Dann ist diese Behandlung einmalig integriert und muss nicht immer wieder, wenn Sonderfälle auftreten könnten, in die Nachbehandlung eingebunden werden.

  • Kommandozeilen parsen ( _CmdLine_Parse )

    • BugFix
    • 17. Juli 2019 um 19:41

    Kommandozeilen sind immer gleich aufgebaut:

    Teil_1: eine ausführbare Datei mit/ohne Pfad

    Teil_2: Parameter 1

    ...

    Teil_n: Parameter n -1

    Im Normalfall sollten Pfade so angegeben werden, dass sie bei enthaltenen Leerzeichen in Stringbegrenzer gekapselt werden. Leider halten sich nicht alle Funktionen daran (Registry Einträge).

    Deshalb habe ich diese Funktion erstellt, die bei nicht vorhandenen Stringbegrenzern nach der ersten angegebenen ausführbaren Datei sucht und damit den Pfad für diese Datei abschließt.

    Alle anderen Parameter sind durch Leerzeichen getrennt.

    Python: Bsp.
    #include 'CmdLineParse.au3'
    
    Local $sCmd = 'C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1'
    Local $aRes = _CmdLine_Parse($sCmd)
    For $i = 0 To UBound($aRes) -1
        ConsoleWrite($aRes[$i] & @CRLF)
    Next
    Python: CmdLineParse.au3
    ;-- TIME_STAMP   2019-07-17 19:28:05
    
    Opt('MustDeclareVars', 1)
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _CmdLine_Parse
    ; Description ...: Splits a command line into its elements. Standard separator between parts is the space.
    ;                  If this character is part of path or arguments, they must be enclosed in string delimiters.
    ;                  The first part of command line is a executable file path. The function recognise this also with spaces in it and none
    ;                  string marker encapsulation.
    ; Syntax ........: _CmdLine_Parse($_sLine[, $_sDelimParam = ' '])
    ; Parameters ....: $_sLine              - The command line to be parsed.
    ;                  $_sDelimParam        - [optional] Separator between parts. Default is ' '.
    ; Return values .: Array, each part of command line in one entry.
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _CmdLine_Parse($_sLine, $_sDelimParam=' ')
        Return StringSplit(StringTrimRight(__ParseRecursive($_sLine, $_sDelimParam), 1), Chr(1), 2)
    EndFunc  ;==> _CmdLine_Parse
    
    
    Func __ParseRecursive($_sLine, $_sDelimParam, $_iCall=1)
        Local $sDelimResult = Chr(1), $sResult = '', $sTmp, $sOut
        Local $sDelimString = ''
        Local $s1st = StringMid($_sLine, 1, 1)
        If $s1st = "'" Or $s1st = '"' Then $sDelimString = $s1st
        Local $sPart, $sPattExe, $aMatch
        If $sDelimString <> '' Then
            $sPart = StringFormat('%s[^%s]+%s', $sDelimString, $sDelimString, $sDelimString)
        Else
            ; Check if executable file path has spaces in it -- only for 1st call
            If $_iCall = 1 Then
                Local $aExec[] = ['.exe','.com','.bat','.cmd','.scr']
                Local $iMatch, $iPos = 1024, $sExt = ''
                For $i = 0 To 4
                    $iMatch = StringInStr($_sLine, $aExec[$i])
                    If $iMatch > 0 And $iMatch < $iPos Then
                        $iPos = $iMatch
                        $sExt = $aExec[$i]
                    EndIf
                Next
                If $sExt = '' Then ; none executable in line, use part to first space
                    $sPart = StringFormat('[^%s]+', $_sDelimParam)
                Else
                    $sPart = StringFormat('(?i).+%s', $sExt)
                EndIf
            Else
                $sPart = StringFormat('[^%s]+', $_sDelimParam)
            EndIf
        EndIf
        $aMatch = StringRegExp($_sLine, $sPart, 1)
        $sResult &= $aMatch[0] & $sDelimResult
        $sTmp = StringTrimLeft($_sLine, StringLen($sResult))
        If StringLen($sTmp) > 0 Then
            $_iCall += 1
            $sOut = $sResult & __ParseRecursive($sTmp, $_sDelimParam, $_iCall)
        Else
            $sOut = $sResult
        EndIf
        Return $sOut
    EndFunc
    Alles anzeigen

    EDIT:

    Kleine formelle Änderung im Skript. Ich hatte nicht auf dem Schirm, dass AutoIt in RegEx-Funktionen das insensitiv Flag hat '(?i)'. Hatte daher die Lua-Variante: '[upper lower]' gebastelt.

    Hier im Text geändert, nicht im Anhang - bitte selbst anpassen bei Bedarf (funktionell nicht erforderlich).

    Dateien

    CmdLineParse.au3 2,76 kB – 544 Downloads
  • Fenster nicht schließen - nicht minimieren

    • BugFix
    • 17. Juli 2019 um 10:50
    Zitat von AutoMit

    zusammengefasst für ein Fenster


    nicht minimieren

    nicht schließen

    keine Änderung der Größe und der Position

    Eine einzige Funktion schreiben ( _WindowRegisterStatic) und das gewünschte Verhalten allgemein gültig für das/die registrierten Fenster ausführen (und noch eine zum deregistrieren - _WindowUnRegisterStatic) .

    Einfach, im Sinne von 2..3 Befehle hinklatschen geht hierbei gar nicht. Und richtig funktionierend geht es ausschliesslich, wenn du dich in die Windows-Message Verwaltung einklinkst, also per Hook. Denn andere Anwendungen könnten sonst durch Senden von Nachrichten das Verhalten deiner Fenster beeinflussen. Das kannst du nur kontrollieren, wenn du selbst in der Nachrichtenzentrale sitzt.

  • Probleme bei _WinAPI_Path... -Funktionen

    • BugFix
    • 16. Juli 2019 um 23:36
    Zitat von Bitnugger

    _WinAPI_AssocQueryString liest lediglich den zu dem Query korrespondierenden Registry-Schlüssel aus.

    Über den Parameter der Funktion kann ich den Rückgabewert festlegen. Ich kann also statt der Kommandozeile, die Exe abfragen. Klappt aber in meinem Bsp. (mit .profile als systemeigenem Eintrag!) auch nicht. Hab noch nicht nachgeschaut, aber vllt. wird intern _WinAPI_PathRemoveArgs aufgerufen. :whistling:

  • Probleme bei _WinAPI_Path... -Funktionen

    • BugFix
    • 16. Juli 2019 um 18:14

    Ich habe mal ein Ticket erstellt.

  • Probleme bei _WinAPI_Path... -Funktionen

    • BugFix
    • 16. Juli 2019 um 16:19
    Zitat von alpines

    Theoretisch ist das kein Bug, da der Pfad ja abgeschlossen sein muss. Wenn man Leerzeichen haben will muss man eben Gänsefüßchen setzen

    Und das ist das Problem bei Windows - man macht sich durch Inkonsistenzen unendlich viele Probleme. Wie sinnvoll ist denn die Abfrage des Command Strings, wenn die Registry (aus der die Werte gelesen werden) mal Einträge mit und mal ohne Gänsefüßchen hat?!

    Das Problem liegt aber m.M. nach hauptsächlich in den Hilfebeispielen für _WinAPI_PathGetArgs und _WinAPI_PathRemoveArgs, die sich ihre Werte unglücklicherweise aus _WinAPI_AssocQueryString holen, die eben auch nicht verwertbare Werte ausgibt. Da wäre ein String mit Pfad sinnvoller.

  • Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • BugFix
    • 16. Juli 2019 um 12:36

    Falls ihr _WinAPI_Path.. Funktionen verwendet, bitte sehr misstrauisch sein. Die folgenden beiden Funktionen funktionieren definitiv nicht. ***

    Dort wird ausschließlich nach Leerzeichen im Pfad gesucht und anhand dessen in Pfad und Argumente gesplittet :Face:.

    EDIT:

    ***: Wie sich herausgestellt hat, sind die _WinAPI_Path Funktionen eigentlich unschuldig. Sie erwarten einen Leerzeichen behafteten Pfad in Gänsefüßchen eingefasst. Das Hilfebsp. verwendet ungünstigerweise die Funktion _WinAPI_AssocQueryString, die Werte aus der Registry verwendet und diese sind mal mit, mal ohne Gänsefüßchen. Somit ist der Rückgabewert in der Form des Hilfebsp. nicht für die _WinAPI_Path Funktionen verwertbar.

    Python: Bsp.
    #include <WinAPIShPath.au3>
    #include <APIRegConstants.au3>
    #include <WinAPIReg.au3>
    
    Local $sCmd = _WinAPI_AssocQueryString('.profile', $ASSOCSTR_COMMAND)
    ConsoleWrite('$sCmd: ' & $sCmd & @CRLF)    ; RICHTIG --> C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1
    
    Local $sPath = _WinAPI_PathRemoveArgs($sCmd)
    ConsoleWrite("$sPath: " & $sPath & @LF)    ; FALSCH  --> C:\Program
    
    Local $sArgs = _WinAPI_PathGetArgs($sCmd)
    ConsoleWrite("$sArgs: " & $sArgs & @LF)    ; FALSCH  --> Files\Intel\bin\iWrap.exe /CMD:7 %1
    Alles anzeigen

    Lösungsvariante:

    Python
    #include <Array.au3>
    
    
    Local $a = _PathArgsByFiletype('C:\Program Files\Intel\bin\iWrap.exe /CMD:7 %1', 'exe')
    _ArrayDisplay($a)
    
    Func _PathArgsByFiletype($_sStr, $_sType)
        $_sType = '.' & StringReplace($_sType, '.', '')
        Local $iPos = StringInStr($_sStr, $_sType)
        Local $aTmp, $sPath, $sArgs, $aRet
        If $iPos = 0 Then
            $aTmp =  StringSplit($_sStr, ' ', 2)
            If UBound($aTmp) = 1 Then
                Local $aRet[2] = [$aTmp[0]]
            Else
                Local $aRet[2] = [$aTmp[0], StringMid($_sStr, StringLen($aTmp[0]) +2)]
            EndIf
        Else
            $iPos = $iPos +StringLen($_sType) -1
            If StringMid($_sStr, 1, 1) = '"' Then $iPos += 1
            $sPath = StringLeft($_sStr, $iPos)
            Local $aRet[2] = [$sPath, StringMid($_sStr, $iPos +2)]
        EndIf
        Return $aRet
    EndFunc
    Alles anzeigen
  • For Schleife 2d

    • BugFix
    • 14. Juli 2019 um 14:51

    Der Fehler entsteht hier:

    If ((y1 - py2)*(px2 - px1) == (py2 - py1)*(x1 - px2)) Then ;prüft ob Linear

    Du hast vergessen vor die Variablen das $ zu setzen. ;)

  • Download einer Datei von einem SSL (TLS 1.2) Webserver schlägt fehl

    • BugFix
    • 10. Juli 2019 um 17:13

    Dein PC muss wissen, dass TLS 1.2 das Sicherheitsprotolkoll ist. Dazu ist ein Eintrag in der Registry erforderlich. Details findest du in diesem M$ Support Artikel.

  • SciTE-AddOn: OwnHotKeys (inkl. Installer) EDIT: neu "DebugAU3.lua"

    • BugFix
    • 8. Juli 2019 um 10:23

    DebugToConsole jetzt auch für Lua Skripte.

    Änderung in OHKfuncs.lua bitte selbst einpflegen, s. Startpost.

  • FAQ - SciTE Editor

    • BugFix
    • 6. Juli 2019 um 10:49

    Wie richte ich das User-Kontext-Menü ein?

    Für sehr Maus-affine User ist das Kontextmenü unabdingbar, weil man u. A. alle Funktionen, die im Menü Extras liegen, auf dieses Menü umleiten kann.

    Speicherung und Syntax sind analog zu den User-Shortcuts (Anzeigename=Kommando).

    user.context.menu=\

    ||\

    Next File|IDM_NEXTFILE|\

    Prev File|IDM_PREVFILE|

    Möchte man auf die Kommandos der au3.properties und SciTEUser.properties zugreifen, verwendet man

    als KommandoNummer die "11"

    & die Nummer von: command.24.*.au3=.

    So kann man z.B. Lua-Befehle auf ein Kommando legen und dieses als Kontextmenü Eintrag verfügbar machen:

    command.name.24.*=Delete Current Line

    command.mode.24.*=subsystem:lua,savebefore:no

    command.24.*=dostring scite.SendEditor(SCI_LINEDELETE)

    user.context.menu=\

    ||\

    Delete Current Line|1124|

  • FAQ - SciTE Editor

    • BugFix
    • 6. Juli 2019 um 10:07

    Wie deaktiviere ich die Fehleranzeige innerhalb des Skriptbereiches (inline error)?

    Beantwortet in diesem Post.

  • FAQ - SciTE Editor

    • BugFix
    • 5. Juli 2019 um 11:42

    Wie kann ein Button der SciTE-Toolbar En/Disabled werden?

    Python
    ;-- TIME_STAMP   2019-07-05 11:37:50
    
    Opt('MustDeclareVars', 1)
    
    #include <WinAPISys.au3>
    #include <GuiToolbar.au3>
    
    #cs
        SciTE: Enablen / Disablen von Buttons der Toolbar
        by BugFix
    #ce
    
    ; 1. Index des gewünschten Button ermitteln
    ;     Die Trennstriche zählen mit!
    ;    Gezählt wird bei 0 beginnend.
    ;    Bsp. Button "Save": Davor liegt "Trenner", "NEW", "OPEN" --> "SAVE" ist das 4.te Element - somit Index "3"
    Local $iIndexSave = 3
    
    ; 2. Disablen / Enablen
    ;    Disable
    _ToolbarButton_Enable($iIndexSave, False)
    
    Sleep(3000)
    ;    Enable
    _ToolbarButton_Enable($iIndexSave)
    
    
    Func _ToolbarButton_Enable($_iIndex, $_bEnable=True)
        Local $hToolbar = _GetSciTEToolbarHwnd()
        Local $iCmd = _GUICtrlToolbar_IndexToCommand($hToolbar, $_iIndex)
        Local $iState = _GUICtrlToolbar_GetButtonState($hToolbar, $iCmd)
        Local $iNewState = $_bEnable ? BitOR($iState, $TBSTATE_ENABLED) : BitXOR($iState, $TBSTATE_ENABLED)
        _GUICtrlToolbar_SetButtonState($hToolbar, $iCmd, $iNewState)
    EndFunc
    
    
    Func _GetSciTEToolbarHwnd()
        Local $hWndSciTE = WinGetHandle('[CLASS:SciTEWindow]')
        If Not IsHWnd($hWndSciTE) Then Return SetError(1,0,0)
        Local $aChilds = _WinAPI_EnumChildWindows($hWndSciTE)
        If IsArray($aChilds) Then
            For $i = 1 To $aChilds[0][0]
                If $aChilds[$i][1] = 'ToolbarWindow32' Then Return $aChilds[$i][0]
            Next
        EndIf
        Return SetError(2,0,0)
    EndFunc
    Alles anzeigen
  • CDATA aus XML auslesen

    • BugFix
    • 3. Juli 2019 um 17:25

    Und was für ein Datentyp ist der RÜCKGABEWERT von _StringBetween?!

    Bitte unsere Antworten auch lesen.

  • Mit Send Befehlkopieren

    • BugFix
    • 30. Juni 2019 um 13:18
    Zitat von stef26

    sorry sollte BugFix heissen..

    :D kein Problem.

    Da hast du ja wirklich viel Arbeit reingesteckt. :thumbup:

    Wie vermutet, kann man das alles auf AutoIt übertragen. Ich habe gerade etwas wenig Zeit, vielleicht findet sich ja schon mal jemand, der mit dir den Anfang macht.

    Du verwendest eigene Wörterbücher? Recht aufwändig, sollte eigentlich auch online verfügbare lizenzfreie Wörterbücher geben. Könnte man da mit einbinden.

  • Mit Send Befehlkopieren

    • BugFix
    • 30. Juni 2019 um 12:27
    Zitat von stef26

    Aktuell bastle ich in Excel an einer kleinen Lernhilfe für meine Kinder.

    Ich habe ein USERFORM in der unter anderem ein Webbrowser enthalten ist.

    Excel programmierst du mit VBA. Das lässt sich sehr gut nach AutoIt portieren, was ich empfehlen würde. Dann sparst du dir das Mixen zweier Programme.

    Poste doch deinen VBA-Code, wir können dir sicher helfen, das in AutoIt umzusetzen.

  • Script nur 1x täglich starten (intervallgesteuert, NICHT zeitgesteuert)

    • BugFix
    • 30. Juni 2019 um 07:54

    Ich würde den Vorgang in einer Logdatei (dafür bietet AutoIt einen eigenen Befehl) protokollieren. Wenn Fehler, auch (sofern das Skript das ermöglicht) die Ursache und Meldung an den User.

  • FAQ - SciTE Editor

    • BugFix
    • 24. Juni 2019 um 13:19

    Wie kann man das aktuelle Datum an der Cursor-Position einfügen?

    Python
    command.name.19.*=Insert Date
    command.19.*=dostring editor:AddText(os.date('%d.%m.%Y'))  
    command.mode.19.*=subsystem:lua,savebefore:no
    command.shortcut.19.*=Shift+Alt+F11

    "19" mit einer nicht belegten Kommando-Nr. ersetzen, für "Shift+Alt+F11" setzt ihr den gewünschten HotKey.

    Der Vorteil des Properties wird hier sichtbar: Das Subsystem ist "lua" - das bedeutet Lua-Code soll ausgeführt werden. Somit kann ich hier auch komplexe Lua-Skripte direkt einsetzen ohne extra Dateien aufzurufen.

    Wo finde ich freie Kommando-Nummern?

    Man sucht in der au3.properties nach der letzten belegten Kommandonummer - bei mir ist das z.B. :

    # 34 Generate UDF header ...

    command.name.34.$(au3)=Make UDF Header
    ...

    (in dieser Datei bitte nichts ändern !)

    Die Nummern bis 49 können dann individuell genutzt werden.

    Wenn man in der SciTE-Konfiguration einige der AutoIt-Tools abgewählt hat, werden automatisch die frei gewordenen Kommando-Nr. in die SciTEUser.properties übertragen und können auch verwendet werden. Bei mir sieht das z.B. so aus:

    command.name.16.*=

    command.name.15.*=

    command.name.4.$(au3)=

    command.name.2.$(au3)=

    command.name.1.$(au3)=

    command.name.0.$(au3)=

  • Greetings

    • BugFix
    • 24. Juni 2019 um 10:19

    Welcome too,

    you're our 2nd danish member. The other one is Alina. But she isn't logged in often.

    He, I love danish licorice - the salten one. Every time, I must work on Fehmarn, I also go to the danish Fleggard Shop in Burg and buy something of this. ;)

  • FAQ - SciTE Editor

    • BugFix
    • 20. Juni 2019 um 15:29

    Wie stellt man die SciTE-Oberfläche auf Deutsch ein?

    Dazu einfach die Datei locale.txt aus dem Anhang als locale.properties in das Installationsverzeichnis von SciTE kopieren.

    Dateien

    locale.txt 11,37 kB – 1.117 Downloads

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™