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

Beiträge von Kanashius

  • Tv Steuerung

    • Kanashius
    • 23. Februar 2020 um 03:22

    Naja, in dem Script hast du oben ja die Arrays für die TVs und das Contextmenü. Das kannst du beliebig erweitern:

    C
    Global $arTvList=[ _
            ["192.168.0.10",$iDefaultPort], _
            ["192.168.0.11",$iDefaultPort], _
            ["192.168.0.12",$iDefaultPort] _
        ] ;All client IP´s
    
    Global $arContextMenuButtons=[ _
            ["Test 1","Telnet command 1"], _
            ["Test 2","Telnet command 2"], _
            ["Test 3","Telnet command 3"], _
            ["Test 4","Telnet command 4"], _
            ["Test 5","Telnet command 5"], _
            ["",0], _
            [$sRestart,"Telnet restart"] _
        ]
    Alles anzeigen

    würde mit dem was du dort haben möchtest zu:

    C
    Global $arTvList=[ _
            ["192.168.0.10",$iDefaultPort,"DisplayName1"], _
            ["192.168.0.11",$iDefaultPort,"DisplayName2"], _
            ["192.168.0.12",$iDefaultPort,"DisplayName3"] _
        ] ;All client IP´s

    Auf dieselbe weise kannst du das ganze auch das Array für die ContextMenuButtons erweitern und z.B. die Info speichern, ob der Eintrag für VLC oder TelNet ist,...

    Du kannst auch das Array für die ContextMenuButtons auf ein 3D array umstellen und dann in dem weiteren verfügbaren eintrag die information speichern, ob es ein vlc, telnet,... profil ist und beim tv das ebenfalls eintragen, auslesen und das passende profil nutzen um das contextmenü zu erzeugen.

    Arrays sind im Prinzip Listen (1D), Tabellen (2D) oder Tabellen mit Listeneinträgen (3D):

    C
    #include <array.au3>
    
    
    local $ar1D=["Eintrag 1","Eintrag 2","Eintrag 3"]
    _arraydisplay($ar1D)
    
    
    local $ar2D=[ _
            ["Row 1 Col 1","Row 1 Col 2","Row 1 Col 3"], _
            ["Row 2 Col 1","Row 2 Col 2","Row 2 Col 3"], _
            ["Row 3 Col 1","Row 3 Col 2","Row 3 Col 3"] _
    _arraydisplay($ar2D)
    
    
    local $ar3D=[ _
        [ _
            ["Row 1 Col 1 Depth 1","Row 1 Col 1 Depth 2","Row 1 Col 1 Depth 3"], _
            ["Row 1 Col 2 Depth 1","Row 1 Col 2 Depth 2","Row 1 Col 2 Depth 3"], _
            ["Row 1 Col 3 Depth 1","Row 1 Col 3 Depth 2","Row 1 Col 3 Depth 3"] _
        ], _
        [ _
            ["Row 2 Col 1 Depth 1","Row 2 Col 1 Depth 2","Row 2 Col 1 Depth 3"], _
            ["Row 2 Col 2 Depth 1","Row 2 Col 2 Depth 2","Row 2 Col 2 Depth 3"], _
            ["Row 2 Col 3 Depth 1","Row 2 Col 3 Depth 2","Row 2 Col 3 Depth 3"] _
        ], _
        [ _
            ["Row 3 Col 1 Depth 1","Row 3 Col 1 Depth 2","Row 3 Col 1 Depth 3"], _
            ["Row 3 Col 2 Depth 1","Row 3 Col 2 Depth 2","Row 3 Col 2 Depth 3"], _
            ["Row 3 Col 3 Depth 1","Row 3 Col 3 Depth 2","Row 3 Col 3 Depth 3"] _
        ] _
    ]
    
    For $i=0 to UBound($ar3D)-1 step 1
        For $j=0 to UBound($ar3D,2)-1 step 1
            For $k=0 to UBound($ar3D,3)-1 step 1
                ConsoleWrite($i&":"&$j&":"&$k&@TAB&"  >>  "&$ar3D[$i][$j][$k]&@crlf)
            Next
        Next
    Next
    Alles anzeigen

    Normal würde ich in anderen Programmiersprachen Objekte nutzen um diese Daten zu speichern, AutoIt bietet dies möglichkeit leider nicht (nativ ohne größere Umstände).

    Deshalb würd ich dein Projekt vermutlich in z.B. Java umsetzen. Dort kann man eine gute Struktur mit Objekten und Vererbung aufbauen, sodass es übersichtlich ist, und das Fenster wäre auch etwas einfacher zu individualisieren ;)

    PS: Die ausgelesenen Infos (die du im anderen Thread erwähnst) kannst du nehmen um das Array zu erstellen.

    MfG Kanashius

  • Tv Steuerung

    • Kanashius
    • 20. Februar 2020 um 16:42

    Hi Speedy86 .

    Das was du suchst sind Arrays. Ich hab dein Script mal umgeschrieben, sodass es arrays nutzt. Du musst theoretisch nurnoch die globalen variablen anpassen und es sollte tun, was du möchtest und du kannst beliebig viele TVs und ContextMenuItems hinzufügen. Außerdem kannst du während das Tool läuft neue Tvs hinzufügen.

    Alle Positionen der Controls werden dynamisch berechnet, sodass es erweiterbar ist und die größe geändert werden kann.

    C
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    
    #Region global variables
    ;TV information
    Global $iDefaultPort=8080
    Global $arTvList=[["192.168.0.10",$iDefaultPort],["192.168.0.11",$iDefaultPort],["192.168.0.12",$iDefaultPort]] ;All client IP´s
    
    ;Gui control variables
    Global $iWidth=1000,$iHeight=750
    ; [x position,y position]
    Global $arPointTvListStart=[10,10]
    Global $iTvListItemWidth=60, $iTvListButtonHeight=20, $iTvListButtonSpace=10
    ; [FB_Button,Ch_Button,Ch_Context,Item 1,Item 2,Item 3,Item 4,Item 5, Item 6]
    Global $sRestart="Restart"
    Global $arContextMenuButtons=[ _
            ["Test 1","Telnet command 1"], _
            ["Test 2","Telnet command 2"], _
            ["Test 3","Telnet command 3"], _
            ["Test 4","Telnet command 4"], _
            ["Test 5","Telnet command 5"], _
            ["",0], _
            [$sRestart,"Telnet restart"] _
        ]
    Global $iStartOfContextMenuButtons=3
    Global $arTvListControls[0][0][2]
    #EndRegion global variables
    
    $hGUI = GUICreate("Test",$iWidth,$iHeight)
    
    $iButtonAddTV=GUICtrlCreateButton("Add TV",100,100)
    $iButtonRemoveTV=GUICtrlCreateButton("Remove TV",100,130)
    
    _refreshTvButtons()
    
    GUISetState(@SW_SHOW)
    
    While 1 ;Sleep(10) not needed, because guigetmsg sleeps
        $nMsg = GUIGetMsg()
        If $nMsg<>0 Then
            If $nMsg=$GUI_EVENT_CLOSE Then Exit
            Switch $nMsg
                case $iButtonAddTV
                    _addTV("192.168.2.111")
                case $iButtonRemoveTV
                    _removeTV("192.168.2.111")
            EndSwitch
            For $i=0 to UBound($arTvListControls)-1 step 1
                For $j=0 to UBound($arTvListControls,2)-1 step 1
                    If $arTvListControls[$i][$j][0]=$nMsg Then
                        Switch $j
                            case 0 ; FB Button not used
                            case 1 ; CH Button
                                $arTvListControls[$i][$j][1]($hGUI,$nMsg,$arTvListControls[$i][$j+1][0])
                            case Else ;all contextmenu items
                                telnet_send($arTvList[$i][0],$arTvList[$i][1],$arTvListControls[$i][$j][1])
                                GUICtrlSetData($arTvListControls[$i][1][0],$arContextMenuButtons[$j-$iStartOfContextMenuButtons][0])
                                If $arContextMenuButtons[$j-$iStartOfContextMenuButtons][0]=$sRestart Then
                                    GUICtrlSetData($arTvListControls[$i][1][0],"")
                                EndIf
                        EndSwitch
                        ExitLoop 2
                    EndIf
                Next
            Next
        EndIf
    WEnd
    
    #Region Func
    
    Func _addTV($sIp,$iPort=8080)
        _ArrayAdd($arTvList,$sIp&"|"&$iPort)
        _refreshTvButtons()
    EndFunc
    
    Func _removeTV($sIp,$iPort=8080)
        For $i=UBound($arTvList)-1 to 0 step -1
            If $arTvList[$i][0]=$sIp and $arTvList[$i][1]=$iPort Then
                _ArrayDelete($arTvList,$i)
            EndIf
        Next
        _refreshTvButtons()
    EndFunc
    
    Func _refreshTvButtons()
        ;delete all controls
        For $i=0 to UBound($arTvListControls)-1 step 1
            For $j=0 to UBound($arTvListControls,2)-1 step 1
                GUICtrlDelete($arTvListControls[$i][$j][0])
            Next
        Next
        ;resize control array
        ReDim $arTvListControls[UBound($arTvList)][$iStartOfContextMenuButtons+UBound($arContextMenuButtons)][2]
        ;create new controls
        For $i=0 to UBound($arTvList)-1 step 1
            $arTvListControls[$i][0][0]=GUICtrlCreateButton("TV "&($i+1),$arPointTvListStart[0]+($i*($iTvListItemWidth+$iTvListButtonSpace)),$arPointTvListStart[1],$iTvListItemWidth,$iTvListButtonHeight)
            GUICtrlSetFont($arTvListControls[$i][0][0], 8.5, 700, 0, "")
            $arTvListControls[$i][1][0]=GUICtrlCreateButton("",$arPointTvListStart[0]+($i*($iTvListItemWidth+$iTvListButtonSpace)),$arPointTvListStart[1]+$iTvListButtonHeight,$iTvListItemWidth,$iTvListButtonHeight)
            $arTvListControls[$i][1][1]=ShowMenu
            GUICtrlSetFont($arTvListControls[$i][1][0], 8.5, 500, 0, "")
            $arTvListControls[$i][2][0]=GUICtrlCreateContextMenu($arTvListControls[$i][1][0])
            For $j=0 to UBound($arContextMenuButtons)-1 step 1
                $arTvListControls[$i][$iStartOfContextMenuButtons+$j][0]=GUICtrlCreateMenuItem($arContextMenuButtons[$j][0],$arTvListControls[$i][2][0])
                $arTvListControls[$i][$iStartOfContextMenuButtons+$j][1]=$arContextMenuButtons[$j][1]
            Next
        Next
    EndFunc
    
    ;Telnet_send
    Func telnet_send($sIp,$iPort,$sCommand)
        TCPStartup ()
        $Conection=TCPConnect($sIp,$iPort)
        If @error Then
            MsgBox (0,"Error","Could not establish connection to: "&$sIp&":"&$iPort)
            return;
        EndIf
        TCPSend($Conection,$sCommand&Chr(10))
        If @error Then
            MsgBox(0,"Error","Could not send the command: "&$sCommand&" to "&$sIp&":"&$iPort)
        EndIf
    EndFunc
    ; End Telnet_send
    
    Func ShowMenu($hWnd, $CtrlID, $nContextID)
        Local $arPos, $x, $y
        Local $hMenu = GUICtrlGetHandle($nContextID)
        $arPos = ControlGetPos($hWnd, "", $CtrlID)
        $x = $arPos[0]
        $y = $arPos[1]+$arPos[3]
        ClientToScreen($hWnd, $x, $y)
        TrackPopupMenu($hWnd, $hMenu, $x, $y)
    EndFunc   ;ShowMenu
    
    ; Convert the client GUI coordinates to screen desktop coordinates
    Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
        Local $stPoint = DllStructCreate("int;int")
        DllStructSetData($stPoint, 1, $x)
        DllStructSetData($stPoint, 2, $y)
        DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
        $x = DllStructGetData($stPoint, 1)
        $y = DllStructGetData($stPoint, 2)
        ; release Struct not really needed as it is a local
        $stPoint = 0
    EndFunc   ;==>ClientToScreen
    
    ; Show at the given coordinates (x, y) the popup menu (hMenu) which belongs to a given GUI window (hWnd)
    Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
        DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
    EndFunc   ;==>TrackPopupMenu
    
    #EndRegion Func
    Alles anzeigen

    MfG Kanashius :)

  • GUI mit FileRead aktualisieren und Opt("GUIOnEventMode", 1)

    • Kanashius
    • 8. Januar 2020 um 21:30

    Du solltest unbedingt Arrays verwenden!

    Ich hab mal deinen Code umgeschrieben:

    AutoIt
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <FontConstants.au3>
    #include <GuiListView.au3>
    #include <Date.au3>
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    
    Global $arTabButtons[0]
    
    Global $iWidth=800,$iHeight=600
    Global $iFontSizeTabButtons=20,$iTabButtonWidth=100,$iTabButtonHeight=50,$iSpace=5
    Global $arFiles=["1.csv","2.csv","3.csv","4.csv","5.csv"],$sLastFile,$sLastFileAccessRefresh
    
    $hGuiArtikelDispo=GUICreate("GUI", $iWidth, $iHeight,-1,-1,$WS_POPUP)
    GUISetBkColor(0xFFFFFF)
    $hListview=GUICtrlCreateListView("",$iSpace,$iSpace*2+$iTabButtonHeight,$iWidth-$iSpace*2,$iHeight-$iSpace*3-$iTabButtonHeight)
    $hButtonClose=GUICtrlCreateButton("X",$iWidth-$iSpace-30,$iSpace,30,$iTabButtonHeight)
    GUICtrlSetOnEvent(-1,"_close")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_close")
    GUISetState(@SW_SHOW,$hGuiArtikelDispo)
    
    ;AdlibRegister("_refreshFile",1000*60*10)
    AdlibRegister("_refreshFile",1000)
    _initGui($arFiles)
    
    While Sleep(10)
    WEnd
    
    Func _close()
        exit
    EndFunc
    
    Func _refreshFile()
        If $sLastFile<>"" Then
            local $sLastFileAccess=StringRegExpReplace(FileGetTime($sLastFile,0,1),"(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})","$1/$2/$3 $4:$5:$6")
            If $sLastFileAccessRefresh<>$sLastFileAccess Then
                $sLastFileAccessRefresh=$sLastFileAccess
                If _DateDiff('s',$sLastFileAccess,StringFormat("%04i",@YEAR)&"/"&StringFormat("%02i",@MON)&"/"&StringFormat("%02i",@MDAY)&" "&StringFormat("%02i",@HOUR)&":"&StringFormat("%02i",@MIN)&":"&StringFormat("%02i",@SEC))>1 Then
                    _loadFileToGui($sLastFile)
                EndIf
            EndIf
        EndIf
    EndFunc
    
    Func _initGui($arFiles)
        ; Delete all controls of the old Gui
        If IsArray($arTabButtons) Then
            For $i=0 to UBound($arTabButtons)-1 step 1
                GUICtrlDelete($arTabButtons[$i])
            Next
        EndIf
        _GUICtrlListView_DeleteAllItems($hListView)
        ReDim $arTabButtons[UBound($arFiles)]
        For $i=0 to UBound($arFiles)-1 step 1
            $arTabButtons[$i]=GUICtrlCreateButton(StringSplit($arFiles[$i],".",1+2)[0],$iSpace+$i*$iTabButtonWidth,$iSpace,$iTabButtonWidth-$iSpace*2,$iTabButtonHeight)
            GUICtrlSetColor(-1,0xFFFFFF)
            GUICtrlSetBkColor(-1,0x56085e)
            GUICtrlSetFont(-1,$iFontSizeTabButtons,$FW_BOLD)
            GUICtrlSetOnEvent(-1,"_tabButtonPressed")
        Next
    EndFunc
    
    Func _tabButtonPressed()
        For $i=0 to UBound($arTabButtons)-1 step 1
            If @GUI_CtrlId=$arTabButtons[$i] Then
                _loadFileToGui($arFiles[$i])
            EndIf
        Next
    EndFunc
    
    Func _loadFileToGui($sFile)
        $sLastFile=$sFile
        _GUICtrlListView_DeleteAllItems($hListView)
        While _GUICtrlListView_GetColumnCount($hListview)>0
            _GUICtrlListView_DeleteColumn($hListview,0)
        WEnd
        local $arCsvData=_loadFileData($sFile)
        For $i=0 to UBound($arCsvData,2)-1 step 1
            _GUICtrlListView_AddColumn($hListview,$i+1,($iWidth-2*$iSpace-4)/UBound($arCsvData,2))
        Next
        _GUICtrlListView_AddArray($hListview,$arCsvData)
    EndFunc
    
    Func _loadFileData($sFile)
        local $sFileData=FileRead($sFile)
        local $arFileRows=StringSplit($sFileData,@CRLF,1+2)
        local $arDetail[UBound($arFileRows)][0]
        For $i=0 to UBound($arFileRows)-1 step 1
            $arCols=StringSplit($arFileRows[$i],";",1+2)
            If UBound($arCols)>UBound($arDetail,2) Then
                ReDim $arDetail[UBound($arDetail)][UBound($arCols)]
            EndIf
            For $j=0 to UBound($arCols)-1 step 1
                $arDetail[$i][$j]=$arCols[$j]
            Next
        Next
        return $arDetail
    EndFunc
    Alles anzeigen

    Ich hoffe, du verstehst, was dort gemacht wird und kannst das dann in dem Stil weiterentwickeln :).

    Das erspart dir sehr viel Copy&Paste ;)

    MfG Kanashius.

  • Automatische Scrollbar für ein GUI-Fenster

    • Kanashius
    • 4. Januar 2020 um 14:43

    Leider ist das verwenden von Scrollbars nicht ganz so leicht, wie man das gerne hätte...

    Ich hab hier mal ein Beispiel. Besonders anschauen solltest du dir die Funktionen _setVertScroll und _setHoriScroll. Dort wird die Scrollbar gesetzt. Dabei wird angegeben, wie viele Elemente in dem Fenster sind und es wird angegeben, wie viele Elemente auf eine "Seite" passen.

    AutoIt
    #include <GuiScrollBars.au3>
    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <GuiComboBoxEx.au3>
    
    Global Const $SIF_DISABLENOSCROLL = 0x8
    Global $iWidth = 800, $iHeight = 600, $iScrollControlHeight = 25, $iEntryColWidth = 150, $iEntryOperWidth = 40,$iScrollControllHeightSpace=5,$iScrollControllWidthSpace=5
    Global $iLastItemWidth,$iLastItemHeigt,$iLastHorizontalScrolled,$iLastVerticalScrolled
    Global $arCols = [["Name", "col"], ["Name2", "col2"]],$arOper=["+","-","*","/"],$arScrollControls[0],$sNoSelection="- -"
    
    $hMainGui = GUICreate("Export", $iWidth, $iHeight,-1,-1,BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU,$WS_MAXIMIZEBOX,$WS_SIZEBOX))
    $hAddRow = GUICtrlCreateButton("Add Col", 5, $iHeight - 30, 60, 25)
    $hReady = GUICtrlCreateButton("Ready", $iWidth-65, $iHeight - 30, 60, 25)
    
    
    $hScrollGui=GUICreate("",$iWidth-15,$iHeight-40,5,5,$WS_CHILD,$WS_EX_CLIENTEDGE,$hMainGui)
    GUISetState(@SW_SHOW,$hScrollGui)
    
    GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")
    
    GUISetState(@SW_SHOW,$hMainGui)
    _GUIScrollBars_Init($hScrollGui)
    _GUIScrollBars_ShowScrollBar($hScrollGui,$SB_BOTH,true)
    
    While 1
        $msg = GUIGetMsg(1)
        if $msg[1]=$hMainGui then
            Switch $msg[0]
                case -3
                    exit
                case $hAddRow
                    _addScrollControl()
                case $hReady
                    _getResult()
            EndSwitch
        else
            for $i=0 to UBound($arScrollControls)-1 step 1
                local $tmp=$arScrollControls[$i]
                for $j=0 to UBound($tmp)-1 step 1
                    if $msg[0]=$tmp[$j] then
                        if $j=0 then
                            ;exit
                            _removeControl($i)
                        elseif $j=1 then
                            ;top
                            _switchControl($i,$i-1)
                        elseif $j=2 then
                            ;down
                            _switchControl($i,$i+1)
                        ;3 nicht notwendig (spaltenname)
                        elseif $j>3 then
                            if Mod($j,2)=0 then ;combo
                                if GUICtrlRead($tmp[$j])=$sNoSelection then
                                    _removeAllControlsBehind($i,$j)
                                else
                                    if NOT $j<UBound($tmp) then ;ist letztes Item
                                        _addOper($i)
                                    endif
                                endif
                            else ;oper
                                if GUICtrlRead($tmp[$j])=$sNoSelection then
                                    _removeAllControlsBehind($i,$j)
                                else
                                    if NOT $j<UBound($tmp) then ;ist letztes Item
                                        _addCombo($i)
                                    endif
                                endif
                            endif
                        endif
                        ExitLoop 2
                    endif
                next
            next
        endif
    WEnd
    
    Func _getResult()
        local $sResult=""
        for $i=0 to UBound($arScrollControls)-1 step 1
            local $tmp=$arScrollControls[$i]
            local $string="Spaltenname: "&GUICtrlRead($tmp[3])&" Aufbau: "
            for $j=4 to UBound($tmp)-1 step 1
                if Mod($j,2)=0 then ;combo
                    $index=_GUICtrlComboBoxEx_GetCurSel(GUICtrlGetHandle($tmp[$j]))
                    if $index>0 then
                        $string&=$arCols[$index-1][1]&" "
                    endif
                else ;operant
                    if GUICtrlRead($tmp[$j])<>$sNoSelection then
                        $string&=GUICtrlRead($tmp[$j])&" "
                    endif
                endif
            next
            $sResult&=$string&@crlf
        next
        MsgBox(48,"",$sResult)
    EndFunc
    
    Func _addCombo($index)
        local $iTopSpace=5+$iScrollControllHeightSpace+($index*($iScrollControlHeight+$iScrollControllHeightSpace))
        local $tmp=$arScrollControls[$index]
        ReDim $tmp[UBound($tmp)+1]
        local $elements=UBound($tmp)-1
        local $spaces=$iScrollControllWidthSpace*($elements-3)
        local $combos=$iEntryColWidth*Int(($elements-4)/2+0.5)
        local $opers=$iEntryOperWidth*(Int(($elements-4)/2))
        $tmp[UBound($tmp)-1]=GUICtrlCreateCombo($sNoSelection,80+$iEntryColWidth+$spaces+$combos+$opers+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,$iEntryColWidth,$iScrollControlHeight)
        GUICtrlSetFont(-1,$iScrollControlHeight-15)
        GUICtrlSetData(-1,_getColString())
        $arScrollControls[$index]=$tmp
        _setHoriScroll()
    EndFunc
    
    Func _addOper($index)
        local $iTopSpace=5+$iScrollControllHeightSpace+($index*($iScrollControlHeight+$iScrollControllHeightSpace))
        local $tmp=$arScrollControls[$index]
        ReDim $tmp[UBound($tmp)+1]
        local $elements=UBound($tmp)-1
        local $spaces=$iScrollControllWidthSpace*($elements-3)
        local $combos=$iEntryColWidth*Int(($elements-4)/2+0.5)
        local $opers=$iEntryOperWidth*(Int(($elements-4)/2))
        $tmp[UBound($tmp)-1]=GUICtrlCreateCombo($sNoSelection,80+$iEntryColWidth+$spaces+$combos+$opers+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,$iEntryOperWidth,$iScrollControlHeight)
        GUICtrlSetFont(-1,$iScrollControlHeight-15)
        GUICtrlSetData(-1,_getOperString())
        $arScrollControls[$index]=$tmp
        _setHoriScroll()
    EndFunc
    
    Func _removeAllControlsBehind($index,$j)
        local $tmp=$arScrollControls[$index]
        for $i=$j+1 to UBound($tmp)-1 step 1
            GUICtrlDelete($tmp[$i])
        next
        ReDim $tmp[$j+1]
        $arScrollControls[$index]=$tmp
    EndFunc
    
    Func _addScrollControl()
        GUISwitch($hScrollGui)
        if UBound($arScrollControls)>0 then
            local $arControlsLast=$arScrollControls[UBound($arScrollControls)-1]
            GUICtrlSetState($arControlsLast[2],$GUI_ENABLE)
        endif
        ReDim $arScrollControls[UBound($arScrollControls)+1]
        local $arControls[5],$iActEntry=UBound($arScrollControls)-1,$iTopSpace=5+$iScrollControllHeightSpace+($iActEntry*($iScrollControlHeight+$iScrollControllHeightSpace))
        $arControls[0]=GUICtrlCreateButton("X",5+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,20,$iScrollControlHeight)
        $arControls[1]=GUICtrlCreateButton(ChrW(8679),30+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,20,$iScrollControlHeight)
        if UBound($arScrollControls)=1 then GUICtrlSetState(-1,$GUI_DISABLE)
        GUICtrlSetFont(-1,20)
        $arControls[2]=GUICtrlCreateButton(ChrW(8681),55+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,20,$iScrollControlHeight)
        GUICtrlSetFont(-1,20)
        GUICtrlSetState(-1,$GUI_DISABLE)
        $arControls[3]=GUICtrlCreateInput("",80+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,$iEntryColWidth,$iScrollControlHeight)
        GUICtrlSendMsg(-1, 0x1501, 0, "Spaltenname")
        GUICtrlSetFont(-1,$iScrollControlHeight-15)
        $arControls[4]=GUICtrlCreateCombo($sNoSelection,80+$iEntryColWidth+$iScrollControllWidthSpace+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled,$iEntryColWidth,$iScrollControlHeight)
        GUICtrlSetData(-1,_getColString())
        GUICtrlSetFont(-1,$iScrollControlHeight-15)
        $arScrollControls[$iActEntry]=$arControls
        _setVertScroll()
        _setHoriScroll()
    EndFunc
    
    Func _switchControl($i,$j)
        local $tmpI=$arScrollControls[$i]
        local $tmpJ=$arScrollControls[$j]
        $arScrollControls[$i]=$tmpJ
        $arScrollControls[$j]=$tmpI
        $iTopSpaceJ=5+$iScrollControllHeightSpace+($i*($iScrollControlHeight+$iScrollControllHeightSpace))
        for $k=0 to UBound($tmpJ)-1 step 1
            ControlMove($hScrollGui,"",$tmpJ[$k],ControlGetPos($hScrollGui,"",$tmpJ[$k])[0]-7+$iLastHorizontalScrolled,$iTopSpaceJ+$iLastVerticalScrolled)
        next
        $iTopSpaceI=5+$iScrollControllHeightSpace+($j*($iScrollControlHeight+$iScrollControllHeightSpace))
        for $k=0 to UBound($tmpI)-1 step 1
            ControlMove($hScrollGui,"",$tmpI[$k],ControlGetPos($hScrollGui,"",$tmpI[$k])[0]-7+$iLastHorizontalScrolled,$iTopSpaceI+$iLastVerticalScrolled)
        next
        if $i=0 then
            GUICtrlSetState($tmpI[1],$GUI_ENABLE)
            GUICtrlSetState($tmpJ[1],$GUI_DISABLE)
        endif
        if $j=0 then
            GUICtrlSetState($tmpJ[1],$GUI_ENABLE)
            GUICtrlSetState($tmpI[1],$GUI_DISABLE)
        endif
        if $i=UBound($arScrollControls)-1 then
            GUICtrlSetState($tmpI[2],$GUI_ENABLE)
            GUICtrlSetState($tmpJ[2],$GUI_DISABLE)
        endif
        if $j=UBound($arScrollControls)-1 then
            GUICtrlSetState($tmpJ[2],$GUI_ENABLE)
            GUICtrlSetState($tmpI[2],$GUI_DISABLE)
        endif
        _WinAPI_RedrawWindow($hScrollGui)
    EndFunc
    
    Func _removeControl($i)
        local $tmp=$arScrollControls[$i]
        for $j=0 to UBound($tmp)-1 step 1
            GUICtrlDelete($tmp[$j])
        next
        for $j=$i+1 to UBound($arScrollControls)-1 step 1
            $arScrollControls[$j-1]=$arScrollControls[$j]
            local $tmp=$arScrollControls[$j-1]
            $iTopSpace=5+$iScrollControllHeightSpace+(($j-1)*($iScrollControlHeight+$iScrollControllHeightSpace))
            for $k=0 to UBound($tmp)-1 step 1
                ControlMove($hScrollGui,"",$tmp[$k],ControlGetPos($hScrollGui,"",$tmp[$k])[0]-7+$iLastHorizontalScrolled,$iTopSpace+$iLastVerticalScrolled)
            next
        next
        ReDim $arScrollControls[UBound($arScrollControls)-1]
        _setVertScroll()
        _WinAPI_RedrawWindow($hScrollGui)
    EndFunc
    
    Func _setVertScroll()
        local $elements=UBound($arScrollControls)
        local $clientHeight=WinGetPos($hScrollGui)[3]
        local $itemHeight=($iScrollControlHeight+$iScrollControllHeightSpace)
        $iLastItemHeigt=$itemHeight
        Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
        DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE,$SIF_DISABLENOSCROLL))
        DllStructSetData($tSCROLLINFO, "nMin", 0)
        DllStructSetData($tSCROLLINFO, "nMax", $elements)
        DllStructSetData($tSCROLLINFO, "nPage", int($clientHeight/$itemHeight))
        _GUIScrollBars_SetScrollInfo(HWnd($hScrollGui), $SB_VERT, $tSCROLLINFO)
    EndFunc
    
    Func _setHoriScroll()
        local $elements=0
        for $i=0 to UBound($arScrollControls)-1 step 1
            if $elements<UBound($arScrollControls[$i]) then
                $elements=UBound($arScrollControls[$i])
            endif
        next
        local $clientWidth=WinGetPos($hScrollGui)[2]
        local $spaces=$iScrollControllWidthSpace*($elements-3)
        local $combos=$iEntryColWidth*Int(($elements-4)/2+0.5)
        local $opers=$iEntryOperWidth*(Int(($elements-4)/2))
        local $itemWidth=(80+$iEntryColWidth+$spaces+$combos+$opers)/$elements
        $iLastItemWidth=$itemWidth
        Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
        DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE,$SIF_DISABLENOSCROLL))
        DllStructSetData($tSCROLLINFO, "nMin", 0)
        DllStructSetData($tSCROLLINFO, "nMax", $elements)
        DllStructSetData($tSCROLLINFO, "nPage", int($clientWidth/$itemWidth))
        _GUIScrollBars_SetScrollInfo(HWnd($hScrollGui), $SB_HORZ, $tSCROLLINFO)
    EndFunc
    
    Func _getColString()
        local $string=""
        for $i=0 to UBound($arCols)-1 step 1
            $string&=$arCols[$i][0]
            if $i<>UBound($arCols)-1 then
                $string&="|"
            endif
        next
        return $string
    EndFunc
    
    Func _getOperString()
        local $string=""
        for $i=0 to UBound($arOper)-1 step 1
            $string&=$arOper[$i]
            if $i<>UBound($arOper)-1 then
                $string&="|"
            endif
        next
        return $string
    EndFunc
    
    Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
        _setVertScroll()
        _setHoriScroll()
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_SIZE
    
    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
        Local $iScrollCode = BitAND($wParam, 0x0000FFFF)
        local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
        $iMin = DllStructGetData($tSCROLLINFO, "nMin")
        $iMax = DllStructGetData($tSCROLLINFO, "nMax")
        $iPage = DllStructGetData($tSCROLLINFO, "nPage")
        $iPosX = DllStructGetData($tSCROLLINFO, "nPos")
        $iPos = $iPosX
        $iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
        #forceref $iMin, $iMax
        Switch $iScrollCode
            Case $SB_LINELEFT ; user clicked left arrow
                DllStructSetData($tSCROLLINFO, "nPos", $iPos - 1)
            Case $SB_LINERIGHT ; user clicked right arrow
                DllStructSetData($tSCROLLINFO, "nPos", $iPos + 1)
            Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iPos - $iPage)
            Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iPos + $iPage)
            Case $SB_THUMBTRACK ; user dragged the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
        EndSwitch
        DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
        _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
        _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
        $iPos = DllStructGetData($tSCROLLINFO, "nPos")
        If ($iPos <> $iPosX) Then
            _GUIScrollBars_ScrollWindow($hWnd, $iLastItemWidth * ($iPosX - $iPos), 0)
            $iLastHorizontalScrolled+=$iLastItemWidth * ($iPosX - $iPos)
        endif
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_HSCROLL
    
    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
        Local $iScrollCode = BitAND($wParam, 0x0000FFFF)
        Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
        $iMin = DllStructGetData($tSCROLLINFO, "nMin")
        $iMax = DllStructGetData($tSCROLLINFO, "nMax")
        $iPage = DllStructGetData($tSCROLLINFO, "nPage")
        $iPosY = DllStructGetData($tSCROLLINFO, "nPos")
        $iPos = $iPosY
        $iTrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
        Switch $iScrollCode
            Case $SB_TOP ; user clicked the HOME keyboard key
                DllStructSetData($tSCROLLINFO, "nPos", $iMin)
            Case $SB_BOTTOM ; user clicked the END keyboard key
                DllStructSetData($tSCROLLINFO, "nPos", $iMax)
            Case $SB_LINEUP ; user clicked the top arrow
                DllStructSetData($tSCROLLINFO, "nPos", $iPos - 1)
            Case $SB_LINEDOWN ; user clicked the bottom arrow
                DllStructSetData($tSCROLLINFO, "nPos", $iPos + 1)
            Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iPos - $iPage)
            Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iPos + $iPage)
            Case $SB_THUMBTRACK ; user dragged the scroll box
                DllStructSetData($tSCROLLINFO, "nPos", $iTrackPos)
        EndSwitch
        DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
        _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
        $iPos = DllStructGetData($tSCROLLINFO, "nPos")
        If ($iPos <> $iPosY) Then
            _GUIScrollBars_ScrollWindow($hWnd, 0, $iLastItemHeigt * ($iPosY - $iPos))
            $iLastVerticalScrolled+=$iLastItemHeigt * ($iPosY - $iPos)
            $iPosY = $iPos
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_VSCROLL
    Alles anzeigen

    Vielleicht hilft dir das Script zum besseren verständis.

    MfG Kanashius :)

  • Problem mit MsgBox und individuellen Tasten

    • Kanashius
    • 3. Dezember 2019 um 22:51

    Ich hab das ganze mal etwas robuster gegen andere Fenster gemacht, die zum gleichen Zeitpunkt auftauchen... Nur den Titel bekomme ich nicht wieder zurückgesetzt -.-

    Da hab ich grad glaub ich ne Denkblockade...

    Aber schau dir den Code unten gern an. Ich habe die Informationen von der Win_Api: https://docs.microsoft.com/de-de/previous…s644977(v=vs.85) genommen und daraus die Strukturen,... gebastelt. :)

    C
    #include <MsgBoxConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    GLOBAL $tagCBT_CREATEWNDA="PTR tagCREATESTRUCTA;HWND hwndInsertAfter",$tagCREATESTRUCTA="PTR lpCreateParams;HANDLE hInstance;HWND hMenu;HWND hwndParent;INT cy;INT cx;INT y;INT x;LONG style;PTR lpszName;PTR lpszClass;DWORD dwExStyle"
    
    ; HauptFenster anlegen
    Local $hMainGUI = GUICreate("Test", 200, 160)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton")
    
    GUICtrlCreateButton("Button 1", 10, 10, 180)
    GUICtrlSetOnEvent(-1, "Button1")
    GUICtrlCreateButton("Button 2", 10, 40, 180)
    GUICtrlSetOnEvent(-1, "Button2")
    GUICtrlCreateButton("Button 3", 10, 70, 180)
    GUICtrlSetOnEvent(-1, "Button3")
    Local $IDallclose = GUICtrlCreateButton("Close", 10, 130, 180)
    GUICtrlSetOnEvent($IDallclose, "CloseButton")
    GUISetState(@SW_SHOW, $hMainGUI)
    
    While Sleep(10)
    WEnd
    
    Func Button1()
        MsgBoxNew($MB_ABORTRETRYIGNORE,"Titel", "Neue drei Tastenbox mit selbst beschriftbaren Tasten")
    EndFunc
    
    Func Button2()
        MsgBox($MB_OK, "","Button 2 gedrückt")
    EndFunc
    
    Func Button3()
        MsgBox($MB_OK, "","Button 3 gedrückt")
    EndFunc
    
    Func CloseButton()
        Exit
    EndFunc
    
    ; Tasten von MainGUI werden umbeschriftet???
    ; MsgBox - Beschreibung der Buttons
    ;
    Func MsgBoxNew($flag, $title, $text)
        Local $hProcMsgBox = DllCallbackRegister("CbtHookProcMsgBox", "int", "int;int;int")
        Local $TIDMsgBox = _WinAPI_GetCurrentThreadId()
        Global $hHookMsgBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($hProcMsgBox), 0, $TIDMsgBox)
        Global $sRandomTitle=Random(10000000,99999999,1)
        Global $sRealTitle=$title
        Local $iRet = MsgBox($MB_ABORTRETRYIGNORE, $sRandomTitle, $text, 0)
        _WinAPI_UnhookWindowsHookEx($hHookMsgBox)
        DllCallbackFree($hProcMsgBox)
        Return $iRet
    EndFunc
    
    Func CbtHookProcMsgBox($nCode, $wParam, $lParam)
        Local $RET = 0, $hBitmap = 0, $xWnd = 0
        If $nCode < 0 Then
            $RET = _WinAPI_CallNextHookEx($hHookMsgBox, $nCode, $wParam, $lParam)
            Return $RET
        EndIf
        Switch $nCode
            Case 3 ;1=HCBT_CREATEWND
                ;$wParam is the window handle here
                ;$lParam is the Pointer to a CBT_CREATEWND structure, containing initialization parameters for the window, changing the CBT_CREATEWND structure changes the window!
                local $tCBT_CREATESTRUCT=DllStructCreate($tagCBT_CREATEWNDA,$lParam)
                local $tCREATESTRUCT=DllStructCreate($tagCREATESTRUCTA,DllStructGetData($tCBT_CREATESTRUCT,"tagCREATESTRUCTA"))
                local $t_tTitle=DllStructCreate("char[257]",DllStructGetData($tCREATESTRUCT,"lpszName"))
                local $sTitle=DllStructGetData($t_tTitle,1)
                If $sTitle=$sRandomTitle Then
                    DllStructSetData($t_tTitle,1,$sRealTitle)
                    DllStructSetData($tCREATESTRUCT,"lpszName",DllStructGetPtr($t_tTitle))
                    $sRandomTitle=$wParam
                EndIf
            Case 5 ;5=HCBT_ACTIVATE
                _WinAPI_SetDlgItemText($sRandomTitle, 3, "Ja")
                _WinAPI_SetDlgItemText($sRandomTitle, 4, "Nein")
                _WinAPI_SetDlgItemText($sRandomTitle, 5, "Vielleicht")
        EndSwitch
        Return 0 ; Return 0 to allow the Action (Like Window creation). 1 would prevent it
    EndFunc ;==>CbtHookProcMsgBox
    
    
    Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString)
        Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", "hwnd", $hDlg, "int", $nIDDlgItem, "str", $lpString)
        Return $aRet[0]
    EndFunc ;==>_WinAPI_SetDlgItemText
    Alles anzeigen
  • Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?

    • Kanashius
    • 31. Oktober 2019 um 19:06

    Ne, ich programmiere kaum noch mit AutoIT und dafür reicht der SciTE-Editor :)

    Ich programmiere eher in Java oder C++, das ist perfomanter und mit den IDEs auch sehr angenehm.

    Außerdem möchte ich demnächst komplett auf Linux umsteigen und da muss ich meine ganzen Scripts nach bash/c++ umschreiben :D

    Aber ich finde es cool, dass du eine Alternative ermöglichen möchtest :)

  • Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?

    • Kanashius
    • 30. Oktober 2019 um 22:52

    Habs angepasst, das selektieren,... natürlich nicht :) Da hast du aber auch echt nen paar sehr grausame Pfade,... verwendet :D

    Dateien

    Test-Szenario 2.au3 4,46 kB – 706 Downloads
  • Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?

    • Kanashius
    • 30. Oktober 2019 um 19:12

    Ich würde vorschlagen, dass wir das etwas abändern. Momentan wird beim ersetzen jede Zeile ersetzt, sofern es ein error/warning/==> ist. Stattdessen würde ich es mit nem If machen. Wir haben ja schon die Erkennung, ob es error, warning oder ==> ist und können dort nur bei dem ==> eine Ersetzung vornehmen, dann wird der Ausdruck zum ersetzen deutlich einfacher als jetzt.

    Die Änderung mit dem error würde es nur noch komplexer machen und die Methode ist auch was Performance angeht nicht sehr schnell. Meistens wird man zwar vorher schon rausgeworfen, da die ", der Pfad, die Klammern,... nicht stimmen, aber das muss je nach Ausgabe des Programmes nicht immer der Fall sein. Mit viel Pech könnten wir die Kommandozeilenausgabe ziemlich verlangsamen. Ich "missbrauche" ein forward lookahead um das ",1" ,welches ans Ende angefügt wird zu finden und zu matchen und als Gruppe anzuzeigen. Dabei wird der gesamte String 1x extra durchsucht. Für das error müsste ich was ähnliches machen,...

  • Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?

    • Kanashius
    • 29. Oktober 2019 um 21:41

    Ich hab das ganze jetzt mal mit einem regulären ausdruck erledigt:

    AutoIt
    #include <Array.au3>
    
    Global $sTestData=    '"D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet'&@crlf& _
                        '"D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.'&@crlf& _
                        '"D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:'
    
    Global $sPattern='(?i)(?:\"(.*?\.au3)\"[ ]*(\(\d+,\d+\)|\(\d+\))[ ]*:[ ]*(warning|error|\=\=\>)(?::[ ]*)?)'
    Global $sPatternReplace='(?i)(?s)(?:\"(.*?\.au3)\"[ ]*(\(\d+,\d+|\(\d+(?=.*(\,1)))\)[ ]*:[ ]*(warning:|error:|\=\=\>)(?:[ ]*)?)(.*),1'
    Global $sReplace='"$1" $2$3): $4 $5'
    
    Global $arData=StringSplit($sTestData,@crlf,1+2)
    for $i=0 to UBound($arData)-1 step 1
        ConsoleWrite($arData[$i]&@crlf)
        $arResult=StringRegExp($arData[$i],$sPattern,3)
        for $j=0 to UBound($arResult)-1 step 3
            ConsoleWrite(@TAB&"FOUND: "&$arResult[$j]&" -> "&$arResult[$j+1]&" -> "&$arResult[$j+2]&@crlf)
        Next
        $sResult=StringRegExpReplace($arData[$i]&",1",$sPatternReplace,$sReplace)
        ConsoleWrite(@TAB&$sResult&@crlf)
    next
    Alles anzeigen

    Einmal wird gesucht und der Dateiname, die Zeile und Spalte sowie der Typ in ein Array gespeichert und dann wird auch mit nem StringRegExpReplace die Zeile ersetzt, so wie du sie haben möchtest :)

    Ausgabe:

    Code
    "D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (112,16) -> warning
        "D:\test files\FileQuantityLimit (Testdatei).au3" (112,16): warning: $iTest possibly not declared/created yet
    "D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (131,11) -> error
        "D:\test files\FileQuantityLimit (Testdatei).au3" (131,11): error: zzzz(): undefined function.
    "D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (163) -> ==>
        "D:\test files\FileQuantityLimit (Testdatei).au3" (163,1): ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Wobei die for Schleife mit $j nicht notwendig sein sollte und stattdessen nen ConsoleWrite(@TAB&"FOUND: "&$arResult[0]&" -> "&$arResult[1]&" -> "&$arResult[2]&@crlf) ausreichen sollte :)

    MfG Kanashius

  • Leere Zeilen textdatei löschen

    • Kanashius
    • 24. Oktober 2019 um 16:05

    Naja, (?m)^(\r\n|\n)=(\r\n|\n)(\r\n|\n), wenn ich mich nicht täusche solltest du dann das gleiche Problem haben wie am Anfang. (?m) macht ja nichts anderes als dafür zu sorgen, dass ^ einen Zeilenumbruch matcht.

    Tatsächlich wäre es vermutlich performanter, wenn ich nicht einen einzelnen Zeilenumbruch mit nem Zeilenumbruch ersetzen würde, also so: (\r\n|\n){2,} statt mit dem +

  • Leere Zeilen textdatei löschen

    • Kanashius
    • 24. Oktober 2019 um 15:54

    Du ersetzt 2 aufeinanderfolgende Zeilenumbrüche mit einem. Wenn du 3 aufeinanderfolgende Zeilenumbrüche hast ersetzt du 2 mit 1 und hast also noch 2 dort stehen. StringReplace geht den String nur einmal durch und macht somit hinter dem eingefügten Zeilenumbruch weiter. Nehmen wir an, dass U ein Zeilenumbruch darstellt und ^ die Position des ersetzers, wird das so verarbeitet:

    Code
    UUU1U2UU3
    ^ FOUND: U
    UUU1U2UU3
     ^ FOUND: UU -> MATCH: REPLACE
     UU1U2UU3
      ^ FOUND: U
     UU1U2UU3
       ^ FOUND: 1
     UU1U2UU3
        ^ FOUND: U
     UU1U2UU3
         ^ FOUND: 2
     UU1U2UU3
          ^ FOUND: U
     UU1U2UU3
           ^ FOUND: UU -> MATCH: REPLACE
     UU1U2 U3
            ^ FOUND: 3, end
    Alles anzeigen

    In deinem Fall wäre ein regulärere Ausdruck sinnvoller. Das würde so aussehen und dann werden alle Zeilenumbrüche ersetzt (auch unix/linux).

    StringRegExpReplace($inhalt,"(\r\n|\n)+","\r\n")

  • Frage zu (EN-) "FAQ # 24 How can I get a window handle when all I have is a PID?"

    • Kanashius
    • 24. Oktober 2019 um 15:38

    Hallo Bernd :)


    Ich bin im moment eher lesend aktiv und schau mir fast jeden Thread an, schreibe aber nicht sehr viel, hauptsächlich, weil ich meistens zu spät bin und schon fast alles wichtige gesagt wurde :D

    _WinAPI_GetParentProcess ( [$iPID = 0] ) zusammen mit ProcessList gibt dir die Möglichkeit, alle Prozesse zu finden, die ein Childprozess von dem sind, den du gestartet hast. Vielleicht kannst du das in Zukunft mal benötigen.

    Generell ist es sehr Sinnvoll, bei diesem Themenbereich mal einen Blick in die WinAPI zu werfen. Sehr viele Funktionalitäten, die nicht mit direkten AutoIT-Aufrufen umgesetzt werden können finden sich dort wieder. Halt alle, die Windows so anbietet :)

    MfG Kanashius

  • Frage zu (EN-) "FAQ # 24 How can I get a window handle when all I have is a PID?"

    • Kanashius
    • 23. Oktober 2019 um 21:02

    Naja, für das WinWait brauchst du ja dann den Handle, den du eigentlich von der Funktion bekommen möchtest, oder du kannst gleich komplett auf das GetHwndFromPID verzichten und warten, bis ein Fenster mit dem Titel existiert. Wobei WinWait im Hintergrund vermutlich ebenfalls die WinList-Funktion benutzt und nach Titeln durchsucht.

    Dort hast du dann die gleiche Schleife, wie in dem Code oben. Wobei die WinWait nen optionalen Timeout dabei hat um abzubrechen. Den kannst du bei der GetHwndFromPID natürlich auch hinzufügen.

    Der einzige Unterschied zwischen den beiden Methoden ist in diesem Fall eigentlich, dass bei WinWait der Titel/Handle des Fensters bekannt ist und du auf diese Weise darauf wartest, bis es erstellt wurde. (Wobei der Handle hier keinen Sinn macht... Wenn du den Handle kennst, existiert es ja definitiv schon.)

    Bei der GetHwndFromPID kennst du die Prozess-ID und möchtest damit ein Fenster bekommen, dass von dem Prozess erstellt wurde.

    Somit brauchst du den Titel nicht und kannst auch nicht ausversehen mit dem Titel das Fenster eines anderen Prozesses abfragen. Fenstertitel sind ja kein eindeutiges Erkennungsmerkmal. Es könnte ja immer ein anderes Fenster mit dem Titel existieren oder erstellt werden. Wenn du auf die Prozess-ID schaust, kannst du dir zumindest sicher sein, dass du kein "zufälliges" anderes Fenster änderst, was nichts mit dem von dir gestarteten Prozess zu tun hat.

    Natürlich solltest du überprüfen, dass der Prozess auch wirklich das von dir gewollte Fenster gestartet hat. Es könnte ja auch passieren, dass du den Prozess startest und der ne Fehlermeldung anzeigt. Da würdest du dann mit dem GetHwndFromPID das Handle des Fehlermeldungsfensters bekommen.

    Du kannst also mit nem WinWait warten, bis ein Fenster mit dem gewollten Titel existiert und prüfst dann, ob der Prozess dazu passt (WinGetProcess), könntest aber auch gleich ne Schleife bauen über WinGetProcess("TITEL"), solange dort -1 zurückkommt wartest du halt (ggf. mit Timeout).

    Du kannst aber auch die GetHwndFromPID nutzen und prüfst dann, dass der Titel passt, oder falls du den nicht kennst, ob die Controls die du steuern willst auch in dem zurückgegebenen Fenster existieren,... ggf. erstellt dein Prozess ja mehrere Fenster, die du mit WinList holen könntest (also so umbauen, dass du nicht nur einen Windowhandle, sondern nen Array von WindowHandles bekommst)m...

    Also du solltest auf jedenfall überprüfen, dass du das richtige Fenster bekommst. Welche der Methoden, die ich oben genannt habe, du nutzt hängt von den Infos ab, die du hast und wie genau du das gestartete Programm kennst,... es gibt auch noch andere Wege, aber die gibt es ja immer ;)

  • Frage zu (EN-) "FAQ # 24 How can I get a window handle when all I have is a PID?"

    • Kanashius
    • 23. Oktober 2019 um 20:12

    Wenn du nen Prozess startest muss er nicht direkt das Fenster öffnen. Du könntest ja auch ein AutoIT-Script schreiben, nen Sleep(50000) nach ganz oben setzen und es dauert 50 Sekunden bis dein Fenster weiter unten erstellt wird.

    Deshalb kann es passieren, dass, je nachdem, was der Prozess vor dem erstellen des Fensters alles macht, deine Abfrage nach dem windowhandle läuft, bevor das Fenster erstellt wurde.

    Das ist ein typisches Problem, was bei paralleler Ausführung von Code passieren kann (Bei Multithreading,... muss man oft auf solche Dinge aufpassen, wobei man das Problem in AutoIT ja normal nicht bekommt).

    Bisher hattest du also nur immer das Glück, dass der gestartete Prozess das Fenster schneller erzeugt hat, als du es in AutoIT abgefragt hast.

  • Listview mit Verzeichnis Struktur

    • Kanashius
    • 9. Oktober 2019 um 12:55

    Ich hatte selbst einmal den Bedarf nach einem FileBrowser und habe damals eine UDF dafür geschrieben, vielleicht ist das, was du möchtest :)

    FileExplorere List and TiewView

    MfG Kanashius

  • Ideen gesucht – Baum – Stamm – Blatt

    • Kanashius
    • 8. Oktober 2019 um 10:53

    Ich verwende bei solche Projekten meistens SQLite. Man muss SQL können, aber dafür kann man alle Daten gut strukturiert ablegen und auch sehr gut Suchfunktionen umsetzen. Insbesondere verschachteltere Strukturen, wenn z.B. eine Datei zu mehreren Kategorien passen würde (z.B. passt das Schnitzel mit Pilzen sowohl zu Rezepten mit Pilzen als auch mit Schnitzel,...) lassen sich dabei sehr gut umsetzen.

    Je nach Menge an Schlagwörtern empfiehlt sich für die Darstellung der Kategorien vermutlich am ehesten eine Kombination aus Treeview und Listview. Du machst auf der einen Seite eine Treeview in der man die Kategorien verschachtelt darstellt und bei der Auswahl werden die Dateien in der Listview angezeigt. Je nach Verschachtelungstiefe der Kategorien/der Länge der Kategorienamen würde ich sie vielleicht auch vertical untereinander anordnen.

    Mit SQLite habe ich auch schonmal eine Live-Suchfunktion gebaut, bei der man in ein Inputfeld tippt und nach jedem Buchstaben direkt die ersten Suchergebnisse angezeigt wurden. (In dem Fall tausend+ Musikdateien durchsuchen nach name.)

    Das würde dir ermöglichen, dass du nach Kategorien, Dateinamen,.... suchen kannst und den Dateien ggf. noch Zusatzinformationen geben kannst.

    Mit freundlichen Grüßen,

    Kanashius :)

  • "FTP_FileGet" ein 2. mal nicht möglich?

    • Kanashius
    • 24. September 2019 um 21:23

    Schau dir mal die Funktion "GUISwitch" an :)

  • Wie komme ich zurück ?

    • Kanashius
    • 8. August 2019 um 19:05

    Sieh dir mal bei GuiGetMsg die Hilfe an und dort den advanced mode (GuiGetMsg(1)).

    Wenn du den nutzt, kannst du eine Schleife haben und dort alle Fenster abarbeiten.

    Die Variablen müssen natürlich vorher declared werden.

  • Toggle Strg möglich?

    • Kanashius
    • 18. Juli 2019 um 22:39
    Zitat von Kanashius

    Funktionsweise: 250ms nachdem LCTRL losgelassen wird, wird LCTRL gedrückt gehalten, bis LCTRL erneut (gedrückt und) losgelassen wird. Wird die 162 in Zeile 19 durch eine 163 ersetzt, löst die rechte CTRL Taste das gedrückt halten aus.

  • Toggle Strg möglich?

    • Kanashius
    • 16. Juli 2019 um 12:24
    Zitat von Gluecksbaerli

    allerdings wenn ich weitere funktionionen mit ctrl+v habe dann triggert es auch und hält die strg taste runter bis ich dann strg einmal drücke um zu lösen


    Wie kann ich das ganze dann in WinWaitActive packen - bei mir triggert das trotzdem also ob es im falschen bereich wirkt ?!

    Kommt drauf an, wie du es implemetierst. Momentan wird ja STRG links verwendet. In dem Fall würde ich tatsächlich STRG rechts verwenden zum blockieren.

    WinWaitActive hat damit garnichts zu tun, da müsste ich den Code sehen.

    Die Funktion die ich verwendet habe ist ein KeyboardHook. Das bedeutet, dass sich das Programm beim Betriebssystem registriert, damit es bei jedem Event (Tastendruck) von der Tastatur aufgerufen wird. Dementsprechend wird die _KeyProc jedesmal aufgerufen, wenn irgendein Tastaturevent eintritt.

    Das bedeutet es wird IMMER aufgerufen, egal, was dein Programm sonst gerade macht (Deshalb funktioniert WinWaitActive nicht). Die Funktion wird immer aufgerufen bei dem KeyDownEvent oder KeyUpEvent, welches die Tastatur auslöst.

    Wenn du weitere Funktionalität implementieren möchtest, z.B. dass ein bestimmtes Fenster aktiv sein muss, musst du Bool-Variablen, o.ä. einführen. Das Bedeutet, dass du ne Variable auf true änderst, wenn dein Fenster aktiv ist, sonst ist sie false. In der KeyUp-Funktion schreibst du dann nen IF mit der Variable und schon wird das ganze nur aufgerufen, wenn die Variable gesetzt ist. Du musst halt deine Denkweise des Programmierens hierbei umstellen. Deshalb würd ich sagen gehört das auch schon zu etwas fortgeschrittener Programmierung.
    Mit dem WindowInfoTool kann man viel auslesen, wenn es native Windowsfenster sind, bei anderen wird es schwerer bis unmöglich, da brauchen wir schon mehr Informationen.

    MfG Kanashius

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™