Progressbar OCX plötzlich unbrauchbar, Subscript used on non-accessible variable

  • Hallo zusammen,

    ich habe ein kleines Problem und zwar wollte ich mir farbige Progressbars ansehen und habe dazu in diesem Forum folgenden Thread entdeckt.

    Script samt Anhang (1er Post) habe ich verwendet, funktionierte auch einwandfrei. (Als einzelnes und auch im Script)

    Doch plötzlich taucht folgende Fehlermeldung auf:
    ColorProgress.au3" (123) : ==> Subscript used on non-accessible variable.:
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not IsObj($ProgressArray^ ERROR

    Im Anhang ist die .ZIP genau so, wie ich Sie heruntergeladen habe.

    Ich habe auch keine passende Lösung für das Problem finden können. =/
    Erst funktionierte es und nun - nicht mehr!

    Vielen Dank im Voraus!

    • Offizieller Beitrag

    Ohne mir das im Detail anzusehen: Die Fehlermeldung sagt dir, dass $ProgressArray kein Array ist (oder gar nicht existiert). Denn der Fehler tritt auf beim Versuch auf ein Index-Element dieser Variablen zuzugreifen. Also setze an dieser Stelle mit der Fehlersuche an. Gehe Schritt für Schritt rückwärts zu der Stelle an der dieses Array erstellt werden soll/muß. Dort geht was daneben.

  • Ohne mir das im Detail anzusehen: Die Fehlermeldung sagt dir, dass $ProgressArray kein Array ist (oder gar nicht existiert). Denn der Fehler tritt auf beim Versuch auf ein Index-Element dieser Variablen zuzugreifen. Also setze an dieser Stelle mit der Fehlersuche an. Gehe Schritt für Schritt rückwärts zu der Stelle an der dieses Array erstellt werden soll/muß. Dort geht was daneben.

    Erst einmal danke für die schnelle Antwort, jedoch finde ich den Ort der ersten Deklaration nicht, hier mal das ganze Script:

    Spoiler anzeigen
    [autoit]

    ; Code by Prog@ndy
    ;Does it need VB-Runtime???
    ;Progressbar OCX from http://www.recursosvisualbasic.com.ar/htm/ocx-compon…r-xp-varios.htm
    ;Paintx.dll from http://www.paintlib.de/paintlib/
    #include <GUIConstants.au3>
    #include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $ocx

    [/autoit] [autoit][/autoit] [autoit]

    Func OnAutoItExit ( )
    _GuiCtrlOCXProgressUnregister($ocx)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    $ocx = _GuiCtrlOCXProgressRegister()

    [/autoit] [autoit][/autoit] [autoit]

    ;$progress = ObjCreate("Proyecto2.XP_ProgressBar")

    [/autoit] [autoit][/autoit] [autoit]

    ;Global Const $WM_LBUTTONDOWN = 0x0201
    ;Const $WM_SYSCOMMAND = 0x112
    ;Global $aNDrive = DriveGetDrive('FIXED'), $aProgress[$aNDrive[0]], $aName[$aNDrive[0]], $msg = 0, $aVol = 0
    Global $GUI = GUICreate('SpaceBar v 2.0', 248, 500, @DesktopWidth - 250, 27, -1, $WS_EX_TOPMOST)
    ;GUICtrlCreateObj($progress,0,0,100,20)

    [/autoit] [autoit][/autoit] [autoit]

    $progar = _GuiCtrlCreateOCXProgress(2,2,200,20)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GuiCtrlOCXProgressShowText($progar)
    _GuiCtrlOCXProgressSetScrolling($progar,9)
    _GuiCtrlOCXProgressSetImage($progar,@ScriptDir & "\Progress.png")
    _GuiCtrlOCXProgressSetColor($progar,0xFF0000)
    _GuiCtrlOCXProgressSetMinMax($progar,0,100)
    _GuiCtrlOCXProgressSetValue($progar,50)
    _GuiCtrlOCXProgressShowOrientation($progar,0)
    _GuiCtrlOCXProgressSetFont($progar,"", _
    10, True, _
    False, True, _
    False, 800)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $progar2 = _GuiCtrlCreateOCXProgress(2,50,50,200)
    $label = GUICtrlCreateLabel("This is a LABEL",2,125,50,75,$SS_CENTER)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor(-1,0x0000FF)
    GUICtrlSetFont(-1,12,700,-1,"Arial")

    [/autoit] [autoit][/autoit] [autoit]

    _GuiCtrlOCXProgressShowText($progar2,0) ;Text verstecken
    _GuiCtrlOCXProgressSetScrolling($progar2,9)
    _GuiCtrlOCXProgressSetImage($progar2,@ScriptDir & "\progress.png")
    _GuiCtrlOCXProgressSetColor($progar2,0xFF0000)
    _GuiCtrlOCXProgressSetMinMax($progar2,0,100)
    _GuiCtrlOCXProgressSetValue($progar2,50)
    _GuiCtrlOCXProgressShowOrientation($progar2,1)
    _GuiCtrlOCXProgressSetFont($progar2,"Courier", _
    10, True, _
    False, True, _
    False, 800)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ;Sleep(1000)
    ;_GuiCtrlDeleteOCXProgress($progar)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 10
    _GuiCtrlOCXProgressSetScrolling($progar,$i)
    _GuiCtrlOCXProgressSetScrolling($progar2,$i)

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 To 100
    _GuiCtrlOCXProgressSetValue($progar,$j)
    _GuiCtrlOCXProgressSetValue($progar2,$j)
    GUICtrlSetStyle($label,-1)
    Sleep(20)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(500)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $msg = -3 Or $msg = -1 Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetFont(ByRef $ProgressArray,$FontName = "", _
    $Size = 0, $Bold = False, _
    $Underline = False, $Italic = False, _
    $Strikethrough = False, $Weight = -1)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    $Tfont = ObjCreate("StdFont")
    If Not IsObj($Tfont) Then Return SetError(2,0,0)
    If Not $FontName = "" Then $Tfont.Name = $FontName
    If Not $Size = 0 Then $Tfont.Size = $Size
    $Tfont.Bold = $Bold ;true/false
    $Tfont.Underline = $Underline ;true/false
    $Tfont.Italic = $Italic ;true/false
    $Tfont.Strikethrough = $Strikethrough ;true/false
    $Tfont.Charset(4576) ;true/false
    If Not $Weight = -1 Then $Tfont.Weight = $Weight ; min: 0 /max: 1000
    $ProgressArray[0].Font = $Tfont
    $Tfont = 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetValue(ByRef $ProgressArray,$value)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not IsNumber($value) Then Return SetError(2,0,0)
    $ProgressArray[0].Value = $value
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetMinMax(ByRef $ProgressArray,$min = -1, $max = -1)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not IsNumber($min) Or Not IsNumber($max) Then Return SetError(2,0,0)
    If $min > -1 Then $ProgressArray[0].min = $min
    If $max > -1 Then $ProgressArray[0].max = $max
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressShowText(ByRef $ProgressArray,$value = True)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not $value = 1 And Not $value = 0 Or IsString($value) Then Return SetError(2,0,0)
    $ProgressArray[0].ShowText = $value
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressShowOrientation(ByRef $ProgressArray,$value = 0)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not $value = 1 And Not $value = 0 Or IsString($value) Then Return SetError(2,0,0)
    $ProgressArray[0].Orientation = $value
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetScrolling(ByRef $ProgressArray,$value)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If $value >= 0 And $value <= 10 Then
    $ProgressArray[0].Scrolling = $value
    Return 1
    EndIf
    Return 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetColor(ByRef $ProgressArray,$value, $RGB = 1)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If $RGB Then
    $hex = Hex($value,6)
    $value = Execute("0x" & StringRight($hex,2) & StringMid($hex,3,2) & StringLeft($hex,2))
    EndIf
    $ProgressArray[0].Color = $value
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressSetImage(ByRef $ProgressArray,$value)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    If Not FileExists($value) Then Return SetError(2,0,0)
    $TPictureLoad = ObjCreate("PaintX.PictureDecoder")
    $ProgressArray[0].Image = $TPictureLoad.LoadPicture($value)
    $TPictureLoad = 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlCreateOCXProgress($x, $y, $width, $height, $Scrolling = 0, $Orientation = 0)
    Dim $ar[2]
    $ar[0] = ObjCreate("Proyecto2.XP_ProgressBar")
    If @error Then Return SetError(1,0,0)
    $ar[0].Scrolling = $scrolling
    $ar[0].Orientation = $Orientation
    $ar[1] = GUICtrlCreateObj($ar[0],$x,$y,$width,$height)
    Return $ar
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressRegister()
    $return = 0
    If RegRead("HKCR\CLSID\{4A5E5E35-91F4-46B1-B62F-78148132EF93}","") = "Proyecto2.XP_ProgressBar" Then

    [/autoit] [autoit][/autoit] [autoit]

    Else
    If Not FileExists(@ScriptDir & "\progressbar-xp.ocx") Then FileInstall("progressbar-xp.ocx",@ScriptDir & "\progressbar-xp.ocx")
    RunWait("regsvr32.exe /s progressbar-xp.ocx",@ScriptDir)
    $return = 1
    EndIf
    If RegRead("HKCR\CLSID\{B69FE5D3-9F53-11D2-B13F-444553540000}","") = "PictureDecoder Class" Then

    [/autoit] [autoit][/autoit] [autoit]

    Else
    If Not FileExists(@ScriptDir & "\paintx.dll") Then FileInstall("paintx.dll",@ScriptDir & "\paintx.dll")
    RunWait("regsvr32.exe /s paintx.dll",@ScriptDir)
    $return += 2
    EndIf
    Return $return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlOCXProgressUnregister($Install)
    If $Install >= 1 Then
    RunWait("regsvr32.exe /s /u progressbar-xp.ocx",@ScriptDir)
    FileDelete(@ScriptDir & "\progressbar-xp.ocx")
    EndIf
    If $Install >= 2 Then
    RunWait("regsvr32.exe /s /u paintx.dll",@ScriptDir)
    FileDelete(@ScriptDir & "\paintx.dll")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlDeleteOCXProgress(ByRef $ProgressArray)
    If Not IsObj($ProgressArray[0]) Then Return SetError(1,0,0)
    GUICtrlDelete($ProgressArray[1])
    $ProgressArray[0] = 0
    Return 1
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Das Array wird erstellt beim generieren der Progressbar, dieser Arrayname existiert nur als Parametername innerhalb der Funktionen - übergeben wird ByRef das Array aus der Rückgabe der Funktion

    _GuiCtrlCreateOCXProgress
    [autoit]

    Func _GuiCtrlCreateOCXProgress($x, $y, $width, $height, $Scrolling = 0, $Orientation = 0)
    Dim $ar[2]
    $ar[0] = ObjCreate("Proyecto2.XP_ProgressBar")
    If @error Then Return SetError(1,0,0)
    $ar[0].Scrolling = $scrolling
    $ar[0].Orientation = $Orientation
    $ar[1] = GUICtrlCreateObj($ar[0],$x,$y,$width,$height)
    Return $ar
    EndFunc

    [/autoit]

    Setze in dieser Funktion mit dem Debuggen an - prüfe jeden Befehl auf Erfolg.

  • Die Zeile:

    [autoit]

    $progar = _GuiCtrlCreateOCXProgress(2,2,200,20)

    [/autoit]


    liefert @error = 1 zurück. D.h. die Funktion hat ein Problem beim erstellen des Objektes
    Also hier:

    [autoit]

    $ar[0] = ObjCreate("Proyecto2.XP_ProgressBar")
    If @error Then Return SetError(1,0,0)

    [/autoit]

    Was hat sich denn verändert seitdem es "plötzlich unbrauchbar" wurde?
    Anderer Rechner? Anderes Betriebssystem? Andere AutoIt Version? Windows Updates?

    Ohne Änderung wird es nicht "plötzlich unbrauchbar"

  • Hallo,

    das hatte ich mir auch gedacht, das Problem trat im Betrieb auf.
    Ich habe nichts geändert, sagen wir mal so um 10:00 Uhr hatte ich das Script soweit fertig und habe mich einem anderen (andere .au3) gewidmet.
    Um 11:00 Uhr brauchte ich die vorangegangene .au3 erneut - jetzt gab es diesen Fehler. Also habe ich sogar die ursprüngliche .au3 (siehe Anhang) verwendet, gleiches Problem.
    Aber erklären kann ich mir das nicht, habe keine andere AutoIT / SCiTE Version oä. benutzt oder Updates durchgeführt.