Что нового

Переменная используется без объявления

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
Всем привет.
столкнулся с непонятным багом.
AutoIT 3.3.16.1
небольшая функция
Код:
Func _ExtractFiles($aNameExt, $sPathExt, $aArrayFiles, $sPathExe)
    Local $hFileCreateST = FileOpen($sPathExe, 16)
    If $hFileCreateST = -1 Then Return SetError - 25
    Local $bReadFile, $hOfileRes, $nAllSizeFiles = 0
    For $r = 0 To UBound($aNameExt) - 1
        For $i = UBound($aArrayFiles) - 1 To 0 Step -1
            $nAllSizeFiles += $aArrayFiles[$i][1]
            If $aArrayFiles[$i][0] = $aNameExt[$r] Then
                FileSetPos($hFileCreateST, -$nAllSizeFiles, 2)
                $bReadFile = FileRead($hFileCreateST, $aArrayFiles[$i][1])
                $hOfileRes = FileOpen($sPathExt & '\' & $aArrayFiles[$i][0], 26)
                FileWrite($hOfileRes, $bReadFile)
                FileClose($hOfileRes)
                ExitLoop
            EndIf
        Next
        $nAllSizeFiles = 0
    Next
    FileClose($hFileCreateST)
EndFunc   ;==>_ExtractFiles

в коде в общей сложности 5000 строк. В код включены все нужные функции из установочных udf. Так как он должен компилироваться на компе пользователя без установленного autoit.
все работает ок.
добавляю _Timer_SetTimer
эта функция регистрирует _GDIPlus_StripProgressbar, пользовательская функция с официального форума.
При работе кода вылетает ошибка, что в строке $nAllSizeFiles += $aArrayFiles[$i][1] используется необъявленная переменная. Но она объявлена как локальная.
Потом хаотично стала появляться ошибка, что переменная не объявлена, и в других строках кода. При этом, сам код начинает работать криво.
Хотя, я всегда использую опцию
Код:
Opt("MustDeclareVars", 1)

Есть эта опция или нет, ошибка все равно появляется.
Убираю из кода _Timer_SetTimer. Ошибок нет, код после компиляции работает ровно так, как нужно
Такое впечатление, что интерпретатор сходит с ума))
до этого использовал строку вызова
Код:
GUIRegisterMsg($WM_TIMER, "PlayAnim")
DllCall("user32.dll", "int", "SetTimer", "hwnd", $WOTP, "int", 0, "int", 30, "int", 0)

Подобная ошибка не появлялась, однако у некоторых пользователей, у меньшинства, программа подвисала на этом моменте.
В общем, без _Timer_SetTimer и строк выше, все работает ок. Причем, у всех
Кто сталкивался с таким?
 

Prog

Продвинутый
Сообщения
617
Репутация
80
Если проблема с таймером то копайте в эту сторону. Покажите код объявления функции используемого в _Timer_SetTimer.
Может там ошибка.
Декларация функции соответствует TIMERPROC?
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
два способа применения в моем коде.

Код:
$iTimerProgress = _Timer_SetTimer($WOTP, 30, 'PlayAnim')

;~ Or

GUIRegisterMsg($WM_TIMER, "PlayAnim")
DllCall("user32.dll", "int", "SetTimer", "hwnd", $WOTP, "int", 0, "int", 30, "int", 0)


Func PlayAnim()
    $hHBmp_BG = _GDIPlus_StripProgressbar($iPercData, $WPerc, $HPerc, $iVisPerc, $BgColorGui, $FgBGColor, $BGColor, $TextBGColor, $sFontProgress)
    Local $hB = GUICtrlSendMsg($iPercId, 0x0172, 0, $hHBmp_BG)
    If $hB Then _WinAPI_DeleteObject($hB)
    _WinAPI_DeleteObject($hHBmp_BG)
EndFunc   ;==>PlayAnim

