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

Beiträge von Bitnugger

  • Function in einer Schleife laufen lassen, wobei bei jeder Wiederholung die jeweilige Variable sich um einen Wert erhöht

    • Bitnugger
    • 17. Juni 2020 um 14:17
    Zitat von Bernd Albrecht

    Send("{RIGHT" & $iCount & "}")

    Hier hatte ich ein Leerzeichen nach RIGHT vergessen. So ist es richtig: Send("{RIGHT " & $iCount & "}")

    Habe es im Script in Post #2 bereits korrigiert.

    Zitat von Bernd Albrecht

    Ich möchte das AutoIt bspw. bei der 12 Schleife nach 12 mal an der jeweiligen Stelle auf "Rechts" drückt und bei der 13 Schleife dann 13 mal.

    Ja, und genau das sollte jetzt auch passieren...


    Zitat von Bernd Albrecht

    Wie kann ich einstellen das AutoIt bspw. nach der 12 Schleife aufhört?

    Code
    ; For $i = 0 To UBound($aRanges) -1 Step 1
    For $i = 0 To 11 Step 1 ; 0 bis 11 = 12, Schleife nach 12 Durchläufen verlassen.
        $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
        $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
        $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
        T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
    Next

    Oder du machst es so:

    Code
    SendToExcel(12) ; 12 Datensätze an Excel senden.
    
    Func SendToExcel($iCount)
        For $i = 0 To $iCount -1 Step 1
            $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
            $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
            $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
            T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
        Next
    EndFunc

    Wenn $iCount (weiter oben) nicht im globalen Scope (außerhalb einer Funktion) deklariert wurde, wird $iCount so allerdings wieder auf 0 gesetzt, wenn du die Funktion wiederholt aufrufst.

    Durch Local Static bleibt der Inhalt in $iCounter auch nach Verlassen der Funktion erhalten, bis die Funktion für $i den Wert -1 bekommt, dann wird $iCount wieder auf 0 gesetzt.

    Code
    SendToExcel(12) ; 12 Datensätze an Excel senden.
    SendToExcel(-1) ; $iCount in der Funktion SendToExcel() wieder auf 0 setzen
    
    Func SendToExcel($i)
        Local static $iCount = $i
        If $i = -1 Then $iCount = 0
        For $i = 0 To $iCount -1 Step 1
            $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
            $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
            $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
            T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
        Next
    EndFunc
    Alles anzeigen
  • Function in einer Schleife laufen lassen, wobei bei jeder Wiederholung die jeweilige Variable sich um einen Wert erhöht

    • Bitnugger
    • 17. Juni 2020 um 12:59
    Zitat von Bernd Albrecht

    Muss ich deinem Beipielskriptt nach erst AutoIt die komplette Excel Datei auslesen lassen und dann die Ranges ( Array) formulieren)? Oder kann ich

    Das kann ich dir nicht sagen, weil ich deine Excel-Datei nicht kenne und auch nicht weiß, was du daraus senden willst. Wenn ich Daten habe, mit denen ich arbeiten kann, dann kann ich auch etwas sinnvolles sagen.

    Allgemein aber, macht es mehr Sinn mit einem Array zu hantieren, wenn es sich nicht nur um eine handvoll Werte handelt, die du von Excel holen willst. Mit Array ist meistens die bessere Lösung.

    Zitat von Bernd Albrecht

    ist das $aSleep hierbei wichtig. Ich verstehe darunter das bei jeder neuen Schleife 1 Sekunde länger gewartet wird...

    Bei Send kann es gut sein, dass du vor dem nächsten Send etwas warten musst, damit das Programm auch genügend Zeit hat, um auf die Nachrichten zu reagieren. Dafür sind die Sleep's gedacht und ohne wird es sicher ab und an oder öfters nicht funktionieren. Wie lange man nach einem Send warten sollte, dass muss man austesten. Deshalb habe ich drei Werte in ein Array gepackt, so dass sie an einer Stelle geändert werden können. $aSleep[0] wartet 1000 ms... $aSleep[1] 2000 ms, $aSleep[2] 3000 ms... solange du den Wert im Arrray nicht änderst. Da es an manchen Stellen auch etwas schneller gehen darf, an anderen aber länger gewartet werden muss, solltest du mit den Werten ein wenig spielen, um die optimale Zeit für jeden Send herauszukitzeln.

    Das könntest du in in dieser Zeile: Local $_readA, $_readB, $_readC, $aSleep = [1000, 2000, 3000], $iCount

  • Fenster aktivieren

    • Bitnugger
    • 17. Juni 2020 um 12:37
    Zitat von BugFix

    Es scheint wohl kein gesichertes Verfahren zu geben, die Z-Order zu bestimmen.

    Wir hatten vor einigen Wochen einen User, der das zuletzt aktive Window ermitteln wollte, weil sein Send() oder so sonst nicht da ankommt, wo er es will... dann habe ich gebastelt und es war irgendwas mit Hook oder Register, um die Nachrichten abzufangen, wenn sich im System etwas an einem Window ändert... neu erstellt, vernichtet, Z-Order geändert... aber ich finde es einfach nicht mehr. Grrr...

  • _Array2DSortFree äöü richtig sortieren

    • Bitnugger
    • 17. Juni 2020 um 12:22
    Zitat von AspirinJunkie

    Wirst du von irgendwem mit vorgehaltener Waffe gezwungen den AutoItWrapper zu verwenden?

    Vor allem - wirst du gezwungen den mit Parameter "-3 " aufzurufen obwohl bekannt ist, dass der dies nicht korrekt auflösen kann?

    Es geht dabei weniger um mich, sondern um die Leute, für die ich Scripte schreibe... wenn irgendwas nicht stimm, kann ich schlecht hingehen und sagen, dass der Mr. XY daran schuld ist. Das nervt dann einfach nur... und ich sagte ja, ich verstehe deinen Standpunkt und es ist auch nicht weiter von Belang, wenn du es nicht ändern möchtest... finde es nur irgendwie schade, dass ich bei jeder neuen Version Hand anlegen muss, damit meine Schäfchen sich ruhig verhalten. Nun gut, jeder hat das Recht auf seine eigene Meinung... deine kenne ich jetzt, und du ja auch meine, das Thema ist somit durch und wir bleiben Freunde, bis ans Ende unsere Tage ;)

    Zitat von AspirinJunkie

    Variablen so spät wie möglich deklarieren

    Da ist was dran... hat er evtl. auch gesagt, das man so wenig wie möglich Variablen deklarieren sollte? Denn in einigen Funktionen benutzt du für quasi dieselbe Aufgabe im If- und im Else-Zweig zwei verschiedene.

    Z.B.: _DynArraySort: $d_Ret und $b_Ret... hat das einen speziellen Grund?

  • Link in Mails per AutoIt verarbeiten

    • Bitnugger
    • 17. Juni 2020 um 02:31

    Ob man den Klick auf einen Link umleiten kann, weiß ich nicht... wohl eher nicht... aber du kannst ein externes Programm starten, wenn eine Nachricht mit bestimmten Kriterien empfangen wird.

    Outlook-Filter-Script-Starten.png

    Vorgehensweise Erstellen eines Skripts für den Regel-Assistenten in Outlook

    Externes Programm starten


    PS: Mit Thunderbird ist das unkomlizierter... das Add-On FiltaQuilla installieren, Filter erstellen und dort dann das externe Programm angeben, fertig.

    Thunderbird-Absenderbuchung.png

  • Function in einer Schleife laufen lassen, wobei bei jeder Wiederholung die jeweilige Variable sich um einen Wert erhöht

    • Bitnugger
    • 17. Juni 2020 um 01:35

    So in etwa...

    AutoIt
    Opt('MustDeclareVars', 1)
    
    ;Liest Exel aus ( unwichtig)
    
    #include <Excel.au3>
    
    Local $oExcel = _Excel_Open()
    Local $var = "C:\Users\xxxxxx\Desktop\Tester.xlsx" ; Excel Tabelle
    Local $oWorkbook = _Excel_BookOpen($oExcel, $var)
    
    WinActivate("Test - Microsoft Excel")
    
    Local $_read1 = _Excel_RangeRead($oWorkbook, Default, "D5")
    ;~ ...
    Local $_read570 = _Excel_RangeRead($oWorkbook, Default, "E29")
    
    Local $_readA, $_readB, $_readC, $aSleep = [1000, 2000, 3000], $iCount
    
    ; Variablen werden nicht erhöht, sondern der Inhalt, doch für deine Aufgabenstellung nimmt man evtl. besser ein Array... hier $aRanges
     
    ;                $_read    A      B      C        A      B      C        A      B      C
    Local $aRanges =     [  ['A10', 'B10', 'C10'], ['D10', 'E10', 'F10'], ['G10', 'H10', 'I10'], _ ; $iCount = 1, 2, 3
                            ['A11', 'B11', 'C11'], ['D11', 'E11', 'F11'], ['G11', 'H11', 'I11'], _ ; $iCount = 4, 5 ,6
                            ['A12', 'B12', 'C12'], ['D12', 'E12', 'F12'], ['G12', 'H12', 'I12'], _ ; $iCount = 7, 8 ,9
                            ['A13', 'B13', 'C13'], ['D13', 'E13', 'F13'], ['G13', 'H13', 'I13'], _ ; ...
                            ['...', '...', '...'], ['...', '...', '...'], ['...', '...', '...'], _
                            ['...', '...', '...'], ['...', '...', '...'], ['...', '...', '...'] _ ; <<<=== den letzen ohne Komma!
                         ]
    
    ;der eigentlische Prozess den ich x-mal wiederholen will
    For $i = 0 To UBound($aRanges) -1 Step 1
        $_readA = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][0]) ; A10, D10, G10, A11, D11, G11, A12, D12, ...
        $_readB = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][1]) ; B10, E10, H10, B11, E11, H11, B12, E12, ...
        $_readC = _Excel_RangeRead($oWorkbook, Default, $aRanges[$i][2]) ; C10, F10, I10, C11, F11, I11, C12, F12, ...
        T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $i + 1) ; ($i + 1 = $iCount)
    Next
    WinClose("Spreadshirt - Mozilla Firefox", "")
    ; ...
    
    Func T_Shirt_Design_hochladen($_readA, $_readB, $_readC, $aSleep, $iCount)
        If $iCount = 1 Then
            ShellExecute("https://partner.spreadshirt.com/designs")
            WinWaitActive("Spreadshirt - Mozilla Firefox") ; Wartet bis das Fenster aktiv ist.
        EndIf
    ;~     ...
        Send("{RIGHT " & $iCount & "}")
        Send($_readA)
        Sleep($aSleep[0]) ; 1000 ms
    ;~     ...
        Send($_readB)
        Sleep($aSleep[1]) ; 2000 ms
    ;~     ...
        Send($_readC)
        Sleep($aSleep[2]) ; 3000 ms
    EndFunc   ;==>T_Shirt_Design_hochladen
    Alles anzeigen
  • _Array2DSortFree äöü richtig sortieren

    • Bitnugger
    • 16. Juni 2020 um 22:59
    Zitat von AspirinJunkie

    Warte mal - kann es sein dass wir aneinander vorbei reden? Kann es sein, dass der Screenshot den du gepostet hast eine Version ist, die du bereits angepasst hast?

    Wenn ich sie angepasst hätte, würde der Au3Wrapper nicht mehr meckern... und dann hätte ich meinen ersten Beitrag hier gar nicht geschrieben. ;)

    Möglich wäre es aber schon, doch normalerweise füge ich meinen Nick im Header bei Modified ein und hänge an die Zeilen, die ich geändert oder hinzugefügt habe, einen Kommentar an, lasse die originalen Zeilen aber als Kommentar drin, wenn ich in einer fremden UDF etwas ändere.

    Die Funktion sähe dann in etwa so aus:

    AutoIt
    ; #FUNCTION# ======================================================================================
    ; Name ..........: _DynArraySort()
    ; Description ...: sorts a semi-dynamic-array with the ability of a user defined sorting rule
    ; Syntax ........: _DynArraySort(ByRef $a_Array, [Const $cb_Func = Default, [Const $iDescending = 0, [Const $b_Overwrite = True]]])
    ; Parameters ....: ByRef $a_Array - the "semi-dynamic"-Array (needs an array with number of elements in $a_Array[0])
    ;                  $cb_Func       - function variable points to a function of a form "[1|0|-1] function(value, value)"
    ;                  $iDescending   - search autoit-help for "_ArraySort"
    ;                  $b_Overwrite   - if false: $a_Array don't get touched - return a sorted copy of $a_Array
    ; Return values .: Success: If $cb_Func = Default: search autoit-help for "_ArraySort"
    ;                           Else: True if $b_Overwrite=True; sorted copy of $a_Array if $b_Overwrite=False
    ;                  Failure: False
    ;                     @error = 7: invalid value in $a_Array[0]
    ;                     @error = 8: cb_func isn't a function variable
    ; Author ........: AspirinJunkie
    ; Modified.......: Bitnugger
    ; Remarks .......: a "semi-dynamic" array only doubles and halve it's size when it's necessary
    ;                  that makes it much more performant for adding/deleting/inserting etc.
    ; =================================================================================================
    Func _DynArraySort(ByRef $a_Array, Const $cb_Func = Default, Const $iDescending = 0, Const $b_Overwrite = True)
        If Not __DynArrayIsValid($a_Array) Then Return SetError(@error, 0, False)
        Local $N = $a_Array[0] ; number of elements in $a_Array
        Local $w = UBound($a_Array) ; size of $a_Array (including empty values at the end)
        If $N > $w Or (Not IsInt($N)) Or $N < 0 Then Return SetError(7, 0, False)
    
        Local $a_Temp, $v_Ret ; #1 $d_Ret, $b_Ret -> $v_Ret, changed by Bitnugger
        If $cb_Func = Default Then
            ; Local $a_Temp, $d_Ret, $b_Ret ; #1 Disabled here by Bitnugger and changed/moved two lines up because variables should not be declared within If...Then...Else...Endif
            If $b_Overwrite Then
                $v_Ret = _ArraySort($a_Array, $iDescending, 1, $a_Array[0], 0, 1) ; #1
                Return SetError(@error, @extended, $v_Ret)                        ; #1
            Else                                                                  ; #1 $d_Ret -> $v_Ret
                $a_Temp = $a_Array                                                ; #1 
                $v_Ret = _ArraySort($a_Temp, $iDescending, 1, $a_Array[0], 0, 1)  ; #1
                Return SetError(@error, $v_Ret, $a_Temp)                          ; #1
            EndIf
        Else
            If Not IsFunc($cb_Func) Then Return SetError(8, 0, False)
            If $b_Overwrite Then
                $v_Ret = _ArraySortFlexible($a_Array, $cb_Func, 1, $N)            ; #1
                Return SetError(@error, @extended, $v_Ret)                        ; #1
            Else                                                                  ; #1 $b_Ret -> $v_Ret
                $a_Temp = $a_Array                                                ; #1
                $v_Ret = _ArraySortFlexible($a_Temp, $cb_Func, 1, $N)             ; #1
                Return SetError(@error, $v_Ret, $a_Temp)                          ; #1
            EndIf
        EndIf
    EndFunc   ;==>_DynArraySort
    Alles anzeigen
    Zitat von AspirinJunkie

    aber die Sache mit dem already declared werde ich nicht ändern

    Ich verstehe dich und gebe dir auch recht mit dem Au3Wrapper... sein dämliches Gemeckere wäre aber leicht vermeidbar, indem alle Variablen innerhalb einer Funktion nur einmalig an einer Stelle deklariert werden.

    Ich bin jedenfalls generell der Meinung, dass es eh kein guter Stil ist, Variablen innerhalb von Schleifen Do...Until, While...Wend, For...Next, oder einer If...Then...Else...Endif-Anweisung zu deklarieren.

    Ich habe etwa 5 Minuten für die Änderungen in der aktuellen Version gebraucht, damit Au3Wrapper nicht mehr meckert. Im Anhang die geänderte Version... ohne zusätzliche Kommentare/Hinweise.

    Dateien

    DynArray.au3 107,46 kB – 358 Downloads
  • Fenster aktivieren

    • Bitnugger
    • 16. Juni 2020 um 20:30
    Zitat von BugFix

    let
    class = "MozillaWindowClass"
    h = FindWindowW(cast[LPWSTR](newWideCString(class, class.len)), nil)

    So findest du alle Windows mit ClassName MozillaWindowClass... bei mir ist das dann aber immer eines der nicht sichbaren, und einige davon haben die Größe 0,0,0,0. Deshalb kann zumindest BringWindowToTop(h) nicht funktionieren und bei ShowWindow(h, SW_SHOW|SW_SHOWNORMAL) siehst du dann natürlich auch nichts, wenn die Größe 0,0,0,0 ist! Die nicht sichbaren, die nicht Größe 0,0,0,0 haben, kann ich aber auch nicht sichtbar machen... liegt evtl. am Style und dass es keinen Inhalt hat, oder das es zu 100% transparent gemacht wurde.

    AutoIt
    #include <Process.au3>
    #include <WinAPIConv.au3>
    
    Global $g_iOutEncoding = Int(StringRegExpReplace(FileRead(@LocalAppDataDir & '\AutoIt v3\SciTE\SciTEUser.properties'), '(?s).+\Routput\.code\.page=(.+?)\R.*', '\1'))
    
    Local $iState, $vPos, $aWinList = WinList('[CLASS:MozillaWindowClass]'), $sExe, $iLen = 117
    Local $sState, $aState[1][2], $aStates = [' exists', ' visible', ' enabled', ' active', ' minimized', ' maximized']
    _ConOut(StringFormat('> %-11s %-17s %-55s %-24s %s\n', 'Handle', 'Exe', 'State', 'Pos', 'Title'))
    For $i = 1 To $aWinList[0][0] -1 Step 1
        $iState = WinGetState($aWinList[$i][1])
        $aState[0][0] = ''
        $aState[0][1] = 'not'
        For $j = 0 To 5 Step 1
            Switch BitAND($iState, 2^$j)
                Case 0
                    $aState[0][1] &= $aStates[$j]
                Case Else
                    $aState[0][0] &= $aStates[$j]
            EndSwitch
        Next
        $sState = $aState[0][0] & ', ' & $aState[0][1]
        $vPos = WinGetPos($aWinList[$i][1])
        $vPos = StringFormat('%5i,%5i,%5i,%5i', $vPos[0], $vPos[1], $vPos[2], $vPos[3])
        $sExe = _ProcessGetName(WinGetProcess($aWinList[$i][1]))
        If BitAND($iState, 2) Then
            _ConOut(StringFormat('+ %s  %-15s  %s  %s  %s\n', $aWinList[$i][1], $sExe, $sState, $vPos, StringLeft(StringReplace(StringReplace($aWinList[$i][0], @LF, ''), @TAB, ' '), $iLen)))
        Else ; not visible
    ;~         WinSetState($aWinList[$i][1], $aWinList[$i][0], @SW_SHOW) ; sagt zwar 1, geht aber nicht
    ;~         WinSetState($aWinList[$i][1], $aWinList[$i][0], @SW_SHOWMAXIMIZED) ; sagt zwar 1, geht aber nicht
    ;~         Sleep(1000)
    ;~         WinSetState($aWinList[$i][1], $aWinList[$i][0], @SW_RESTORE)
    ;~         WinSetState($aWinList[$i][1], $aWinList[$i][0], @SW_HIDE)
            _ConOut(StringFormat('- %s  %-15s  %s  %s  %s\n', $aWinList[$i][1], $sExe, $sState, $vPos, StringLeft(StringReplace(StringReplace($aWinList[$i][0], @LF, ''), @TAB, ' '), $iLen)))
        EndIf
    Next
    
    ; Damit die Umlaute und Sonderzeichen "in der Console und in SciTE" korrekt dargestellt werden.
    Func _ConOut($vText)
        ; String(), Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
        ConsoleWrite(_WinAPI_WideCharToMultiByte(String($vText), @Compiled ? 1 : $g_iOutEncoding, True, False))
    EndFunc   ;==>_ConOut
    Alles anzeigen

    Windows.png

  • _Array2DSortFree äöü richtig sortieren

    • Bitnugger
    • 16. Juni 2020 um 12:37
    Zitat von AspirinJunkie

    Welche Version der UDF hast du denn gecheckt? - in meiner (die ich gerade runtergeladen habe) ist das so gar nicht drin wie bei dir dargestellt.

    Dort sind alle Variablen korrekt mit Local in ihrem jeweiligen Scope deklariert.

    Du musst also irgendeine hornsalte Version vorliegen haben.

    Die Version, die gestern noch bei >>aktualisierte UDF<< angeboten wurde.

    Da sah die Funktion noch so aus:

    AutoIt
    Func _DynArraySort(ByRef $a_Array, Const $cb_Func = Default, Const $iDescending = 0, Const $b_Overwrite = True)
        If Not __DynArrayIsValid($a_Array) Then Return SetError(@error, 0, False)
        Local $N = $a_Array[0] ; number of elements in $a_Array
        Local $w = UBound($a_Array) ; size of $a_Array (including empty values at the end)
        If $N > $w Or (Not IsInt($N)) Or $N < 0 Then Return SetError(7, 0, False)
    
        If $cb_Func = Default Then
            Local $a_Temp, $d_Ret, $b_Ret ; <<<=== $b_Ret wird im If-Zweig nicht verwendet, sondern nur im Else-Zweig - ist hier im If-Zweig also überflüssig.
    ;                                              Doch im Else-Zweig ist sie nicht deklariert, weil dann die Zeile "Local $a_Temp, $d_Ret, $b_Ret" nicht ausgeführt wurde!
            If $b_Overwrite Then
                $d_Ret = _ArraySort($a_Array, $iDescending, 1, $a_Array[0], 0, 1)
                Return SetError(@error, @extended, $d_Ret)
            Else
                $a_Temp = $a_Array
                $d_Ret = _ArraySort($a_Temp, $iDescending, 1, $a_Array[0], 0, 1)
                Return SetError(@error, $d_Ret, $a_Temp)
            EndIf
        Else
            If Not IsFunc($cb_Func) Then Return SetError(8, 0, False)
            If $b_Overwrite Then
                $b_Ret = _ArraySortFlexible($a_Array, $cb_Func, 1, $N) ; <<<=== $b_Ret ist hier nicht deklariert, weil "Local $a_Temp, $d_Ret, $b_Ret" nicht ausgeführt wurde!
                Return SetError(@error, @extended, $b_Ret)             ; <<<=== Hier auch nicht!
            Else
                $a_Temp = $a_Array
                $b_Ret = _ArraySortFlexible($a_Temp, $cb_Func, 1, $N) ; <<<=== Hier auch nicht!
                Return SetError(@error, $b_Ret, $a_Temp)              ; <<<=== Hier auch nicht!
            EndIf
        EndIf
    EndFunc   ;==>_DynArraySort
    Alles anzeigen

    In größeren Scripts füge ich zwecks Test diese Zeile ein, und wenn alles ok ist, kommentiere ich sie wieder aus.

    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

    Jetzt mach das mal in einem Script, in dem DynArray.au3 included wird.

    AutoIt: Press Strg + 5 (Test Run)
    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
    
    #include "DynArray.au3"
    Code: DynArray_Examples\Sort_132.au3 - 0 error(s), 32 warning(s)
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(266,43) : warning: $dP possibly not declared/created yet
        $dP = __DynArrayGetNextPowerOfTwo($N + 1)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(544,74) : warning: $d_Ret already declared/assigned
                Local $d_Ret = _ArraySort($a_Temp, $iDescending, 1, $a_Array[0], 0, 1)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(553,28) : warning: $a_Temp already declared/assigned
                Local $a_Temp = $a_Array
                ~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(554,63) : warning: $b_Ret already declared/assigned
                Local $b_Ret = _ArraySortFlexible($a_Temp, $cb_Func, 1, $N)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(593,21) : warning: $2D already declared/assigned
                Local $2D = False
                ~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(636,46) : warning: $p_Index already declared/assigned
                Local $p_Index = Random($i_Min, $i_Max, 1)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(637,39) : warning: $p_Value already declared/assigned
                Local $p_Value = $a_Array[$p_Index]
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(646,76) : warning: $i already declared/assigned
            Local $i = __PartitionHoare($a_Array, $i_Min, $i_Max, $p_Value, $cb_Func)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(639,16) : warning: $v_Temp: declared, but not used in func.
            Local $v_Temp
            ~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(704,26) : warning: $t already declared/assigned
                    Local $t = $A[$right]
                    ~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(744,40) : warning: $d_third already declared/assigned
            Local $d_third = Floor($d_Len / $div)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(746,31) : warning: $m1 already declared/assigned
            Local $m1 = $left + $d_third
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(747,32) : warning: $m2 already declared/assigned
            Local $m2 = $right - $d_third
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(685,18) : warning: $N: declared, but not used in func.
        Local $k, $t, $N
        ~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(689,20) : warning: $2D: declared, but not used in func.
            Local $2D = False
            ~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(897,22) : warning: $t: declared, but not used in func.
        Local $k, $s, $j, $t
        ~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1064,25) : warning: $a_Max already declared/assigned
            Local $a_Max = $a_A[0]
            ~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1107,25) : warning: $a_Min already declared/assigned
            Local $a_Min = $a_A[0]
            ~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1161,49) : warning: $iMiddle already declared/assigned
                Local $iMiddle = Floor(($i_Max + $i_Min) / 2)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1162,27) : warning: $A already declared/assigned
                Local $A = $a_A[$i_Min],
                ~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1162,46) : warning: $b already declared/assigned
                Local $A = $a_A[$i_Min], $b = $a_A[$i_Max],
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1162,67) : warning: $c already declared/assigned
                Local $A = $a_A[$i_Min], $b = $a_A[$i_Max], $c = $a_A[$iMiddle]
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1165,181) : warning: $p_Value already declared/assigned
                Local $p_Value = $cb_Func($A, $b) = 1 ? $cb_Func($A, $c) = 1 ? $cb_Func($c, $b) = 1 ? $c : $b : $A : $cb_Func($A, $c) = 1 ? $A : $cb_Func($c, $b) = 1 ? $b : $c ; = Median(a,b,c)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1166,124) : warning: $p_Index already declared/assigned
                Local $p_Index = $cb_Func($p_Value, $A) = 0 ? $i_Min : $cb_Func($p_Value, $b) = 0 ? $i_Max : $iMiddle ; = Index(p_Value)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1173,82) : warning: $i_PivotPos already declared/assigned
                Local $i_PivotPos = __PartitionHoare($a_A, $i_Min, $i_Max, $p_Value, $cb_Func)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1202,30) : warning: $N: declared, but not used in func.
        Local Const $N = $a_Array[0]
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1232,20) : warning: $2D already declared/assigned
            Local $2D = False
            ~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1235,10) : warning: $x: declared, but not used in func.
        Local $x
        ~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1286,53) : warning: $w: declared, but not used in func.
        Local Const $N = $a_Array[0], $w = UBound($a_Array)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1359,53) : warning: $w: declared, but not used in func.
        Local Const $N = $a_Array[0], $w = UBound($a_Array)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(1419,50) : warning: $d_v already declared/assigned
                Local $d_v = __DynArrayGetNextPowerOfTwo($d_x)
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    "F:\_Archive\_Programmieren\AutoIt3\User\AspirinJunkie\DynArray\DynArray_Examples\DynArray.au3"(2340,22) : warning: $t: declared, but not used in func.
        Local $k, $s, $j, $t
        ~~~~~~~~~~~~~~~~~~~~^
    Alles anzeigen

    Ich kann aber in einem Script alle Includes aus c:\Program Files (x86)\AutoIt3\Include\ laden, ohne dass eine Warnung oder ein Fehler angezeigt wird.

    all_Includes_Test.au3
    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
    
    #include-once
    #include <APIComConstants.au3>
    #include <APIConstants.au3>
    #include <APIDiagConstants.au3>
    #include <APIDlgConstants.au3>
    #include <APIErrorsConstants.au3>
    #include <APIFilesConstants.au3>
    #include <APIGdiConstants.au3>
    #include <APILocaleConstants.au3>
    #include <APIMiscConstants.au3>
    #include <APIProcConstants.au3>
    #include <APIRegConstants.au3>
    #include <APIResConstants.au3>
    #include <APIShellExConstants.au3>
    #include <APIShPathConstants.au3>
    #include <APISysConstants.au3>
    #include <APIThemeConstants.au3>
    #include <Array.au3>
    #include <ArrayDisplayInternals.au3>
    #include <AutoItConstants.au3>
    #include <AVIConstants.au3>
    #include <BorderConstants.au3>
    #include <ButtonConstants.au3>
    #include <Clipboard.au3>
    #include <Color.au3>
    #include <ColorConstants.au3>
    #include <ComboConstants.au3>
    #include <Constants.au3>
    #include <Crypt.au3>
    #include <Date.au3>
    #include <DateTimeConstants.au3>
    #include <Debug.au3>
    #include <DirConstants.au3>
    #include <EditConstants.au3>
    #include <EventLog.au3>
    #include <Excel.au3>
    #include <ExcelConstants.au3>
    #include <File.au3>
    #include <FileConstants.au3>
    #include <FontConstants.au3>
    #include <FrameConstants.au3>
    #include <FTPEx.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GuiAVI.au3>
    #include <GuiButton.au3>
    #include <GuiComboBox.au3>
    #include <GuiComboBoxEx.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiDateTimePicker.au3>
    #include <GuiEdit.au3>
    #include <GuiHeader.au3>
    #include <GuiImageList.au3>
    #include <GuiIPAddress.au3>
    #include <GuiListBox.au3>
    #include <GuiListView.au3>
    #include <GuiMenu.au3>
    #include <GuiMonthCal.au3>
    #include <GuiReBar.au3>
    #include <GuiRichEdit.au3>
    #include <GuiScrollBars.au3>
    #include <GuiSlider.au3>
    #include <GuiStatusBar.au3>
    #include <GuiTab.au3>
    #include <GuiToolbar.au3>
    #include <GuiToolTip.au3>
    #include <GuiTreeView.au3>
    #include <HeaderConstants.au3>
    #include <IE.au3>
    #include <ImageListConstants.au3>
    #include <Inet.au3>
    #include <InetConstants.au3>
    #include <IPAddressConstants.au3>
    #include <ListBoxConstants.au3>
    #include <ListViewConstants.au3>
    #include <Math.au3>
    #include <MathConstants.au3>
    #include <Memory.au3>
    #include <MemoryConstants.au3>
    #include <MenuConstants.au3>
    #include <Misc.au3>
    #include <MsgBoxConstants.au3>
    #include <NamedPipes.au3>
    #include <NetShare.au3>
    #include <NTSTATUSConstants.au3>
    #include <Process.au3>
    #include <ProcessConstants.au3>
    #include <ProgressConstants.au3>
    #include <RebarConstants.au3>
    #include <RichEditConstants.au3>
    #include <ScreenCapture.au3>
    #include <ScrollBarConstants.au3>
    #include <ScrollBarsConstants.au3>
    #include <Security.au3>
    #include <SecurityConstants.au3>
    #include <SendMessage.au3>
    #include <SliderConstants.au3>
    #include <Sound.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include <StaticConstants.au3>
    #include <StatusBarConstants.au3>
    #include <String.au3>
    #include <StringConstants.au3>
    #include <StructureConstants.au3>
    #include <TabConstants.au3>
    #include <Timers.au3>
    #include <ToolbarConstants.au3>
    #include <ToolTipConstants.au3>
    #include <TrayConstants.au3>
    #include <TreeViewConstants.au3>
    #include <UDFGlobalID.au3>
    #include <UpDownConstants.au3>
    #include <Visa.au3>
    #include <WinAPI.au3>
    #include <WinAPICom.au3>
    #include <WinAPIConstants.au3>
    #include <WinAPIConv.au3>
    #include <WinAPIDiag.au3>
    #include <WinAPIDlg.au3>
    #include <WinAPIError.au3>
    #include <WinAPIEx.au3>
    #include <WinAPIFiles.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIGdiDC.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIIcons.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPIlangConstants.au3>
    #include <WinAPILocale.au3>
    #include <WinAPIMem.au3>
    #include <WinAPIMisc.au3>
    #include <WinAPIProc.au3>
    #include <WinAPIReg.au3>
    #include <WinAPIRes.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPIShPath.au3>
    #include <WinAPISys.au3>
    #include <WinAPIsysinfoConstants.au3>
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WinAPITheme.au3>
    #include <WinAPIvkeysConstants.au3>
    #include <WindowsConstants.au3>
    #include <WinNet.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
    Alles anzeigen
  • _Array2DSortFree äöü richtig sortieren

    • Bitnugger
    • 15. Juni 2020 um 20:41

    AspirinJunkie

    Hier hast du übrigens einen Fehler drin:

    Local $a_Temp, $d_Ret, $b_Ret - sind im If-Zweig deklariert, $a_Temp wird auch und $b_Ret wird nur im Else-Zweig benutzt, doch dort sind sie nicht deklariert!

    _DynArraySort.png

    Und im Performancevergleich _ArrayAdd - _DynArrayPush könntest du den Code im Spoiler in Code-Tags setzen, der steht da nämlich als Einzeiler drin.

  • [Nim] getIncludesOfIncludes

    • Bitnugger
    • 15. Juni 2020 um 20:23

    Ich habe da mal ein wenig mit gespielt... das geht ja wirklich sauschnell mit Nim!

    Momentan sieht das dann so aus:

    >getIncludesOfIncludes.exe "c:\Program Files (x86)\AutoIt3\Include\" m:\Temp\IncTest.ini

    ...

    0:WinAPIlangConstants.au3:

    3:WinAPILocale.au3:APILocaleConstants.au3|StringConstants.au3|WinAPIInternals.au3

    1:WinAPIMem.au3:WinAPIInternals.au3

    5:WinAPIMisc.au3:APIMiscConstants.au3|StringConstants.au3|StructureConstants.au3|WinAPIConv.au3|WinAPIMem.au3

    8:WinAPIProc.au3:APIProcConstants.au3|Security.au3|SecurityConstants.au3|StringConstants.au3|WinAPICom.au3|WinAPIError.au3|WinAPIHObj.au3|WinAPIShPath.au3

    6:WinAPIReg.au3:APIRegConstants.au3|StringConstants.au3|StructureConstants.au3|WinAPICom.au3|WinAPIError.au3|WinAPIMem.au3

    6:WinAPIRes.au3:APILocaleConstants.au3|APIResConstants.au3|WinAPIConv.au3|WinAPIError.au3|WinAPIIcons.au3|WinAPIInternals.au3

    ...

    Die kompletten Includes von der Release, Beta und User, sind damit in nur wenigen Sekunden komplett durchsucht.

    Warum die Spielerei?

    Deshalb:

    inc_file_au3.png

    Code
    import os
    import strutils
    include winim/[inc\shellapi]
    
    proc getIncludesOfIncludes(sPath, sSaveTo: string): int =
      var
        entireFile, sLine, sIncludesOfIncludes, pattern, match: string = ""
        spacer: string = "\n" & repeat("-", 31) & "\n"
        iline, fileCount: int = 0
      # echo "sPath   = (" & $type(sPath) & ") " & sPath
      # echo "sSaveTo = (" & $type(sSaveTo) & ") " & sSaveTo
      var wPath = newWideCString(sPath, 4096)
      if PathFileExistsW(cast[LPCWSTR](wPath)) != TRUE:
        echo "File not found!\n===>>> " & sPath
        quit(3)
      if PathIsDirectoryW(cast[LPCWSTR](wPath)) == FILE_ATTRIBUTE_DIRECTORY:
        pattern = r"\*.au3"
      discard tryRemoveFile(sSaveTo)
      # echo "spath.len = ", spath.len
      # echo "sPath & pattern = " & sPath & pattern
      for walk in walkFiles(sPath & pattern):
        fileCount += 1
        # echo "walk (" & $type(walk) & ") = " & walk
        entireFile = readFile(walk)         # * Hier könnte noch viel Zeit ein-
        for line in splitLines(entireFile): # * gespart werden, wenn z.B. nur die
          if line.startsWith("#include "):  # * ersten 100 Zeilen durchsucht werden.
            # echo "line  (" & $type(line) & ")  = " & line
            match = line[10..^2] # ? #include '"< entfernen
            var k = 5 # ? x.au3 <<<=== min. 5 Zeichen
            while k < len(match): # ? >'".* entfernen
              if match[k] == chr(34) or match[k] == chr(39) or match[k] == chr(62):
                match = match[0..k - 1]
                break
              inc(k)
            # echo "match (" & $type(match) & ") = " & match
            if not contains(sLine, match): # ? include mehrfach deklariert!
              if sLine != "": sLine &= "|"
              sLine &= match
              match = ""
              iline += 1
        var f = splitFile(walk) # * c:\Program Files...\|Array|.au3
        sIncludesOfIncludes &= $iline & ":" & f.name & f.ext & ":" & sLine & "\n"
        result += iLine
        iline = 0
        sLine = ""
        echo "----- IncludesOfIncludes -----\n",
          "Files: ", fileCount, ", Matches: ", result,"\n",
          spacer,
          sIncludesOfIncludes
        writeFile(sSaveTo, sIncludesOfIncludes)
    
    var usage: string = r"Usage: getIncludesOfIncludes <Filename.au3|Dirname> <SaveAs.ini>\nDirname without trailing backslash!"
    if paramCount() == 2:
      var
        sPath = paramStr(1)
        sSaveAs = paramStr(2)
      if splitFile(sSaveAs).ext != ".ini":
        echo sPath, " ", sSaveAs, "\n", usage
        quit(2)
      var res = getIncludesOfIncludes(sPath, sSaveAs)
      echo "Number of matches: ", res
    else:
      echo "paramCount() = ", paramCount()
      echo usage
      # quit(1)
    
    
    #[ Als Parameter entweder eine Datei oder ein Verzeichnisse übergeben,
       und den Daeipfad, unter dem das Ergebnis gespeichert werden soll.
    
    getIncludesOfIncludes(r"m:\Temp\GUICreate.au3", r"m:\Temp\IncludesOfIncludesTest.ini")
    
    getIncludesOfIncludes(r"f:\AutoIt\AutoIt3_MyInclude", r"m:\Temp\IncludesOfIncludesUser.ini")
    getIncludesOfIncludes(r"c:\Program Files (x86)\AutoIt3\Include", r"m:\Temp\IncludesOfIncludesProd.ini")
    getIncludesOfIncludes(r"c:\Program Files (x86)\AutoIt3\Beta\Include", r"m:\Temp\IncludesOfIncludesBeta.ini")
     ]#
    Alles anzeigen
  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2020.04.13)

    • Bitnugger
    • 13. Juni 2020 um 11:49
    Zitat von BugFix

    Ich muss ganz ehrlich sagen, dass ich bei einigen meiner eigenen UDF nach heutigem Wissenstand durchaus auch an deren Notwendigkeit zweifle.

    Hihi, ja, das ist aber wohl bei allen Usern der Fall... einerseits erschreckend, was man da teilweise fabriziert hat, andererseits aber auch sehr belustigend und es zeigt einem vor allem aber auch, wie viel man zwischenzeitlich dazu gelernt hat. Ich splitte mir die Pfade meistens mit RegEx...

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2020.04.13)

    • Bitnugger
    • 13. Juni 2020 um 11:15
    Zitat von Professor Bernd

    "E:\Dir-1\Dir-2\Dir-3\Dir-4\test" => nach meinem Verständnis müsste herauskommen

    "F:\Dir-1\Dir-2\Dir-3\Dir-4\Dir-1\Dir-2\test" => aber es raus kam

    "F:\Dir-1\Dir-2\test"

    Das wäre ja quatsch... dann könntest du auch einfach...

    $FullPath = $sBasePath & $sRelativePath

    ...schreiben.

    Local $sTestPath = _PathFull("\Dir-1\Dir-2\test", "F:\Dir-1\Dir-2\Dir-3\Dir-4")

    ===>>> F:\Dir-1\Dir-2\test

    Der Gedanke bei dieser Funktion war wohl, $sRelativePath in $sBasePath zu finden und den linken Teil, falls gefunden, der bei $sRelativePath fehlt, zu ergänzen... insgesamt betrachtet ist die Funktion aber eher ein Witz.

    Als ich mit AutoIt angefangen hatte, habe ich die Path-Funktionen natürlich auch alle getestet, bin aber schnell zu dem Schluss gekommen, dass ich es doch besser selbst mache, denn ich spiele nicht gerne russisches Roulett.

    _PathFull Examples

    #include <File.au3>

    Local $FO = '%-92s %s\n'

    ConsoleWrite(StringFormat($FO, '> abs 0 ' & _PathFull(''), ''))

    ConsoleWrite(StringFormat($FO, '> abs 1 ' & _PathFull('Includes\'), ''))

    ConsoleWrite(StringFormat($FO, '+ abs 2 ' & _PathFull('Includes\', 'c:\Program Files (x86)\AutoIt3\'), ''))

    ConsoleWrite(StringFormat($FO, '+ abs 3 ' & _PathFull('Includes\', 'f:\_Archive\_Programmieren\'), ''))

    ConsoleWrite(StringFormat($FO, '+ abs 4 ' & _PathFull('\Dir-1\Dir-2\test', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ''))

    ConsoleWrite(StringFormat($FO, '! abs 5 ' & _PathFull('\Dir-3\Dir-4\test', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ' ===>>> F:\Dir-1\Dir-2\Dir-3\Dir-4\test'))

    ConsoleWrite(StringFormat($FO, '+ abs 6 ' & _PathFull('\Dir-1\Dir-3\Dir-2\test', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ''))

    ConsoleWrite(@CRLF)

    ConsoleWrite(StringFormat($FO, '! rel 0 ' & _PathFull('Includes\', '_Archive\_Programmieren\'), ' ===>>> _Archive\_Programmieren\Includes\'))

    ConsoleWrite(StringFormat($FO, '! rel 1 ' & _PathFull('Includes\', '_Archive\_Programmieren\AutoIt3\'), ' ===>>> _Archive\_Programmieren\AutoIt3\Includes\'))

    ConsoleWrite(@CRLF)

    ConsoleWrite(StringFormat($FO, '+ abs a ' & _PathFull('\Dir-1\', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ''))

    ConsoleWrite(StringFormat($FO, '! abs b ' & _PathFull('\Dir-2\', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ' ===>>> F:\Dir-1\Dir-2\'))

    ConsoleWrite(StringFormat($FO, '! abs c ' & _PathFull('\Dir-3\', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ' ===>>> F:\Dir-1\Dir-2\Dir-3\'))

    ConsoleWrite(StringFormat($FO, '! abs d ' & _PathFull('\Dir-4\', 'F:\Dir-1\Dir-2\Dir-3\Dir-4'), ' ===>>> F:\Dir-1\Dir-2\Dir-3\Dir-4'))

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2020.04.13)

    • Bitnugger
    • 13. Juni 2020 um 02:06

    Damit meinen sie, das man sich den Umweg mit diese Funktion ersparen kann, wenn man direkt mit absoluten Pfaden arbeitet.

  • GUI/Fenster bei Start des Scripts an gleicher Position wie beim letzten Mal öffnen

    • Bitnugger
    • 13. Juni 2020 um 01:56
    Zitat von Musashi

    Du könntest z.B. mittels WinGetPos die aktuelle Position und Größe des laufenden (aktiven) GUI's ermitteln und beim Beenden des Skriptes in eine .ini-Datei schreiben.

    WinGetPos allein reicht da aber nicht, denn damit bekommst du die Größe des Fensters mit Rahmen. Beim Erstellen einer GUI gibst du aber die Größe ohne Rahmen an, also die ClientSize! Die muss ergo auch ermittelt und gespeichert werden.

    GUICreate ( "title" [, width [, height [, left = -1 [, top = -1 [, style = -1 [, exStyle = -1 [, parent = 0]]]]]]] )

    Von WinGetPos brauchst left und top, von WinGetClientSize width und height.

    GUICreate ("title", $aWinPos[0], $aWinPos[1], $aClientSize[0], $aClientSize[1])

    Doch birgt dieses Vorgehen viele Tücken... denn es berücksichtigt nicht, ob ein Fenster minimiert oder maximiert ist - denn in beiden Fällen fehlt dir nachher die Größe, um ein WinSetState($hGUI, '', @SW_RESTORE) zu machen, weil du so ja nur die Größe für minimiert oder maximiert speicherst, was übgrigens zu einem weiteren Fehler führt.

    Wie @Musashi bereits empfohlen hat, solltest du deshalb besser einen Blick in den Thread WindowPlacement werfen.

    Ich habe hier im Anhang auch eine WindowPlacement-Version... ähnlich wie die von Oscar , und ein Example dazu, mit ein paar zusätzlichen Spielereien... schau dir einfach mal beide an...

    WM_GETMINMAXINFOMinimale Größe der MainGUI wird begrenzt, kann also nicht kleiner wie angegeben werden.
    WM_SIZEControls werden beim Verändern der Fenstergröße angepasst.
    WM_NCLBUTTONDBLCLKEin Doppelklick auf die rechte untere Ecke, da wo die Punkte sind, setzt die Größe des Fensters wieder zurück, so wie sie beim ersten Start war.

    WindowPlacement_Example.au3 starten, Fenster verschieben und dann Script beenden. Script erneut starten, und siehe da, die Fenster erscheinen an der Position, an die du sie vor Beenden des Scripts verschoben hattest.

    Ist die linke obere Ecke des Fensters nicht sichtbar, wird es verschoben. Wenn $g_bPrimary = False, auf den Monitor, der den Koordinaten am nähesten ist, an der sich das Fenster gerade befindet. $g_bPrimary = True, wird es auf den primären Desktop verschoben. Zusätzlich kann noch ein Offset angegeben werden... das erledigt dann die Funktion _CheckWinPos.

    Hier ein Bsp.: _CheckWinPos($g_hMainGUI, $g_bPrimary, 50)

    Gut zu wissen: Wenn die in WINDOWPLACEMENT angegebenen Informationen zu einem Fenster führen würden, das vollständig außerhalb des Bildschirms liegt, passt das System die Koordinaten automatisch so an, dass das Fenster sichtbar ist, wobei Änderungen der Bildschirmauflösung und der Konfiguration mehrerer Monitore berücksichtigt werden.

    Dateien

    _WindowPlacement.zip 7,13 kB – 290 Downloads
  • PSPad4AutoIt3 (Editor IDE)

    • Bitnugger
    • 11. Juni 2020 um 02:01
    Zitat von alpines

    Vermutlich meint Bitnugger, dass du diese mitparsen sollst.

    Ja, genau das meine ich. Das gilt natürlich auch für alle anderen User-spezifischen Sachen, wenn du es für die offiziellen machst.

    Diese Dateien solltest du inspizieren, und schauen ob da etwas von Interesse für dich drin ist:

    SciTE

    SciTEGlobal.properties

    SciTEStartup.lua ; für mich die wichtigste Datei! ;)

    abbrev.properties

    au3.keywords.abbreviations.properties

    au3.keywords.properties

    au3.pixmap.properties

    au3.properties

    au3_Old.properties

    au3abbrev.properties

    User

    SciTEUser.properties

    au3.UserUdfs.properties

    au3.keywords.user.abbreviations.properties

    au3.user.calltips.api

    au3userAbbrev.properties

    lua.user.properties

    python.user.properties

    Selbes natürlich auch für die Beta... falls vorhanden.

  • PSPad4AutoIt3 (Editor IDE)

    • Bitnugger
    • 10. Juni 2020 um 23:49
    Zitat von Professor Bernd

    - CallTipViewer für offiziellen AutoIt Funktionen. Das heißt, für Funktionen, die in der au3.api, bzw. in der AutoIt-Hilfe stehen, werden CallTips angezeigt.

    Wieso nicht auch für die Funktionen aus der au3.user.calltips.api?

  • _Winapi-Funktionen

    • Bitnugger
    • 10. Juni 2020 um 22:14
    Zitat von Tweaky

    Aber eine _ Winapi-Funktion die den Dateinamen ohne Dateiendung ausgibt gibt es nicht, oder?

    Eine nicht, aber wenn du sie verschachtelst:

    AutoIt
    #include <WinAPIShPath.au3>
    ConsoleWrite(_WinAPI_PathRemoveExtension(_WinAPI_PathStripPath(@AutoItExe)) & @CRLF) ; ===>>> autoit3_x64
  • Daten sichern und redundant speichern --- Vorschläge?

    • Bitnugger
    • 10. Juni 2020 um 21:48

    Hier auch gut beschrieben: RAID - Redundant Array of Independent Disk

  • Daten sichern und redundant speichern --- Vorschläge?

    • Bitnugger
    • 10. Juni 2020 um 16:34
    Zitat von Professor Bernd

    Vielleicht weiß jemand was dazu?

    https://www.attingo.com/de/blog/raid-ausfall-risiko-rebuild/

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™