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

  • Laminat Calculator

    • BugFix
    • 11. Juni 2024 um 14:28
    Zitat von Gun-Food

    Diele ist Vollholz und hat nicht direkt was mit Laminat zu tun. Das können zwei verschiedene Produkte sein.

    Nun, ich wollte nicht "Einzelnes-Laminat-Dingens" schreiben. 😂 Und in Beschreibungen habe ich "Dielen" gefunden. Dass eine Diele ohne weiteren Kontext als Langes Brett mit Nut und Feder zu sehen ist, ist schon klar. 😊

  • Laminat Calculator

    • BugFix
    • 10. Juni 2024 um 17:08

    Ich habe gerade 3 Räume, in denen ich Laminat verlegen muss. Um besser mit den Maßen jonglieren zu können, habe ich mir jetzt diesen Calculator erstellt.

    Die Länge des ersten Teils muss nur eingegeben werden, wenn keine Diele in voller Länge verwendet wird, das wird dann automatisch eingefügt. Wenn im Ergebnis untermaßige Teile erscheinen (rot markiert) muss durch Anpassen der Größe für das erste Teil korrigiert werden.

    Bei der Berechnung für die zweite Reihe wird zuerst versucht, das Restteil der ersten Reihe zu verwenden. Wenn Länge von Startteil und Endteil zusammen länger sind als eine volle Länge + Versatz, wird die Startlänge so angepasst, dass ein ganzes Teil am Ende zum Einsatz kommen kann.

    Analoger Ablauf für die Breite.

    Es lassen sich auch nur Länge oder nur Breite berechnen. Beide Berechnungen finden in eigenen Funktionen statt. Sind dafür keine Daten eingegeben, werden diese einfach nicht ausgeführt.

    Hinweis:
    Den Längenverlust durch die Sägeblattbreite habe ich vernachlässigt. Selbst bei einem sehr breiten Schnitt von 3 mm wären das pro Seite nur 1,5 mm Versatz - das verschwindet ungesehen unter der Wandleiste. ;)

    LaminatCalculator_1.png    LaminatCalculator_2.png

    Also, falls ihr demnächst auch was zu verlegen habt - Viel Spaß damit. ;)

    EDIT:
    Vielleicht nicht ganz unwichtig, ich habe als Verlegemuster den "Englischen Verband" zugrunde gelegt.

    Falls durch ungünstige Raummaße zu viel Verschnitt entsteht, dann lieber im Wilden Verband verlegen (Wie von Andy in Post 5 beschrieben).

    Dateien

    LaminatCalc.au3 7,81 kB – 291 Downloads
  • _ConsoleWriteMap

    • BugFix
    • 21. Mai 2024 um 14:30
    Zitat von Mars

    Damit sieht man eindeutig womit man es zu tun hat.

    Hab ich jetzt (ähnlich) ergänzt.

    Btw. - sehr unglücklich finde ich, dass eine ohne Inhalt deklarierte Variable als Typ "String" erkannt wird. Automatische Vorbelegung mit Null wäre ein Träumchen. :saint:

  • _ConsoleWriteMap

    • BugFix
    • 21. Mai 2024 um 12:17

    Ausgabe des Inhalts einer Map als Schlüssel-Wert-Paare in die Konsole.
    Für nicht darstellbare Werte wird deren Typ ausgegeben.

    Edit: Ich habe mal die Markierung für String-Werte mit eingefügte. Danke für den Hinweis Mars

    AutoIt
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _ConsoleWriteMap
    ; Description ...: Writes the content of a map as key-value pairs to the console.
    ; ...............: For values that cannot be displayed, their type is specified.
    ; Syntax ........: _ConsoleWriteMap($_m)
    ; Parameters ....: $_m                  - The map to be displayed.
    ; Return values .: None
    ; Author ........: BugFix
    ; ==================================================================================================
    Func _ConsoleWriteMap(ByRef $_m)
        Local $aC[] = ['->  ', '>>  '], $n = 0, $sType, $vValue
        Local $sOut = StringFormat('    %-20s%s-- VALUE --\n', '-- KEY --')
        For $k In MapKeys($_m)
            $n = Abs($n -1)
            $sType = VarGetType($_m[$k])
            Switch $sType
                Case 'Array', 'Map', 'Object', 'DLLStruct', 'Function', 'UserFunction'
                    $vValue = $sType
                Case 'Keyword'
                    $vValue = (IsKeyword($_m[$k]) = 1 ? 'Default' : 'Null')
                Case 'String'
                    $vValue = '"' & $_m[$k] & '"'                
                Case Else
                    $vValue = String($_m[$k])
            EndSwitch
            $sOut &= StringFormat('%s%-20s%s%s\n', $aC[$n], $k, $vValue)
        Next
        ConsoleWrite($sOut & @CRLF)
    EndFunc
    Alles anzeigen
    AutoIt
    Local $a[] = [1,2,3], $m0[], $o = ObjCreate('Scripting.Dictionary'), $nothing
    Local $m[]
    $m.Arr = $a
    $m.Map = $m0
    $m.Obj = $o
    $m.String = 'Bla'
    $m.Num = 15
    $m.NumStr = "15"
    $m.Empty = $nothing
    $m.Struct = DllStructCreate('double')
    $m.Ptr = DllStructGetPtr($m.Struct)
    $m.Hwnd = WinGetHandle('[ACTIVE]')
    $m.Null = Null
    $m.Def = Default
    $m.Func = MsgBox
    $m.UserFunc = _ConsoleWriteMap
    
    _ConsoleWriteMap($m)
    Alles anzeigen

  • Parameterübergabe an SciTE-Lua-Interface

    • BugFix
    • 17. Mai 2024 um 22:38
    Zitat von AspirinJunkie

    Werden Anführungszeichen in Lua nicht mit vorangesteltem Backslash escaped?

    Ja, habe das auch damit probiert. Direkt als Luaskript ausgeführt funktioniert es. Übergebe ich das an die Director Extension zum Ausführen schlägt es fehl.

    Ich habe das Skript mal auf das absolute Minimum reduziert. Die Zeile zum Auswerten (der Funktionsparameter) wird hier immer in doppelte Anführungseichen gesetzt und bereits vorhandene doppelte vorab mit Backslash maskiert. (Zeilen 84 - 87)

    AutoIt
    Global $gSciTECmd
    GUIRegisterMsg(74, "MY_WM_COPYDATA")  ; $WM_COPYDATA = 74
    
    ; --------------------------------------------------------------------------------------------------
    ; extrahiert für alle gefundenen Variablen:
    ; Var_1 @ Var_1_Name & optional Indexwert | Var_3 @ Var_2_Name ... etc.
    ; Der Ergebnisstring wird in der Weiterverarbeitung noch in ".." eingeschlossen.
    
    ;~ ConsoleWrite(_GetVarsFromLine("$xyz = $abc['xy']") & @CRLF)      ; OK: $abc['xy']@$abc[" & 'xy' & "]|$xyz@$xyz
    
    ;~ ConsoleWrite(_GetVarsFromLine("$n = $a[$a[0][0]][0]") & @CRLF)      ; OK: $a[$a[0][0]][0]@$a[" & $a[0][0] & "][0]|$n@$n
    
    ConsoleWrite(_GetVarsFromLine("$m[""x""] = 'c'") & @CRLF)      ; FAIL: sParam ist i.O.: ("$m[\"x\"] = 'c'")
    ; [string "do function MatchVarsFromLine(_l)    tpatt = ..."]:1: ')' expected near 'x'
    
    ; Ausführen direkt in Lua:
    ; print(MatchVarsFromLine("$m[\"x\"] = 'c'"))  --> OK: $m["x"]@$m[" & 'x' & "]
    
    ; --------------------------------------------------------------------------------------------------
    
    Func _GetVarsFromLine($_line)
    ;~   -- matches:    ($abc)[*][*][*]       ($abc)[*][*]     ($abc)[*]        $a[*][*][*]
    ;~   --                $a[*][*]              $a[*]           $abc.Bla          $abc
        local $sFunc = _
        "function MatchVarsFromLine(_l)" & _
        "    tpatt = {'(%b()%b[]%b[]%b[])', '(%b()%b[]%b[])', '(%b()%b[])', '(%$[_%w]+%b[]%b[]%b[])'," & _
        "             '(%$[_%w]+%b[]%b[])', '(%$[_%w]+%b[])', '(%$[_%w]+%.%w+)', '(%$[_%w]+)'}" & _
        "    local sgl, dbl, sVars, sVarsStr, n, s0, s1 = string.char(39), string.char(34), '', '', 0" & _
        "    for i=1, #tpatt do" & _
        "        while true do" & _
        "            local s, e, v = _l:find(tpatt[i])" & _
        "            if s == nil then break end" & _
        "            n = n +1" & _
        "            sVarsStr = v:gsub('%b[]'," & _
        "                function(_b) _b = _b:gsub('^%[', ''):gsub('^%s+', '')" & _
        "                    _b = _b:gsub('%]$', ''):gsub('%s+$', '')" & _
        "                    if _b:find('^%d+$') then return '['.._b..']' end" & _
        "                    if (_b:find('^'..sgl) or _b:find('^'..dbl)) then" & _
        "                       _b = ('%s%s%s'):format(sgl, _b:sub(2, _b:len()-1), sgl) end" & _
        "                    return ('[%s & %s & %s]'):format(dbl, _b, dbl) end)" & _
        "            sVars = sVars..v..'@'..sVarsStr..'|'" & _
        "            s0, s1 = _l:sub(1, s-1), _l:sub(e +1)" & _
        "            _l = s0..s1" & _
        "        end" & _
        "    end" & _
        "    return sVars:gsub('|$', '') " & _
        "end"
        Return _ScI_DostringGet($sFunc, $_line)
    EndFunc
    
    
    ;===============================================================================
    ; Function Name....: _ScI_DostringGet
    ; Description......: Eine Luafunktion mit/ohne Parameter aufrufen UND ein Ergebnis erhalten
    ;                  : Maximal 10 Parameter können übergeben werden.
    ; Parameter(s).....: $_sLuaFunc   - String mit der Lua-Funktion
    ;                  : $p1          - [optional] Parameter1 für die Funktion
    ;                  : ...            bis
    ;                  : $p10         - [optional] Parameter10 für die Funktion
    ; Return Value(s)..: Rückgabewert der Lua-Funktion
    ; Author(s)........: BugFix
    ; Note.............: Achtung! Der Code darf !keine! Kommentare enthalten!
    ;-------------------------------------------------------------------------------
    ; Bsp.:
    ; ohne Parameter:
    ;   Local $sFunc = "function LineFromCursor() return editor:LineFromPosition(editor.CurrentPos)+1 end"
    ;   ConsoleWrite(_ScI_DostringGet($sFunc) & @CRLF)
    ;
    ; mit Parameter:
    ;   Local $sFunc = "function LineEnd(iLine) return editor.LineEndPosition[iLine] end"
    ;   ConsoleWrite(_ScI_DostringGet($sFunc, 130) & @CRLF)
    ;===============================================================================
    Func _ScI_DostringGet($_sLuaFunc, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
    	Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10]
    	; extract function name
    	Local $sFunc = (StringRegExp($_sLuaFunc, 'function (\w+)\(', 1))[0], $sParam = '()'
        Local $sPart
    	If $p1 <> Null Then
    		; extract parameters
    		$sParam = (StringRegExp($_sLuaFunc, 'function \w+\(([^)]+)\)', 1))[0]
    		Local $aParam = StringSplit($sParam, ',')
    		; rebuild sParam with given values
    		$sParam = ''
    		For $i = 1 To $aParam[0]
                $sPart = StringReplace($aParamCall[$i-1], '"', '\"')
    			$sParam &= '"' & $sPart & '"' & ','
    		Next
    		$sParam = '(' & StringTrimRight($sParam,1) & ')'
    	EndIf
    ConsoleWrite('-> sParam: ' & $sParam & @CRLF)
    
    	SendSciTE_Command("extender:dostring do props['extender.result'] = '' end")
    	SendSciTE_Command("extender:dostring do " & $_sLuaFunc & " props['extender.result'] = " & $sFunc & $sParam & " end")
    	SendSciTE_Command('askproperty:extender.result')
    	Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
    EndFunc
    
    Func _GetHwndDirectorExtension()
        Local $hActive = WinGetHandle('[ACTIVE]')
        Local $PIDActive = WinGetProcess($hActive)
        Local $aExtension = WinList("DirectorExtension")
        Local $PIDExt
        For $i = 1 To $aExtension[0][0]
            $PIDExt = WinGetProcess($aExtension[$i][1])
            If $PIDExt = $PIDActive Then Return $aExtension[$i][1]
        Next
    EndFunc
    
    Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0)
        Local $WM_COPYDATA = 74
        Local $Scite_hwnd = _GetHwndDirectorExtension()          ; Get SciTE Director Handle
        Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface")    ; Create GUI to receive SciTE info
        Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2))    ; Convert my Gui Handle to decimal
        $_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd               ; Add dec my gui handle to commandline to tell SciTE where to send the return info
        Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']')
        DllStructSetData($CmdStruct, 1, $_sCmd)
        Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
        DllStructSetData($COPYDATA, 1, 1)
        DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1)
        DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    	$gSciTECmd = ''
        DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
                'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
                'Ptr', DllStructGetPtr($COPYDATA))
        GUIDelete($My_Hwnd)
    	If $Wait_For_Return_Info Then
    		Local $n = 0
    		While $gSciTECmd = '' Or $n < 10
    			Sleep(20)
    			$n += 1
    		WEnd
    	EndIf
    	Return $gSciTECmd
    EndFunc   ;==>SendSciTE_Command
    
    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    	Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    	Local $gSciTECmdLen = DllStructGetData($COPYDATA, 2)
        Local $CmdStruct = DllStructCreate('Char[' & $gSciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3))
    	$gSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $gSciTECmdLen)
    EndFunc   ;==>MY_WM_COPYDATA
    Alles anzeigen

    Dateien

    LuaRun.au3 7,02 kB – 183 Downloads
  • Parameterübergabe an SciTE-Lua-Interface

    • BugFix
    • 17. Mai 2024 um 18:42

    Ich trete ein wenig auf der Stelle. Stringauswertungen mache ich gern im Lua-Interface, einige Parsingmöglichkeiten sind dort einfacher und effektiver als in AutoIt.
    Nun mein Problem: Ich übergebe eine kpl. Zeile AutoIt-Code aus SciTE an meine Luafunktion. Diese muss als String übergeben werden. Da ich den Parameter in einen Lua String einfüge, kann ich alle Lua-Stringbegrenzer verwenden:  '...', "...", [[...]] .
    $a[$i] = $x wird zu "$a[$i] = $x"
    $m["abc"] = $x wird zu '$m["abc"] = $x'
    $s = "Hallo 'schöne' Welt!" wird zu [[$s = "Hallo 'schöne' Welt!"]]

    aber wie kann ich solch ein (mögliches) Szenario abfangen?
    $a[$a[0][0]][1] =  "Hallo 'schöne' Welt!"
    Durch die innenliegenden zweifach schließenden eckigen Klammern kann ich die Klammern nicht verwenden. Einfache und doppelte Anführungszeichen (egal in welcher Reihenfolge) brechen den String auf. Ersatzzeichen, z.B. Chr(1), könnte ich für eine spezielle Funktion sicher nutzen und intern wieder zurückführen, aber damit ist dann eine allgemeine Nutzung der Luafunktion eingeschränkt, weil eben diese Ersatzzeichen niemals für andere Funktionen vorkommen dürfen.

    Also, ich bin offen für eure Ideen.

  • Frage zu seltsamen Verhalten von _WinAPI_CopyFileEx

    • BugFix
    • 17. Mai 2024 um 16:01
    Zitat von hipfzwirgel

    Hast du evtl. auch eine Erklärung für uns warum das Verhalten auftritt? Wie kann die GUI(ich denke damit meintest du das Progressbarfenster)
    denn den Focus verlieren und weshalb passiert das nicht beim Hilfecode? Liegt es an der Dauer des Kopiervorganges(meine Testdatei ist deutlich größer als die der Hilfe)?

    Ich nehme mal an (weiß es aber nicht definitiv), dass die Callback-Funktion in einem eigenen Prozess läuft, der "empfindlich" auf Störungen reagiert.
    Durch Volatile wird diese Funktion mit einer Art "Schutzschicht" umgeben, sodass sie störungsfrei laufen kann.

    Soweit meine laienhafte Erklärung, aber evtl. kann das jemand noch genauer beleuchten. ;)


    Nachtrag:
    Ich hänge dir mal eine für meinen Job erstellte Kopierfunktion an, vielleicht hilfreich. Musst zum Ausführen nur noch meine "GroupEx.au3" einbinden (oder die betreffenden Passagen auskommentieren).

    Dateien

    GDICopyTool.au3 8,21 kB – 192 Downloads
  • Frage zu seltsamen Verhalten von _WinAPI_CopyFileEx

    • BugFix
    • 17. Mai 2024 um 07:37

    hipfzwirgel

    Dieses Verhalten passiert schon in dem Moment, wenn deine Gui den Fokus verliert.

    Lösung: Verwende für deine Callbackfunktion das Keyword:

    Volatile

  • SciTE - markierten Code zum Debuggen ausführen "RunSelectedCode"

    • BugFix
    • 26. April 2024 um 15:16

    Wir hatten ja gerade das Thema Debugging. Ich habe dazu eine Funktion, die ich in der OwnHotkeys UDF habe nach AutoIt übertragen. So funktioniert es:

    Code
    Markierung im Skript wird kopiert und zusammen mit allen Includes aus dem Skript in eine temporäre
    Datei im Skriptordner geschrieben (__TMP__RunSelected.au3).
    Zusätzlich werden Consolenausgabebefehle eingefügt für:
        - In Funktionsdeklaration alle Parameter
        - ansonsten alle auftauchenden Variablen
        - Ignoriert werden Variablen in Deklarationszeilen (Global/Local/Dim) und im 'Switch'-Kopf
        - Integrierte Variablenerkennung für:
            $a[$i][$j] , $m["k"]["j"]
            ($abc)[$i][$j]
            ($abc)[$i]
            $a[$i] , $m["k"]
            $abc.Bla
            $abc
    Consolenausgabe, Variablen anspringbar mit DblClick auf Ausgabezeile:
        @LINE       ZeileNR   ( Variablenname, bei Array: mit aktuellen Indexwerten )   < Variablentyp >    Wert
        z.B.:   @LINE		32 ( $a[0][0] )		< String >		value: c
    
    Standardmäßig wird die erstellte Datei automatisch gestartet. Wenn die Variable "$gbCopyOnly = True"
    gesetzt wird, erfolgt kein automatisches Ausführen (EXE-Aufruf mit Parameter).
    
    • Skript kompilieren
    • In "SciTEUser.properties" eintragen:
        command.name.9.$(au3)=Run Selected Code
        command.mode.9.$(au3)=subsystem:0
        command.9.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe"
        command.shortcut.9.$(au3)=Ctrl+Alt+R
    
        Um nur das Skript zu erstellen mit Parameter "True" od. "1" aufrufen:
    
        command.name.10.$(au3)=Create Script From Selection
        command.mode.10.$(au3)=subsystem:0
        command.10.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe" "True"
        command.shortcut.10.$(au3)=Ctrl+Alt+C
    
    • Pfad der EXE anpassen
    • command-Nr. nach freier Nummer bei euch auswählen (ohne Eintrag ist die erste freie: 36)
    • ggf. Shortcut anpassen
    Alles anzeigen

    Die Variablenerkennung deckt alle häufigen Schreibweisen ab. Natürlich nicht alles. Wenn ihr da noch erweitern möchtet, kann in der Funktion _GetVars die Patternliste erweitert werden. Aber beachten, dass in der richtigen Reihenfolge abgefragt wird, erkannte Variablen werden sofort aus der Zeile entfernt, bevor mit dem nächsten Pattern geprüft wird.

    Ich verwende meine "SciTE_GetInfo.au3" in dem Skript, ist mit angehängt.

    AutoIt: RunSelectedCode
    #cs
    Markierung im Skript wird kopiert und zusammen mit allen Includes aus dem Skript in eine temporäre
    Datei im Skriptordner geschrieben (__TMP__RunSelected.au3).
    Zusätzlich werden Consolenausgabebefehle eingefügt für:
        - In Funktionsdeklaration alle Parameter
        - ansonsten alle auftauchenden Variablen
        - Ignoriert werden Variablen in Deklarationszeilen (Global/Local/Dim) und im 'Switch'-Kopf
        - Integrierte Variablenerkennung für:
            $a[$i][$j] , $m["k"]["j"]
            ($abc)[$i][$j]
            ($abc)[$i]
            $a[$i] , $m["k"]
            $abc.Bla
            $abc
    Consolenausgabe, Variablen anspringbar mit DblClick auf Ausgabezeile:
        @LINE       ZeileNR   ( Variablenname, bei Array: mit aktuellen Indexwerten )   < Variablentyp >    Wert
        z.B.:   @LINE		32 ( $a[0][0] )		< String >		value: c
    
    Standardmäßig wird die erstellte Datei automatisch gestartet. Wenn die Variable "$gbCopyOnly = True"
    gesetzt wird, erfolgt kein automatisches Ausführen (EXE-Aufruf mit Parameter).
    
    • Skript kompilieren
    • In "SciTEUser.properties" eintragen:
        command.name.9.$(au3)=Run Selected Code
        command.mode.9.$(au3)=subsystem:0
        command.9.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe"
        command.shortcut.9.$(au3)=Ctrl+Alt+R
    
        Um nur das Skript zu erstellen mit Parameter "True" od. "1" aufrufen:
    
        command.name.10.$(au3)=Create Script From Selection
        command.mode.10.$(au3)=subsystem:0
        command.10.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe" "True"
        command.shortcut.10.$(au3)=Ctrl+Alt+C
    
    • Pfad der EXE anpassen
    • command-Nr. nach freier Nummer bei euch auswählen (ohne Eintrag ist die erste freie: 36)
    • ggf. Shortcut anpassen
    
    #ce
    
    #include <FileConstants.au3>
    #include <String.au3>
    #include "SciTE_GetInfo.au3"   ; <<<< PFAD ANPASSEN !!!
    
    
    Global $gbCopyOnly = False  ; mit True wird die Datei '\__TMP__RunSelected.au3' in SciTE erstellt, aber nicht automatisch ausgeführt
    If $CMDLINE[0] Then $gbCopyOnly = ($CMDLINE[1] = 1 Or $CMDLINE[1] = 'True') ? True : False
    
    Global $gSciTECmd
    GUIRegisterMsg(74, "MY_WM_COPYDATA")  ; $WM_COPYDATA = 74
    
    _SGI_SetPollTime(-1)    ; automatisches Aktualisieren deaktivieren
    
    Global $gmSciTE = _SGI_GetAllHwnd(True)
    ; MapSciTE    Keys:   .PID       = SciTE Process ID
    ;                     .hWnd      = hwndSciTE
    ;                     .Title     = SciTE Window Title
    ;                     .Director  = hWnd DirectorExtension
    ;                     .Editor    = hWnd Editor pane
    ;                     .Output    = hWnd Output pane
    ;                     .Toolbar   = hWnd Toolbar Ctrl
    ;                     .TabCtrl   = hWnd Tab Ctrl
    ;                     .iTabItem  = Index of the current active Tab-Item
    ;                     .sTabItem  = Text of the current active Tab-Item
    ;                     .Statusbar = hWnd Statusbar Ctrl
    
    Global $ghActive = _SGI_GetActiveSciTEHwnd()
    If $ghActive = Null Then Exit MsgBox(16, "Fehler", "Das aktive Fenster ist kein SciTE-Fenster!")
    
    
    
    _RunSelectedCode()
    
    
    
    Func _RunSelectedCode()
        _ScI_Dostring('output:ClearAll()')
    	Local $sErr = '!>> [Error RunSelectedCode] >> '
    	If _ScI_GetProperty('FileExt') <> 'AU3' Then Return _ScI_OutputToConsole($sErr & 'Attempting to run code from a non-au3 file!')
    	Local $sFileDir = _ScI_GetProperty('FileDir')
    	Local $sSel = _ReadSelection()
    	If $sSel = '' Then Return
        $sSel = _SelectionAddOutput($sSel)
    	Local $sText = _GetEditorText()
        Local $sIncl = _GetIncludes($sText) & @CRLF
    	Local $newPath = StringRegExpReplace($sFileDir & '\__TMP__RunSelected.au3', '\\+', '/')
        Local $sFuncAdd =  @CRLF &  @CRLF & _
            ";------------------------------ ONLY FOR DEBUG ----------------------------------------------------" &  @CRLF & _
            "Func _GetTypeAndValue($_v)" &  @CRLF & _
            "    Local $type = VarGetType($_v), $value" &  @CRLF & _
            "    Switch $type" &  @CRLF & _
            "        Case 'Array', 'Map', 'Object', 'DLLStruct', 'Function', 'UserFunction'" &  @CRLF & _
            "            $value = ''" &  @CRLF & _
            "        Case 'Keyword'" &  @CRLF & _
            "            $value = (IsKeyword($_v) = 1 ? 'Default' : 'Null')" &  @CRLF & _
            "        Case 'Ptr'" &  @CRLF & _
            "            $type = IsHWnd($_v) ? 'Handle' : 'Ptr'" &  @CRLF & _
            "            $value = $_v" &  @CRLF & _
            "        Case Else" &  @CRLF & _
            "            $value = String($_v)" &  @CRLF & _
            "    EndSwitch" &  @CRLF & _
            "    Return StringFormat('< %s >%s %s', $type, ($value = '' ? '' : @TAB & @TAB & 'value:'), $value)" &  @CRLF & _
            "EndFunc" & @CRLF
        Local $fh = FileOpen($newPath, BitOR($FO_UTF8,$FO_OVERWRITE))
    	FileWrite($fh, $sIncl & $sSel & $sFuncAdd)
        FileClose($fh)
    	_ScI_Dostring('scite.Open("' & $newPath & '")')
        If $gbCopyOnly Then Return
    	_ScI_Dostring('scite.MenuCommand(IDM_GO)')
    EndFunc
    
    
    Func _ReadSelection()
        Local $sFunc = "function ReadSelection() read = editor:GetSelText() return read end"
        Return StringReplace(_ScI_DostringGet($sFunc), '\r\n', @CRLF)
    EndFunc
    
    
    Func _SelectionAddOutput($_sSel)
        $_sSel = StringReplace($_sSel, ' _' & @CRLF, ' ')   ; Zeilenfortschreibungen entfernen
        Local $aLines = StringSplit($_sSel, @CRLF, 1), $sRet = '', $nCmtBlock = 0, $bIsCmnt = False
        For $i = 1 To $aLines[0]
            Switch StringLeft(StringStripWS($aLines[$i], 1), 3)
                Case '#cs'
                    $bIsCmnt = True
                    $nCmtBlock += 1
                Case '#ce'
                    $nCmtBlock -= 1
            EndSwitch
            If $bIsCmnt And $nCmtBlock > 0 Then                             ; Kommentarblock Start / innen
                $sRet &= $aLines[$i] & @CRLF
            ElseIf $bIsCmnt And $nCmtBlock = 0 Then                         ; Kommentarblock Ende
                $bIsCmnt = False
                $sRet &= $aLines[$i] & @CRLF
            ElseIf StringLeft(StringStripWS($aLines[$i], 1), 1) = ';' Then  ; Kommentarzeile
                $sRet &= $aLines[$i] & @CRLF
            Else                                                            ; kein Kommentar
                $sRet &= _ScanLine(StringStripWS($aLines[$i], 2))
            EndIf
        Next
        Return $sRet
    EndFunc
    
    
    Func _ScanLine($_line)
        If $_line = '' Then Return @CRLF
        If StringRegExp($_line, '^(?i)Func') Then       ; Function Declaration
            Local $sFuncName = StringRegExp($_line, '^(?i)Func\s+([_a-z0-9]+)', 1)[0]
            $_line = _GetParam($_line, $sFuncName)
        ElseIf StringRegExp($_line, '^(?i)\s*(Local|Global|Dim|Switch)') Then   ; Declaration
            ; ignore
        ElseIf StringRegExp($_line, '\$[_\w]+') Then    ; Variable in line
            $_line &= _GetVars($_line)
        EndIf
        Return $_line & @CRLF
    EndFunc
    
    
    Func _GetParam($_line, $_sFunc)
        $_line = StringRegExpReplace($_line, '\)\s*;.*$', ')')  ; evtl. Kommentare entfernen
        Local $sParam = StringTrimRight(StringMid($_line, StringInStr($_line, '(') +1, -1), 1)
        If StringStripWS($sParam, 8) = '' Then Return $_line
        ; Zuweisungen von Zeichenketten entfernen
        $sParam = StringRegExpReplace($sParam, '\s*=\s*"[^"]+"', '')
        $sParam = StringRegExpReplace($sParam, "\s*=\s*'[^']+'", '')
        ; sonstige Zuweisungen entfernen
        $sParam = StringRegExpReplace($sParam, '\s*=\s*[^,]+', '')
        Local $aParam = StringSplit($sParam, ',')
        Local $sRet = $_line & @CRLF & @TAB & 'ConsoleWrite("-- Func: [ ' & $_sFunc & ' ] Passed values:" & @CRLF)' & @CRLF
        Local $sValOut = ''
        For $i = 1 To $aParam[0]
            $aParam[$i] = StringStripWS($aParam[$i], 3)
            $sValOut &= @TAB & 'ConsoleWrite("@LINE" & @TAB & @TAB & @ScriptLineNumber -' & $i +1 & ' & ( ' & $aParam[$i] & ' )  " & _GetTypeAndValue(' & $aParam[$i] & ') & @CRLF)' & @CRLF
        Next
        Return $sRet & $sValOut
    EndFunc
    
    
    Func _GetVars($_line)
        Local $sSpace = '', $aSpace = StringRegExp($_line, '^\s+', 1)
        If Not @error Then $sSpace = $aSpace[0]
        Local $sVars = '', $aVars, $iMatch = 0, $iVar = 0
        Local $aPatt[] = [ _
            '\$[_\w]+\[[^\]]+\]\[[^]]+\]', _        ; $a[$i][$j] , $m["k"]["j"]
            '\(\$[_\w]+\)\[[^\]]+\]\[[^\]]+\]', _   ; ($abc)[$i][$j]
            '\(\$[_\w]+\)\[[^\]]+\]', _             ; ($abc)[$i]
            '\$[_\w]+\[[^\]]+\]', _                 ; $a[$i] , $m["k"]
            '\$[_\w]+\.\w+', _                      ; $abc.Bla
            '\$[_\w]+']                             ; $abc
        For $i = 0 To UBound($aPatt) -1
            If StringRegExp($_line, $aPatt[$i]) Then
                $aVars = StringRegExp($_line, $aPatt[$i], 3)
                For $j = 0 To UBound($aVars) -1
                    $iVar += 1
                    $sVars &= $sSpace & 'ConsoleWrite("@LINE" & @TAB & @TAB & @ScriptLineNumber -' & $iVar & _
                                        ' & " ( ' & StringRegExpReplace($aVars[$j], '\[\s*(\$[^\]]+)\]', '[" & \1 & "]') & _
                                        ' )" & @TAB & @TAB & _GetTypeAndValue(' & $aVars[$j] & ') & @CRLF)' & @CRLF
                    $_line = StringReplace($_line, $aVars[$j], '')  ; remove match from line
                Next
                $iMatch += 1
            EndIf
        Next
        If $iMatch = 0 Then Return ''
        Return @CRLF & $sVars
    EndFunc
    
    
    Func _GetEditorText()
        Local $sFunc = "function GetEditorText() read = editor:GetText() return read end"
        Return _ScI_DostringGet($sFunc)
    EndFunc
    
    
    Func _GetIncludes($_sText)
        Local $sReturn = ''
        Local $aMatch = StringRegExp($_sText, '[\r\n]?(?im)(#include\s+(<|''|")[^>''"]+(>|''|"))', 3)
        If Not @error Then
            For $i = 0 To UBound($aMatch) -1 Step 3
                $sReturn &= $aMatch[$i] & @CRLF
            Next
        EndIf
        Return $sReturn
    EndFunc
    
    
    Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0)
        Local $WM_COPYDATA = 74
        Local $Scite_hwnd = $gmSciTE[$ghActive]['Director']      ; Get SciTE DIrector Handle
        Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface")    ; Create GUI to receive SciTE info
        Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2))    ; Convert my Gui Handle to decimal
        $_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd               ; Add dec my gui handle to commandline to tell SciTE where to send the return info
        Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']')
        DllStructSetData($CmdStruct, 1, $_sCmd)
        Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
        DllStructSetData($COPYDATA, 1, 1)
        DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1)
        DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
    	$gSciTECmd = ''
        DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
                'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
                'Ptr', DllStructGetPtr($COPYDATA))
        GUIDelete($My_Hwnd)
    	If $Wait_For_Return_Info Then
    		Local $n = 0
    		While $gSciTECmd = '' Or $n < 10
    			Sleep(20)
    			$n += 1
    		WEnd
    	EndIf
    	Return $gSciTECmd
    EndFunc   ;==>SendSciTE_Command
    
    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    	Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    	Local $gSciTECmdLen = DllStructGetData($COPYDATA, 2)
        Local $CmdStruct = DllStructCreate('Char[' & $gSciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3))
    	$gSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $gSciTECmdLen)
    EndFunc   ;==>MY_WM_COPYDATA
    
    
    ;===============================================================================
    ; Function Name....: _ScI_GetProperty
    ; Description......: Gibt den Wert für eine Property zurück
    ; Parameter(s).....: Property
    ; Return Value(s)..: Wert der Property
    ; Docu.............: http://www.scintilla.org/SciTEDoc.html od. "SciTE-Hilfe" --> "SciTE Documentation"
    ; Author(s)........: BugFix
    ;===============================================================================
    Func _ScI_GetProperty($_sProperty)
    	SendSciTE_Command("askproperty:" & $_sProperty)
    	Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
    EndFunc
    
    
    ;===============================================================================
    ; Function Name....: _ScI_OutputToConsole
    ; Description......: Gibt einen Wert in die Konsole aus
    ; Parameter(s).....: auszugebender Wert, Zeilenumbruch mit "\n", Tab mit "\t"
    ; Return Value(s)..: keine
    ; Author(s)........: BugFix
    ;===============================================================================
    Func _ScI_OutputToConsole($_vValue)
    	SendSciTE_Command("output:" & $_vValue)
    EndFunc
    
    
    ;===============================================================================
    ; Function Name....: _ScI_Dostring
    ; Description......: Einen Luastring mit/ohne Parameter aufrufen OHNE ein Ergebnis zu erhalten
    ;                  : Parameter im Lua-String (max. 10) sind in der Form "_1", "_2", .., "_n" zu benennen.
    ; Parameter(s).....: $_sLua      - der Lua-String
    ;                  : $p1          - [optional] Parameter1 für den Lua-String ("_1")
    ;                  : ...            bis
    ;                  : $p10         - [optional] Parameter10 für den Lua-String ("_10")
    ; Return Value(s)..: keine
    ; Author(s)........: BugFix
    ;-------------------------------------------------------------------------------
    ; Bsp.:
    ; ohne Parameter:
    ;   _ScI_Dostring("print('Hallo Welt!')")
    ;
    ; mit Parameter:
    ;   _ScI_Dostring("editor:SetSelection(_1,_2)", 4, 14)
    ;===============================================================================
    Func _ScI_Dostring($_sLuastring, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
    	Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10], $index = 0
    	While $aParamCall[$index] <> Null
    		$_sLuastring = StringRegExpReplace($_sLuastring, '_\d+', $aParamCall[$index], 1)
    		$index += 1
    	WEnd
    	SendSciTE_Command("extender:dostring do " & $_sLuastring & " end")
    EndFunc
    
    
    ;===============================================================================
    ; Function Name....: _ScI_DostringGet
    ; Description......: Eine Luafunktion mit/ohne Parameter aufrufen UND ein Ergebnis erhalten
    ;                  : Maximal 10 Parameter können übergeben werden.
    ; Parameter(s).....: $_sLuaFunc   - String mit der Lua-Funktion
    ;                  : $p1          - [optional] Parameter1 für die Funktion
    ;                  : ...            bis
    ;                  : $p10         - [optional] Parameter10 für die Funktion
    ; Return Value(s)..: Rückgabewert der Lua-Funktion
    ; Author(s)........: BugFix
    ;-------------------------------------------------------------------------------
    ; Bsp.:
    ; ohne Parameter:
    ;   Local $sFunc = "function LineFromCursor() return editor:LineFromPosition(editor.CurrentPos)+1 end"
    ;   ConsoleWrite(_ScI_DostringGet($sFunc) & @CRLF)
    ;
    ; mit Parameter:
    ;   Local $sFunc = "function LineEnd(iLine) return editor.LineEndPosition[iLine] end"
    ;   ConsoleWrite(_ScI_DostringGet($sFunc, 130) & @CRLF)
    ;===============================================================================
    Func _ScI_DostringGet($_sLuaFunc, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
    	Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10]
    	; extract function name
    	Local $sFunc = (StringRegExp($_sLuaFunc, 'function (\w+)\(', 1))[0], $sParam = '()'
    	If $p1 <> Null Then
    		; extract parameters
    		$sParam = (StringRegExp($_sLuaFunc, 'function \w+\(([^)]+)\)', 1))[0]
    		Local $aParam = StringSplit($sParam, ',')
    		; rebuild sParam with given values
    		$sParam = ''
    		For $i = 1 To $aParam[0]
    			$sParam &= $aParamCall[$i-1] & ','
    		Next
    		$sParam = '(' & StringTrimRight($sParam,1) & ')'
    	EndIf
    	SendSciTE_Command("extender:dostring do " & $_sLuaFunc & " props['extender.result']=" & $sFunc & $sParam & " end")
    	SendSciTE_Command("askproperty:extender.result")
    	Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
    EndFunc
    Alles anzeigen

    Dateien

    RunSelectedCode.au3 16 kB – 170 Downloads SciTE_GetInfo.au3 9,66 kB – 168 Downloads
  • Label ausdrucken

    • BugFix
    • 21. April 2024 um 18:39
    Zitat von gert_nrw_71

    Word oder Excel empfinde ich für den Anwender zu aufwendig, selbst wenn man es mit VBA automatisiert.

    Aufwändig - inwiefern. Du kannst doch dort auch GUI anbieten und hast den Vorteil, dass alles direkt mit VBA verknüpft ist. Der Anwender bekommt doch davon nichts mit. :/

  • SciTE-Tutorial

    • BugFix
    • 21. April 2024 um 18:12
    Zitat von PSblnkd

    Was mache ich falsch, bzw. wo ist mein Denkfehler?

    Der Denkfehler: AutoIt Programme werden nicht Zeile für Zeile ausgeführt, sondern insgesamt übersetzt und dann ausgeführt.

    Dadurch kannst du nicht nach einzelnen Momenten die Werte von Variablen abfragen. Bisherige Lösungen basieren, soweit ich bisher gesehen habe deshalb darauf, die Skripte in einem separaten Programm Zeile für Zeile auszuführen.

    Also einzelne Werte auszugeben ist ja kein Problem, aber man kann keine Haltepunkte setzen.

  • SciTE-Tutorial

    • BugFix
    • 15. April 2024 um 17:54

    Bin diese Woche nicht zu Hause. Schau mir das nächste Woche an.

  • Frage zu DLLCall

    • BugFix
    • 5. April 2024 um 20:29
    Zitat von BigRox

    Warum kann ich den SPI_SETMOUSSONAR nicht verwenden, sondern muss die Konstante von AutoIt (oder 0x101D) verwenden?

    Weil du eine Zeichenkette übergeben hast, erforderlich ist aber UINT.

    Zitat von BigRox

    Und warum muss ich bei einem PVOID-Datentyp UINT-angeben?

    Schau Mal in der Hilfe, da findest du eine Auflistung, welche Datentypen als Entsprechung in AutoIt zur Verfügung stehen.

  • Frage zu DLLCall

    • BugFix
    • 4. April 2024 um 20:15
    Zitat von BigRox

    Ich versuch z.B. bei diesem DLLCall rauszubekommen, wo ich die Parameter dazu her bekomme.

    Eine Unmenge an API Funktionen sind in den _WinAPI_ UDF in AutoIt gewrapped. Schau einfach diese Aufrufe in den Include Dateien an, da kannst du viel verstehen und lernen.

  • Excel 2003 und Wenn-Dann-Sonst (gelöst)

    • BugFix
    • 28. März 2024 um 19:00

    Excel 2003 erlaubt nur ein 7-stufige Verschachtelung. Wenn du es trotzdem in eine Formel quetschen möchtest, könntest du beide Wenn-Blöcke mit Oder verknüpfen. Sollte klappen.

    So etwa: =Oder( (Wenn1;Dann1;(Wenn2;... bis Wenn6) ; (Wenn7;Dann7:(Wenn8;... Wenn12) )

    Aber ich würde mit Verweis arbeiten, wenn deine Tabellengestaltung das ermöglicht. Ich schreib mir oft eine Verweistabelle auf ein ausgeblendetes Tabellenblatt um z. B. mit Eingabe der Kalenderwochennummer automatisch Von-Datum / Bis-Datum einzusetzen.

  • FuzzyString-UDF - unscharfe Vergleiche von Strings und Suche in Arrays

    • BugFix
    • 28. März 2024 um 09:02
    Zitat von AspirinJunkie

    "Sind wir ehrlich - so ne Pampelarbeit ist eigentlich eher was für Frauen oder Kriminelle"

    Ein Mann voller Lebensweisheit ... :rofl:

  • FuzzyString-UDF - unscharfe Vergleiche von Strings und Suche in Arrays

    • BugFix
    • 27. März 2024 um 22:09
    Zitat von AspirinJunkie

    war allerdings zu faul da mir schon das ganze dokumentieren tierisch auf den Sack ging.

    :rofl:

    Ernst gemeintes Angebot: Wenn du mal einen Ghost-Dokumentator brauchst, melde dich. Ich werde wahrscheinlich nicht zwingend alle Finessen erkennen und beschreiben können. Aber für das Grundgerüst sollte es reichen. Feinheiten und Korrekturen blieben dann noch für dich.

    Nicht dass ich wirklich scharf aufs Dokumentieren bin, aber besser kann man neue Dinge kaum lernen, als sie eigenständig beschreiben zu müssen.

  • Assembler: Farben zählen

    • BugFix
    • 27. März 2024 um 15:14
    Zitat von UEZ

    Echt jetzt? 8|

    Ja, ja - er ist der letzte Zeitzeuge der Schlacht von Waterloo. 😝

  • Schlechte Icon Qualität

    • BugFix
    • 13. März 2024 um 14:40

    Du solltest dein Icon in den vorgegeben Größen (16, 32, 48. etc.) speichern. Die Auswahl erfolgt dann anhand deiner übergebenen Größe - die natürlich auf ein enthaltenes Icon zutreffen muß. Ist die von dir geforderte Größe nicht vorhanden, kommt nur Murks raus. Entweder nur ein Teilbereich vom nächst größeren Icon oder ein grauenhaft skaliertes kleineres.

    Icon solltest du nur "as is" anzeigen. Wenn du skalieren willst, nimm Picture oder löse es gleich per GDIplus.

  • Schlechte Icon Qualität

    • BugFix
    • 13. März 2024 um 11:48
    Zitat von OhnePlan

    Leider ist nach dem Kompilieren die Qualität des Icons schlecht.

    Womit kompilierst du denn das Icon? Ich nutze für Icon-Erstellung paint.NET. Habe da noch keine Probleme gehabt. Brauchst dann noch ein Icon-PlugIn (hier zu finden).

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™