Func _GDIPlus_StripProgressbar($fPerc, $iW, $iH, $iVisP = 1, $iBgColorGui = 0x000000, $iFgColor = 0x808080, $iBGColor = 0x0000FF, $iTextColor = 0xFFFFFF, $sFont = 'Arial Black')
    Local $sPerc = Ceiling($fPerc)
    If $sPerc < 0 Then $sPerc = 0
    If $sPerc > 100 Then $sPerc = 100
    _GDIPlus_Startup()
    Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetPixelOffsetMode($hCtxt, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    _GDIPlus_GraphicsClear($hCtxt, 0xFF000000 + $iBgColorGui)
    Local $iWidth = $iH * 2, $iLen = $iWidth / 2, $iY
    Local $hBmp = _GDIPlus_BitmapCreateFromScan0($iWidth, $iH)
    Local Const $hCtxt_Bmp = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetPixelOffsetMode($hCtxt_Bmp, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    Local $hPen = _GDIPlus_PenCreate(0xFF0000000 + $iFgColor), $iPenSize = Int($iH / 12)
    Local $hPen2 = _GDIPlus_PenCreate(0x50000000, $iPenSize)
    _GDIPlus_GraphicsClear($hCtxt_Bmp, 0xFF000000 + $iBGColor)
    Local Static $iX = 0
    For $iY = 0 To $iH - 1
        _GDIPlus_GraphicsDrawLine($hCtxt_Bmp, -$iX + $iY, $iY, -$iX + $iY + $iLen, $iY, $hPen)
        _GDIPlus_GraphicsDrawLine($hCtxt_Bmp, -$iX + $iY + 2 * $iLen, $iY, -$iX + $iY + 3 * $iLen, $iY, $hPen)
    Next
    Local $tPoint1 = DllStructCreate('float;float')
    Local $tPoint2 = DllStructCreate('float;float')
    DllStructSetData($tPoint1, 1, $iW / 2) ;x1
    DllStructSetData($tPoint2, 1, $iW / 2) ;x2
    _GDIPlus_GraphicsDrawLine($hCtxt_Bmp, 0, 0, $iWidth, 0, $hPen2)
    $iX = Mod($iX + 2, $iWidth)
    Local $hTextureBrush = _GDIPlus_TextureCreate($hBmp)
    _GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $sPerc / 100 * $iW, $iH, $hTextureBrush)
    If $iVisP Then
        _GDIPlus_GraphicsSetTextRenderingHint($hCtxt, 5)
        Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iTextColor)
        Local $hFormat = _GDIPlus_StringFormatCreate()
        Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
        Local $hFont = _GDIPlus_FontCreate($hFamily, $iH * 2.5 / 5, 2)
        Local $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        _GDIPlus_StringFormatSetAlign($hFormat, 1)
        _GDIPlus_GraphicsDrawStringEx($hCtxt, $sPerc & '%', $hFont, $tLayout, $hFormat, $hBrush)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
    EndIf
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_GraphicsDispose($hCtxt_Bmp)
    _GDIPlus_BitmapDispose($hBmp)
    _GDIPlus_BrushDispose($hTextureBrush)
    Local $hHBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Return $hHBITMAP
EndFunc   ;==>_GDIPlus_StripProgressbar
 

Prog

Продвинутый
Сообщения
617
Репутация
80
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
хорошо. но первоначально у меня был второй вариант
Код:
GUIRegisterMsg($WM_TIMER, "PlayAnim")
DllCall("user32.dll", "int", "SetTimer", "hwnd", $WOTP, "int", 0, "int", 30, "int", 0)

он вызывал зависание, либо очень медленную работу скрипта. при этом иногда вываливалась ошибка кода. редко, но было. и далеко не у всех
в данном случае не нужны параметры?
функция playAnim взята из примера в библиотеке по анимированному прогрессбару. я лишь укоротил ее. она была изначально без параметров
 

Prog

Продвинутый
Сообщения
617
Репутация
80
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
Баг серьезный. Ибо интерпретатор начинает сходить с ума и не узнавать переменные. ))
Теперь вызываю анимацию через AdlibRegister. Проблемы ушли
Prog, спасибо за участие в обсуждении.
 
Верх