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

  • Unterstützung für AutoIT Script

    • BugFix
    • 13. März 2021 um 10:57
    Zitat von shitgettinserious

    wenn ich das Dropdown Menü bediene, die Daten im gleichen Fenster neben dem Dropdown Menü erscheinen.

    Die simpelste Variante:

    AutoIt
    Global $aDetail[][] = [ _
    ['Artikel-1', '[Artikel-1];Detail_1: 10;Detail_2: 20;Detail_3: 30;Detail_4: 40;Detail_5: 50;Detail_6: 60'], _
    ['Artikel-2', '[Artikel-2];Detail_1: 110;Detail_2: 120;Detail_3: 130;Detail_4: 140;Detail_5: 150;Detail_6: 160'], _
    ['Artikel-3', '[Artikel-3];Detail_1: 210;Detail_2: 220;Detail_3: 230;Detail_4: 240;Detail_5: 250;Detail_6: 260'], _
    ['Artikel-4', '[Artikel-4];Detail_1: 310;Detail_2: 320;Detail_3: 330;Detail_4: 340;Detail_5: 350;Detail_6: 360']]
    
    Global $hGui = GUICreate('Test', 600, 300)
    Global $cCombo = GUICtrlCreateCombo('', 10, 20, 200)
    ; Daten für Combo erstellen
    Global $sCombo = ''
    For $i = 0 To UBound($aDetail) -1
        $sCombo &= $aDetail[$i][0] & '|'
    Next
    $sCombo = StringTrimRight($sCombo, 1) ; letztes '|' abschneiden
    GUICtrlSetData($cCombo, $sCombo)
    Global $editDetail = GUICtrlCreateEdit('', 220, 20, 340, 250)
    
    GUISetState()
    
    Global $sRead
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $cCombo
                $sRead = GUICtrlRead($cCombo)
                If $sRead <> '' Then _SetDetail($sRead)
        EndSwitch
    WEnd
    
    Func _SetDetail($_sKey)
        GUICtrlSetData($editDetail, '')
        Local $sDetail
        For $i = 0 To UBound($aDetail) -1
            If $aDetail[$i][0] = $_sKey Then
                $sDetail = StringReplace($aDetail[$i][1], ';', @CRLF) ; Semikolon durch Zeilenumbruch ersetzen
                GUICtrlSetData($editDetail, $sDetail)
            EndIf
        Next
    EndFunc
    Alles anzeigen

    Besser geeignet wäre aber staat Combo & Anzeige-Control ein Listview.

  • _GUICtrlListView_SetColumnWidth() - keine Funktion bei Aufruf mit Array-Variabel

    • BugFix
    • 12. März 2021 um 12:31

    Es gibt häufig Probleme, wenn ein mit nativer Funktion erstelltes Control in UDF genutzt werden soll, da diese in der Regel ein Handle statt einer ID erwarten.

    _GuiCtrlListViewSetColumnWidth switcht und ruft bei Übergabe eines Handle _SendMessage($hWnd, $LVM_SETCOLUMNWIDTH, $iCol, $iWidth) und bei Übergabe einer ID GUICtrlSendMsg($hWnd, $LVM_SETCOLUMNWIDTH, $iCol, $iWidth) auf.

    Somit sollte das in beiden Fällen funktionieren. - Aber versuche es doch mal mit

    _GUICtrlListView_SetColumnWidth(GUICtrlGetHandle($ListView_Overview), ... )

  • Interessanter Artikel von Wolfgang Thierse

    • BugFix
    • 12. März 2021 um 07:35

    Wegen diesem Artikel wurde er von Linken, Grünen und Teilen der SPD angefeindet, u.a. wegen dieser Passage

    Zitat

    Die eigene Betroffenheit, das subjektive Erleben sollen und dürfen nicht das begründende Argument ersetzen. Biografische Prägungen – und seien sie noch so bitter – dürfen nicht als Vorwand dafür dienen, unsympathische, gegenteilige Ansichten zu diskreditieren und aus dem Diskurs auszuschließen. Opfer sind unbedingt zu hören, aber sie haben nicht per se recht und sollten auch nicht selbst Recht sprechen und den Diskurs entscheiden.

    Wie kann es denn sein, dass Opfer nicht per se Recht haben - das wurde doch in der #metoo Debatte als Standard definiert. :Face:

    Ich bin knapp 60 und mit meinen Lebenserfahrungen kann ich sagen: Der Mann spricht mir aus der Seele.

    Dieser inflationäre Gebrauch von * etc. ist bisher nicht offizieller Bestandteil deutscher Rechtschreibung und Grammatik. Deshalb hat die neue Ausgabe des Duden völlig zu Recht viel Kritik geerntet, da dort diese Schreibweisen als Regel aufgeführt sind.

    Ich kann nur für mich sprechen, aber wenn ich z. B. in einem Hörsaal vor Frauen und Männern stehe, diese alle ansehe und dann mit "Studenten" anrede, impliziert das für mich, dass sowohl Studenten weiblichen als auch männlichen (und auch sonstigen) Geschlechts gemeint sind.

    Sprache ist etwas Lebendiges, und wenn Änderungen den Menschen sinnvoll erscheinen und diese sich vor Allem beim Sprechen "richtig" anfühlen, dann werden diese auch übernommen.

    Alles andere ist Doktrin und einer Demokratie unwürdig.

  • mehrere labels mit gleichen hintergrund wenn bedingung erfüllt.

    • BugFix
    • 11. März 2021 um 22:38

    Statt einer Vielzahl von Labels solltest du besser die Songs in einem Listview oder einer Listbox verwalten.

  • mehrere labels mit gleichen hintergrund wenn bedingung erfüllt.

    • BugFix
    • 11. März 2021 um 21:24

    Ich habe dort ein Bsp., dass du fast identisch übernehmen kannst. Im Bsp. werden Controls Enabled/Disabled - Das brauchst du nur umstellen auf GuiSetBkColor.

  • mehrere labels mit gleichen hintergrund wenn bedingung erfüllt.

    • BugFix
    • 11. März 2021 um 20:34

    Die Lösung heißt Array.

    Schau mal in meine Signatur.

  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 11. März 2021 um 18:20
    Zitat von Professor Bernd

    Darf ich dein Script "GetUnusedVars.au3" in PSPad4AutoIt3 benutzen und verteilen?

    Na klar, dazu ist es da.

  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 11. März 2021 um 09:48

    SEuBo

    Eine Bitte:

    Deklariere alle Variablen. Ich vermute, dass das Abstürzen damit zusammenhängt.

    Lass einfach mal mein Prüfskript drüberlaufen um alle nicht deklarierten Variablen zu finden.

    EDIT

    Da habe ich jetzt aber das falsche skript eingestellt (man wird alt). Dieses zeigt dir ja nur (un)genutzte Variablen.

    Das Skript, welches ich meinte, war "SetVarsDeclared". Da es aber von 2014 ist, werde ich das erst nochmal anschauen. Zumal es auch ein AutoIt-Skript ist. Für diesen Zweck ist Lua geeigneter.


    Kannst du in SciTE so einbinden (Pfade anpassen):

    Code
    # 39 Unused Vars 
    command.39.*.au3="$(autoit3dir)\autoit3.exe" "C:\CODE\AutoIt\TEST\GetUnusedVars.au3" "$(FilePath)" "0" "1"
    command.name.39.*.au3=GetUnusedVars
    command.save.before.39.*.au3=1
    command.is.filter.39.*.au3=1
    command.shortcut.39.*.au3=Ctrl+Shift+Alt+U
    command.mode.39.*=subsystem:1
    C: GetUnusedVars.au3
    ;-- TIME_STAMP   2019-10-25 17:29:08   v 0.1
    
    #include-once
    #include <File.au3>
    #include <Array.au3>
    #include <SciTE_Output.au3>
    
    
    If $CmdLine[0] Then
        Local $sFile = $CmdLine[1], $fAll = 0, $fString = 1
        Switch $CmdLine[0]
            Case 3
                $fAll    = $CmdLine[2]
                $fString = $CmdLine[3]
            Case 2
                $fAll    = $CmdLine[2]
        EndSwitch
    Else
        Exit
    EndIf
    
    _SciTE_Output('+>' & @HOUR & ':' & @MIN & ':' & @SEC & ' Start: Get_Unused_Vars' & @CRLF)
    Local $vReturn = _GetUnusedVarsConst($sFile, $fAll, $fString)
    Local $error = @error
    _SciTE_Output('+>' & @HOUR & ':' & @MIN & ':' & @SEC & ' Ende: Get_Unused_Vars' & @CRLF)
    If @error Then _SciTE_Output('!Fehler: Datei "' & $sFile & ' existiert nicht.' & @CRLF)
    If $fString = 0 Then
        _ArrayDisplay($vReturn)
    Else
        _SciTE_Output($vReturn & @CRLF)
    EndIf
    
    
    ;===============================================================================
    ; Function Name:   _GetUnusedVarsConst
    ; Description:     Ermittelt ungenutzte Variablen/Konstanten in einem Skript
    ;                  Optional können alle Variablen mit Anzahl der Vorkommen ermittelt werden
    ;                  Ignoriert werden:
    ;                            Variablen in Kommentarzeilen
    ;                            Variablen in Kommentarblöcken
    ;                            Zählervariablen (For-Schleife)
    ; Parameter(s):    $sFile    Pfad zur Skriptdatei
    ;                  $fAll     1 - Rückgabe aller Variablen; 0(Standard) - einmalige Variablen
    ;                  $fString  1(Standard) - Rückgabe in Konsole; 0 - Anzeige Array
    ; Return Value(s): Erfolg    Standard  Array/String mit nur einmalig auftauchender Variable
    ;                            Optional  Array/String mit allen Variablen
    ;                            Ausgabe:  Funktionsbereich - Variable - Anzahl - Position:Zeile(n)
    ;                  Fehler    0         @error = 1      $sFile nicht vorhanden
    ; Author(s):       BugFix (bugfix@autoit.de)
    ;===============================================================================
    Func _GetUnusedVarsConst($sFile, $fAll=0, $fString=1)
        Local $oVars     = ObjCreate('Scripting.Dictionary')
        Local $oFuncVars = ObjCreate('Scripting.Dictionary')
        Local $aFuncs[1][2] = [[0]] ; [['Funktionsname','var1/Anz1/Zeile(1.),Zeile(2.)..' & '|' & 'var1/Anz1/Zeile(1.),Zeile(2.)..' & '|'  & 'var(n)/Anz(n)/Zeile(1.),Zeile(2.)..' ]]
        Local $aFile, $tmp, $aSplit, $aMatch, $inFunc = False, $counterFor = '', $1stChar, $iPos, $sSign, $fSet, $iSemicolon, $skip, $sFuncName
        If Not FileExists($sFile) Then Return SetError(1,0,0)
        _FileReadToArray($sFile, $aFile)
        For $i = 1 To $aFile[0]
            ; Kommentarblöcke werden übersprungen
            ; auskommentierte Zeilen werden übersprungen
            $1stChar = StringLeft(StringStripWS($aFile[$i],1), 1)
            If $1stChar = ';' Then ContinueLoop
            If (StringInStr($aFile[$i], '#cs') Or StringInStr($aFile[$i], '#comments-start')) Then $skip = True
            If (StringInStr($aFile[$i], '#ce') Or StringInStr($aFile[$i], '#comments-end')) Then $skip = False
            If $skip Then ContinueLoop
            Select
                Case StringLeft(StringStripWS($aFile[$i], 1), 4) = 'Func'
                    ; Beginn Funktionscode
                    ; Funktionsnamen auslesen u. in Func-Array eintragen
                    ; Funktionszähler +1
                    $inFunc = True
                    $aMatch = StringRegExp($aFile[$i], '^(?:[F|f]unc\s+)([_a-zA-Z0-9]+)', 1)
                    $sFuncName = $aMatch[0]
                    ; Variablen aus Funktionsheader (auch mehrzeilig) auslesen und in $oFuncVars erfassen
                    ; steht eine Variable in einem Kommentar hinter dem Header wird sie ignoriert
                    $aMatch = StringRegExp($aFile[$i], '(?:[F|f]unc\s+[\d\w]+\()[$,\w\s]*(?:\)?)', 1) ; Codeteil vor mgl. Kommentar oder '_'
                    $aMatch = StringRegExp($aMatch[0], '(\$[\d\w]+)', 3)
                    If IsArray($aMatch) Then __VarObjectAdd($oFuncVars, $aMatch, $counterFor, $i)
                Case StringLeft(StringStripWS($aFile[$i], 1), 7) = 'EndFunc'
                    ; Ende Funktionscode
                    ; in $oFuncVars gesammelte Variablen/Anzahl in $aFuncs übertragen
                    ; optional ($fAll=True) werden alle Variablen mit Anzahl Vorkommen übertragen
                    ; standardmäßig nur Variablen mit einmaligem Vorkommen
                    If $oFuncVars.Count Then
                        __SetToFuncArray($aFuncs, $oFuncVars, $fAll, $sFuncName)
                        $oFuncVars.RemoveAll
                    EndIf
                    $inFunc = False
                Case Else ; Codezeilen innerhalb oder außerhalb einer Funktion, durch $inFunc markiert
                    ; prüfen auf For-Schleife, Selektion Zählervariable
                    If StringLeft(StringStripWS($aFile[$i], 1), 3) = 'For' Then
                        $aMatch = StringRegExp($aFile[$i], '(?:[F|f]or\s+)(\$[\d\w]+)', 1)
                        $counterFor = $aMatch[0]
                    EndIf
                    ; prüfen auf Ende For-Schleife, Zurücksetzen Zählervariable, näste Zeile
                    If StringLeft(StringStripWS($aFile[$i], 1), 4) = 'Next' Then
                        $counterFor = ''
                        ContinueLoop
                    EndIf
                    ; prüfen ob ';' enthalten und wieviel
                    StringReplace($aFile[$i], ';', '')
                    $iSemicolon = @extended
                    $fSet = False
                    If $iSemicolon Then
                        ; Anzahl der ';' gibt keine Auskunft ob Kommentar od. Wertzuweisung
                        ; wenn Wertzuweisung, muß vor und nach dem ; ein ' oder " sein (Stringbegrenzer)
                        ; ist eines der Zeichen enthalten könnte es eine Wertzuweisung sein
                        ; es braucht nur das letzte Vorkommen geprüft werden, wenn nicht in Stringbegrenzern ist es Kommentar
                        ; wenn Kommentar - diesen Teil abtrennen
                        ; ABER: wenn letzter Stringbegrenzer vor Semikolon == mit einem Stringbegrenzer im Kommentar ==> Kommentar wird nicht erkannt!
                        If StringInStr($aFile[$i], '"') Or StringInStr($aFile[$i], "'") Then ; sind Stringbegrenzer vorhanden
                            $sSign = ''
                            $iPos = StringInStr($aFile[$i], ';', 1, -1) ; letztes Vorkommen ermitteln
                            $aSplit = StringSplit($aFile[$i], '')
                            For $j = $iPos -1 To 1 Step -1 ; rückwärts iterieren ab Semikolon
                                If $aSplit[$j] = '"' Or $aSplit[$j] = "'" Then
                                    $sSign = $aSplit[$j]
                                    ExitLoop
                                EndIf
                            Next
                            ; wenn Stringbegrenzer links gefunden
                            If $sSign <> '' Then ; vorwärts iterieren ab Semikolon
                                For $j = $iPos +1 To $aSplit[0]
                                    If $aSplit[$j] = $sSign Then ; davor und danach dasselbe ' od. " ==> also Zuweisung
                                        $fSet = True
                                        ExitLoop
                                    EndIf
                                Next
                            EndIf
                        EndIf
                        If Not $fSet Then ; ist Kommentar, nicht Zuweisung
                            $aFile[$i] = StringLeft($aFile[$i], StringInStr($aFile[$i], ';', 1, -1) -1)
                        EndIf
                    EndIf
                    ; Variablen selektieren und an $oFuncVars oder $oVars übergeben
                    $aMatch = StringRegExp($aFile[$i], '(\$[\d\w]+)', 3)
                    If IsArray($aMatch) Then
                        If $inFunc = True Then
                            __VarObjectAdd($oFuncVars, $aMatch, $counterFor, $i)
                        Else
                            __VarObjectAdd($oVars, $aMatch, $counterFor, $i)
                        EndIf
                    EndIf
            EndSelect
        Next
        If $oVars.Count Then __SetToFuncArray($aFuncs, $oVars, $fAll)
        Local $aRet[1][4] = [['Funktionsbereich','Variable','Anzahl','Zeile(n)']], $aSplit2
        Local $iLenFn = 0, $iLenVName = 0, $iLenVCnt = 6
        For $i = 1 To UBound($aFuncs) -1
            $aSplit = StringSplit($aFuncs[$i][1], '|')
            For $j = 1 To $aSplit[0]
                $aSplit2 = StringSplit($aSplit[$j], '/')
                If @error Then
                    ;ConsoleWrite('err aSplit2' & @CRLF)
                    ContinueLoop
                EndIf
                ReDim $aRet[UBound($aRet)+1][4]
                $aRet[UBound($aRet)-1][0] = $aFuncs[$i][0]
                $aRet[UBound($aRet)-1][1] = $aSplit2[1]
                $aRet[UBound($aRet)-1][2] = $aSplit2[2]
                $aRet[UBound($aRet)-1][3] = $aSplit2[3]
                If StringLen($aFuncs[$i][0]) > $iLenFn Then $iLenFn = StringLen($aFuncs[$i][0])
                If StringLen($aSplit2[1]) > $iLenVName Then $iLenVName = StringLen($aSplit2[1])
                If StringLen($aSplit2[2]) > $iLenVCnt Then $iLenVCnt = StringLen($aSplit2[2])
            Next
        Next
        If $fString = 0 Then Return $aRet
    
        Local $sRet = StringFormat('< %-' & $iLenFn +2 & 's%-' & $iLenVName +2 & 's%' & $iLenVCnt +2 & 's  Zeile(n)\n', 'Funktionsbereich', 'Variable', 'Anzahl')
        Local $aSign[] = ['+','>']
        For $i = 1 To UBound($aRet) -1
            $sRet &= StringFormat('%s %-' & $iLenFn +2 & 's%-' & $iLenVName +2 & 's%' & $iLenVCnt +2 & 's  %s\n', ($aSign[($aRet[$i][0]='Out_Of_Func')]), $aRet[$i][0], $aRet[$i][1], $aRet[$i][2], $aRet[$i][3])
        Next
        Return $sRet
    EndFunc  ;==>_GetUnusedVarsConst
    
    Func __VarObjectAdd(ByRef $oDict, $aMatch, $counterFor, $line)
        Local $aSplit
        For $i = 0 To UBound($aMatch) -1
            If $aMatch[$i] = $counterFor Then ContinueLoop ; Zählervariablen werden nicht gezählt
            If $oDict.Exists($aMatch[$i]) Then
                $aSplit = StringSplit($oDict.Item($aMatch[$i]), '/')
                $oDict.Item($aMatch[$i]) = $aSplit[1] +1 & '/' & $aSplit[2] & ',' & $line
            Else
                $oDict.Add($aMatch[$i], 1 & '/' & $line)
            EndIf
        Next
    EndFunc  ;==>__VarObjectAdd
    
    Func __SetToFuncArray(ByRef $aFuncs, ByRef $oDict, $fAll, $sFuncName='')
        Local $aSplit, $colKeys, $sVarCount = ''
        $colKeys = $oDict.Keys
        For $key In $colKeys
            If $sFuncName <> '' Then
                ReDim $aFuncs[UBound($aFuncs)+1][2]
                $aFuncs[UBound($aFuncs)-1][0] = $sFuncName
            EndIf
            If $fAll = 0 Then
                If Not StringRegExp($oDict.Item($key), '(1/\d+)') Then ContinueLoop
            EndIf
            $aSplit = StringSplit($oDict.Item($key), '/')
            $sVarCount &= $key & '/' & $aSplit[1] & '/' & $aSplit[2] & '|'
            If $sFuncName <> '' Then
                $aFuncs[UBound($aFuncs)-1][1] = StringTrimRight($sVarCount, 1)
                $sVarCount = ''
            EndIf
        Next
        If $sFuncName = '' Then
            ReDim $aFuncs[UBound($aFuncs)+1][2]
            $aFuncs[UBound($aFuncs)-1][0] = 'Out_Of_Func'
            $aFuncs[UBound($aFuncs)-1][1] = StringTrimRight($sVarCount, 1)
        EndIf
    EndFunc  ;==>__SetToFuncArray
    Alles anzeigen

    Dazu brauchst du die:

    AutoIt: SciTE_Output.au3
    ;-- TIME_STAMP   2021-03-11 09:45:26
    
    Global $sSciTECmd
    GUIRegisterMsg(74, "MY_WM_COPYDATA") ; $WM_COPYDATA = 74
    
    ;===============================================================================
    ; Function Name....: _SciTE_Output
    ; Description......: Writes output in the current open SciTE output pane
    ; Parameter(s).....: $_sOutput    Text to write, same use as in "ConsoleWrite"
    ;===============================================================================
    Func _SciTE_Output($_sOutput)
        $_sOutput = StringRegExpReplace($_sOutput, '\r\n|\n|\r', '\\n')
        $_sOutput = StringReplace($_sOutput, @TAB, '\t')
        SendSciTE_Command("output:" & $_sOutput)
    EndFunc
    
    ; by Jos
    Func SendSciTE_Command($sCmd, $Wait_For_Return_Info = 0)
        Local $WM_COPYDATA = 74
        Local $Scite_hwnd = WinGetHandle("DirectorExtension") ; 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))
        DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
                'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
                'Ptr', DllStructGetPtr($COPYDATA))
        GUIDelete($My_Hwnd)
    EndFunc   ;==>SendSciTE_Command
    
    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
        Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
        Local $SciTECmdLen = DllStructGetData($COPYDATA, 2)
        Local $CmdStruct = DllStructCreate('Char[255]', DllStructGetData($COPYDATA, 3))
        $sSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $SciTECmdLen)
    EndFunc   ;==>MY_WM_COPYDATA
    Alles anzeigen
  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 10. März 2021 um 18:46

    SEuBo

    Ich habe jetzt mal meine in Post #4 erwähnten GUI-Objekt-Funktionen mit ASO teilweise umgesetzt.

    Grundsätzlich funktioniert es, allerdings schmiert das Skript unregelmäßig aber immer wieder ab.

  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 10. März 2021 um 15:31
    Zitat von Professor Bernd

    Wenn nicht für GUI Elemente, wofür würdest du Objekte vorrangig haben wollen? :)

    Ich finde es schon interessant, das für GUI zu nutzen. Letztlich kann man es ja für alles nutzen. Aber wir brauchen ja erst mal die Basis, die das kann. Du tapezierst ja auch nicht, bevor du die Wände gemauert hast. 8o


    EDIT:

    Hier mal ein ganz minimalistisches Bsp. um mit ASO und GUI zu arbeiten:

    AutoIt
    #include <AutoItSimpleObjects.au3>
    
    Global $oGui = _objGui('Test ASO', 600, 400)
    Global $oBt1 = _objGuiCtrl_Button($oGui, 'Button 1', 20, 20, 80, 20)
    Global $oBt2 = _objGuiCtrl_Button($oGui, 'Auslesen Fenstertitle', 20, 60, 120, 20)
    Global $oBt3 = _objGuiCtrl_Button($oGui, 'Auslesen Text Button-1', 20, 90, 120, 20)
    
    $oGui.show
    
    While True
        Switch GUIGetMsg()
            Case -3
                Exit
            Case $oBt1.id
                ConsoleWrite('Button-1 geklickt' & @CRLF)
            Case $oBt2.id
                ConsoleWrite('Fenstertitel: ' & $oGui.title & @CRLF)
            Case $oBt3.id
                ConsoleWrite('Text Button-1: ' & $oBt1.title & @CRLF)
        EndSwitch
    WEnd
    
    
    
    
    ;-------------------------------------------------------------------------------- GUI --------------
    Func _objGui($title='', $x=-1, $y=-1, $w=-1, $h=-1, $style=Default, $styleEx=Default)
        Local $self = _ASO_Create()
        With $self
            .show      = _mGuiShow
            .title     = _mGuiTitle
            .hwnd      = GUICreate($title, $x, $y, $w, $h, $style, $styleEx)
            .title     = $title
            .__class__ = 'window'
        EndWith
        Return $self
    EndFunc
    
    Func _mGuiShow($iState=@SW_SHOW)
        Local $self = _ASO_This()
        GUISetState($iState, HWnd($self.hwnd))
    EndFunc
    
    Func _mGuiTitle($sTitle=Null) ; liest/setzt Title/Text von GUI/GUI_Ctrl
        Local $self = _ASO_This()
        Switch $self.__class__
            Case 'window'
                If $sTitle = Null Then
                    Return $self.title
                Else
                    $self.title = $sTitle
                EndIf
            Case 'button', 'label', 'input'
                If $sTitle = Null Then
                    Return $self.text
                Else
                    $self.text = $sTitle
                EndIf
        EndSwitch
    EndFunc
    ;---------------------------------------------------------------------------------------------------
    
    
    ;-------------------------------------------------------------------------------- GUI-Ctrl ---------
    Func _objGuiCtrl_Button($oParent, $text='', $x=-1, $y=-1, $w=-1, $h=-1, $style=Default, $styleEx=Default)
        Local $self = _ASO_Create()
        $self.title = _mGuiTitle
        Local $HwndPrev = GUISwitch(HWnd($oParent.hwnd))
        $self.id = GUICtrlCreateButton($text, $x, $y, $w, $h, $style, $styleEx)
        GUISwitch($HwndPrev)
        $self.text = $text
        $self.__class__ = 'button'
        Return $self
    EndFunc
    ;---------------------------------------------------------------------------------------------------
    Alles anzeigen
  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 10. März 2021 um 15:15
    Zitat von Professor Bernd

    Oder meinst du was anderes?

    Ich meinte deinen Bezug auf Checkbox. Das ist ein GUI-Element und somit grundsätzlich nicht Bestandteil einer Objekt-UDF.

    Aber natürlich kann man mit Basis der Objekt-UDF dann eine GuiObjekt-UDF erstellen.

  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 10. März 2021 um 12:11

    SEuBo

    Ich habe mit dem DL aus Post1 getestet.

    Was ich nicht ganz verstehe:

    Im 2.ten Bsp. möchte ich als Parameter die Property eines anderen Objekts übergeben, das geht daneben.

    Da hatte ich mich vertan - funktioniert

    Test
    Code
    ; fehlende Deklarationen
    ; in "AutoItObject_internal.au3" - Func: "Invoke" - "$b", "$pVARIANT_Getter" und "$tVariantSource"
    ;                                - Func: "__AOI_PropertyGetFromName" - "$tProperty", "$sPropertyName"
    ;                                - Func: "__AOI_PropertyCreate" - "$tProperty", "$sPropertyName"
    
    Das sind die, die ich bemerkt hatte. Danach habe ich die Option (MustDeclareVars) deaktiviert.
    AutoIt
    ;-- TIME_STAMP   2021-03-10 12:43:59
    
    #include <AutoItSimpleObjects.au3>
    
    _Example_1()
    ConsoleWrite(@CRLF)
    
    _Example_2()
    ConsoleWrite(@CRLF)
    
    _Example_3()
    
    Func _Example_1()
        Local $oRechne_1 = _objTemplate()
        With $oRechne_1
            .plus(5)
            .show('+5')
            .plus(15)
            .show('+15')
            .minus(8)
            .show('-8')
            .delete()
            .show('delete')
        EndWith
    EndFunc
    
    Func _Example_2()
        Local $oRechne_1 = _objTemplate()
        Local $oRechne_2 = _objTemplate()
        With $oRechne_1
            .plus(5)
            .show('(o1) +5')
            .plus(15)
            .show('(o1) +15')
            .minus(8)
            .show('(o1) -8')
        EndWith
        With $oRechne_2
            .plus(7)
            .show('(o2) +7')
            .plus($oRechne_1.result)
            .show('(o2) +o1.result')
            .minus(12)
            .show('(o2) -12')
        EndWith
    EndFunc
    
    Func _Example_3()
        Local $oRechne_1 = _objTemplate()
        With $oRechne_1
            .plus(5)
            .show('(o1) +5')
            .plus(15)
            .show('(o1) +15')
            .minus(8)
            .show('(o1) -8')
        EndWith
    
        Local $oRechne_2 = _objExtended($oRechne_1)
        With $oRechne_2
            .mul(3)
            .show('(o2) o1.result*3')
            .div(2)
            .show('(o2) / 2')
        EndWith
    EndFunc
    
    
    
    Func _objTemplate()
        Local $self = _ASO_Create()
        _ASO_AddMethod($self, 'plus', _obj_Plus)
        _ASO_AddMethod($self, 'minus', _obj_Minus)
        _ASO_AddMethod($self, 'delete', _obj_Delete)
        _ASO_AddMethod($self, 'show', _obj_Show)
        _ASO_AddProperty($self, 'result', 0)
        Return $self
    EndFunc
    
    Func _objExtended($oBase) ; wird vorbelegt mit $oBase.result
        Local $self = _ASO_Create()
        _ASO_AddMethod($self, 'mul', _obj_Mul)
        _ASO_AddMethod($self, 'div', _obj_Div)
        _ASO_AddMethod($self, 'delete', _obj_Delete)
        _ASO_AddMethod($self, 'show', _obj_Show)
        _ASO_AddProperty($self, 'result', $oBase.result)
        Return $self
    EndFunc
    
    
    
    Func _obj_Plus($val)
        Local $self = _ASO_This()
        $self.result = $self.result + $val
    EndFunc
    
    Func _obj_Minus($val)
        Local $self = _ASO_This()
        $self.result = $self.result - $val
    EndFunc
    
    Func _obj_Mul($val)
        Local $self = _ASO_This()
        $self.result = $self.result * $val
    EndFunc
    
    Func _obj_Div($val)
        If $val = 0 Then Return
        Local $self = _ASO_This()
        $self.result = $self.result / $val
    EndFunc
    
    Func _obj_Delete()
        Local $self = _ASO_This()
        $self.result = 0
    EndFunc
    
    Func _obj_Show($msg='')
        Local $self = _ASO_This()
        ConsoleWrite('$self.result: ' & ($msg <> '' ? ('[' & $msg & ']' & @TAB) : '') & $self.result & @CRLF)
    EndFunc
    Alles anzeigen


    EDIT:

    Aber Verkettung scheint so nicht machbar.

    Die Methoden reichen ja beim Verlassen die Objektreferenz weiter. Eigentlich sollte doch somit die Folgemethode aufgerufen werden können.

    AutoIt
    _Example()
    
    
    Func _Example()
        Local $oRechne_1 = _objTemplate()
        $oRechne_1.plus(5).show('+5').minus(3).show('-3').plus(20).show('+20')  ; tut nix
    EndFunc
    
    
    Func _objTemplate()
        Local $self = _ASO_Create()
        _ASO_AddMethod($self, 'plus', _obj_Plus)
        _ASO_AddMethod($self, 'minus', _obj_Minus)
        _ASO_AddMethod($self, 'show', _obj_Show)
        _ASO_AddProperty($self, 'result', 0)
        Return $self
    EndFunc
    
    Func _obj_Plus($val)
        Local $self = _ASO_This()
        $self.result = $self.result + $val
        Return $self
    EndFunc
    
    Func _obj_Minus($val)
        Local $self = _ASO_This()
        $self.result = $self.result - $val
        Return $self
    EndFunc
    
    Func _obj_Show($msg='')
        Local $self = _ASO_This()
        ConsoleWrite('$self.result: ' & ($msg <> '' ? ('[' & $msg & ']' & @TAB) : '') & $self.result & @CRLF)
        Return $self
    EndFunc
    Alles anzeigen
  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 10. März 2021 um 09:06
    Zitat von Professor Bernd

    Mir ist gerade ein Paradebeispiel über den Weg gelaufen: Die CheckBox.

    Für die CheckBox muss man sich verschiedene Funktionen zusammensuchen, die einem nicht so richtig intuitiv einfallen (zumindes mir nicht). 8o

    GUICtrlSetState() Häkchen setzen/entfernen.
    GUICtrlGetState()
    GUICtrlRead()
    Prüfen, ob das Häkchen gesetzt ist.
    GUICtrlSetData() Text zuweisen.
    GUICtrlGetData()
    GUICtrlRead() mit advanced = 1
    Text auslesen.


    Bei einem Objekt und dessen Eigenschaften würde ich mir das so vorstellen:

    CheckBox1.Checked = True/False Häkchen setzen/entfernen.
    If CheckBox1.Checked Then Prüfen, ob das Häkchen gesetzt ist.
    CheckBox1.Text = "Hallo Welt!" Text zuweisen.
    $sChkText = CheckBox1.Text Text auslesen.

    Vielleicht sieht das mancher anders, aber ich finde das total easy und eingängig. :)

    Das wäre ja dann eine Portierung von GUI Funktionen in ein Objekt. Das kannst du natürlich selbst durchführen und ist in deiner beschriebenen Form ja möglich.

    SEuBo geht es ja darum, was das Objekt als Solches sonst so können sollte. Die Implementierung von GUI etc. ist ja absolut unproblematisch und es liegt dann an dir, wie du das in deiner Variante umsetzt

  • Umgebungsvariablen

    • BugFix
    • 9. März 2021 um 16:08
    Zitat von AspirinJunkie

    Dafür ist der Befehl setx zuständig.

    Den Befehl kannte ich tatsächlich noch nicht. Man lernt halt nicht aus. ;)

  • Umgebungsvariablen

    • BugFix
    • 9. März 2021 um 12:16

    Das Thema ist nicht AutoIt spezifisch, sondern generell sehr unklar.

    Ich wollte (hier) durch Setzen von Umgebungsvariablen (SCITE_USERHOME) unterschiedliche Pfade bereitstellen zum Starten verschiedener SciTE-Versionen.

    Das war meine erste intensivere Beschäftigung mit Umgebungsvariablen (bisher hatte ich diese ausschließlich abgefragt). Nun wollte ich diese aber setzen.

    Ergebnis:

    Die geänderten Variablen haben den neuen Wert nur im direkten Kontext des Änderungsprogrammes. D.h.

    VARIABLE Wert: "Alter-Wert"

    - Öffnen 1. Konsole

    set VARIABLE=Neuer-Wert

    - Abfrage in 1. Konsole: set VARIABLE -- Ausgabe: VARIABLE=Neuer-Wert

    - parallel Öffnen 2. Konsole

    - Abfrage in 2. Konsole: set VARIABLE -- Ausgabe: VARIABLE=Alter-Wert

    In AutoIt ist das analog.

    EnvSet("Variable", Wert)

    EnvUpdate()

    EnvGet("Variable")  zeigt den neuen Wert, Abfrage über die CMD bringt aber wieder den alten Wert.

    Wie also werden von Windows diese Variablen gesetzt? Denn wenn ich das händisch über <Systemeigenschaften> <Umgebungsvariablen> durchführe ist es ja möglich.

    :?:

  • AutoItSimpleObjects - Objektorientierung in AutoIt

    • BugFix
    • 9. März 2021 um 10:33
    Zitat von SEuBo

    5. Was brauche ich von Euch?

    Anwendungsfälle, Ideen, Feedback.

    Mal ins Blaue gedacht: Wofür würdet Ihr OO- benutzen? Sind Dinge wie Interfaces, Klassen, Traits, ByRef-Paramter, usw. für Euch unabdingbar bzw. was wäre Funktionalität, die Ihr nicht braucht?

    Ist die UDF einfach genug - oder zu einfach gehalten? Sind die Syntaxmöglichkeiten in AutoIt ausreichend?

    Ich hatte vor Jahren mit AutoIt-Object mal die String- und später Teile der GUI-Funktionen in Objektform dargestellt. (Link)

    Für GUI mit vielen gleichartigen Control ist eine Methode .Clone natürlich fein. Aber das ist natürlich in erster Linie Syntactic Sugar.

    Aber sicherlich ist eine Portierung der AutoIt-Funktionen nicht das Ziel.

    Wofür also ist OOP wünschenswert?

    Das kann ich ad hoc gar nicht mal sagen. Was ich in AutoIt prozedural programmiere mache ich z.B. in Nim mit OO. Die Sprache bietet es an, also nutze ich es - schon allein wegen der angenehmeren Syntax.

    Achja, was ich angenehm finde (denn das stört mich bei AutoIt):

    Die Parameter in Methoden sollten über ihren Namen angesprochen werden können. Also wenn ich z.B. habe

    Method(Param1=Default, Param2=Default, Param3) ,

    rufe ich auf mit

    .Method(Param3=Wert3)

    statt

    .Method(Default, Default, Wert3).

  • Installation mehrerer SciTE-Versionen

    • BugFix
    • 8. März 2021 um 13:29

    [EDIT] Kommando zurück:

    Autoit kann ja gar nicht Systemvariablen setzen. Es wird das gewählte SciTE gestartet, aber wenn ich eine Abfrage der Umgebungsvariable mache, bleibt die gleich.

    Muss wohl auf CMD-Ebene ausgeführt werden - mal testen.

    [EDIT 2]

    Umgebungsvariablen scheinen ein Ding für sich zu sein:

    Der AutoIt-Befehl EnvSet beeinflusst sie nicht, damit kann man nur eigene (Laufzeit-Umgebungsvariablen) erstellen.

    Ausführen in der CMD: set VAR=Neuer_Wert ist erfolgreich.

    Ausführen in AutoIt: Run(@ComSpec & " /c " & 'set VAR=Neuer_Wert', '', @SW_HIDE) wird ignoriert.

    Muss ich dafür echt eine Batch Datei verwenden? :Face:


    Ich habe es jetzt mit einem Launcher gelöst:

    Verknüpfung auf dem Screen zu:

    - C:\Launcher\SciTELaunch.exe "4.4.6" - startet SciTE v4.4.6

    - C:\Launcher\SciTELaunch.exe - startet SciTE4AutoIt

    Ini-Datei im Launcherordner:

    Code: SciTELaunch.ini
    [Scite_UserHome]
    AutoIt=%LOCALAPPDATA%\AutoIt v3\SciTE
    4.4.6=C:\Scite446
    
    [Run]
    AutoIt=C:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe
    4.4.6=C:\Scite446\SciTE.exe
    AutoIt: SciTELaunch.au3
    #include <WinAPISys.au3>
    Opt('MustDeclareVars', 1)
    
    Local $INI = @ScriptDir & '\SciTELaunch.ini'
    If Not FileExists($INI) Then
        If Not FileExists($INI & '.muster') Then
            FileWrite($INI & '.muster', _
            "[Scite_UserHome]" & @CRLF & _
            "AutoIt=%LOCALAPPDATA%\AutoIt v3\SciTE" & @CRLF & _
            "4.4.6=C:\Scite446" & @CRLF & @CRLF & _
            "[Run]" & @CRLF & _
            "AutoIt=C:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" & @CRLF & _
            "4.4.6=C:\Scite446\SciTE.exe" & @CRLF)
        EndIf
        Exit BitAND(MsgBox(16+4096+262144, 'FEHLER', '"SciTELaunch.ini" ist nicht im Programmverzeichnis!' & @CRLF & 'Öffnen der Musterdatei.'), _
                    Run("notepad.exe '" & $INI & '.muster' & "'"))
    EndIf
    
    ; Pfad für SCITE_USERHOME auslesen
    Global $sPath, $sKey, $aSec
    If $CMDLINE[0] > 0 Then
        $sKey = $CMDLINE[1]
        $sPath = IniRead($INI, 'Scite_UserHome', $sKey, '')
    Else ; ersten Eintrag verwenden
        $aSec = IniReadSection($INI, 'Scite_UserHome')
        If @error Or $aSec[0][0] = 0 Then Exit MsgBox(16+4096+262144, 'FEHLER', '"SciTELaunch.ini" enthält keine Einträge!')
        $sKey = $aSec[1][0]
        $sPath = $aSec[1][1]
    EndIf
    If $sPath = '' Then Exit MsgBox(16+4096+262144, 'FEHLER', 'Für den Schlüssel "' & $sKey & '" ist kein Wert zu "SCITE_USERHOME" eingetragen!')
    $sPath = _WinAPI_ExpandEnvironmentStrings($sPath)
    
    ; Pfad zur SciTE-Version auslesen
    Global $sRun = _WinAPI_ExpandEnvironmentStrings(IniRead($INI, 'Run', $sKey, ''))
    If $sRun = '' Or (Not FileExists($sRun)) Then Exit MsgBox(16+4096+262144, 'FEHLER', 'Für den Schlüssel "' & $sKey & '" ist kein gültiger SciTE-Startpfad eingetragen!')
    
    ; Setzen der Umgebungsvariable
    Global $currentValue = EnvGet('SCITE_USERHOME')
    If $currentValue <> $sPath Then
        EnvSet('SCITE_USERHOME', $sPath)
        EnvUpdate()
    EndIf
    
    ; Starten von SciTE
    Run($sRun)
    Alles anzeigen

    Die andere SciTE-Version habe ich bewusst nicht im Programmordner installiert, damit ich die dortigen Property-Dateien auch bearbeiten kann.

  • Installation mehrerer SciTE-Versionen

    • BugFix
    • 7. März 2021 um 18:27

    Bitnugger

    Das nützt leider nur bei Projekten etwas, da die Hierarchie nur eine Ordnerebene erlaubt. Ausschließlich die SciTEUser.properties sind allgemein gültig.

    Alternativ müsste ich dann in jedem Skriptordner eine SciTEDirectory.properties erstellen mit dem Inhalt der SciTEUser.properties. Obwohl, das könnte man ja ohne Verwendung von Speicherplatz per Link regeln.

  • Installation mehrerer SciTE-Versionen

    • BugFix
    • 7. März 2021 um 14:16

    Ach stimmt, da wird ja (leider) eine Umgebungsvariable gesetzt. Und die zuletzt installierte Version prüft: Variable gesetzt - OK, alles gut - dann nehmen wir den Pfad. So ein Mist.

    Ich trauere noch immer den Zeiten nach, als sämtliche Settings im Programmordner selbst abgelegt wurden.

    OK, mal sehen ob das was Brauchbares wird. Ansonsten bleibt nur der Umweg über zweiten Windows-User oder VM.

  • Installation mehrerer SciTE-Versionen

    • BugFix
    • 7. März 2021 um 11:25

    Ich würde gern neben der Installation von SciTE4AutoIt auch die jeweils aktuelle SciTE-Version installieren. Es gibt jedoch ein Problem, für das ich noch keine Lösung habe.

    Egal welche SciTE-Variante: "SciTEUser.properties" wird immer aus C:\Users\USER\AppData\Local geladen. Egal in welchem Unterordner sich die Datei befindet. Das bedeutet, dass z.B. auch das "normale" SciTE sofort nach seiner Installation auf die im Unterordner ..\AppData\Local\AutoIt v3\SciTE vorhandene SciTEUser.properties zugreift.

    Meine Überlegungen waren jetzt

    1. ein Menü zum Aufruf der jeweiligen SciTE-Variante, beim Start wird die gewünschte SciTEUser.properties aktiviert (durch Umbenennen)

    Nachteil: Aufrufe müssen ausschliesslich über das Menü erfolgen

    2. Überwachung der SciTEUser.properties auf Zugriff (die Datei ist dann eine Leerdatei), Abfragen welches SciTE Zugriff haben will und Weiterleitung zur zugehörigen SciTEUser.properties

    Da fehlt mir momentan aber noch der Ansatz zur Realisierung

    Hat jemand von euch schon mal vergleichbares gemacht?


    P.S.

    Ich habe in meiner VM mal die SciTE4Autoit Version 4.2.0_2019-09-03 installiert. Wenn ich mich recht erinnere, sollte doch in der aktuellen Version durch die Option create.hidden.console=1 das Aufpoppen des CMD-Fensters unterdrückt werden. Funktioniert das bei jemandem? - Bei mir tut sich da nichts.

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™