Что нового

GUICtrlSetImage ломается после FileWrite

saraconor

Новичок
Сообщения
416
Репутация
3
Обнаружился странный баг, при чтении \ записи файла, прекращает работать GUICtrlSetImage, меняющий картинки на элементах GUI. причем если путь прямой вроде @ScriptDir, то проблемы не возникает, а любой другой путь приводит к проблеме. Во вложении пример подобного.
Код:
#include <GDIPlus.au3>
#include <GuiConstants.au3>
$N = 0
$Form1 = GUICreate('', 277, 152, -1, -1, BitOR($WS_CLIPCHILDREN, $WS_POPUP), $WS_EX_CONTROLPARENT)
$PicBack1 = GUICtrlCreatePic('', 0, 0, 277, 152)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetImage(-1, 1  & ".bmp", -1)
$B1 = GUICtrlCreateButton('', 24, 24, 172, 47, $BS_BITMAP)
GUICtrlSetImage(-1, 2 & ".bmp", -1)
$B2 = GUICtrlCreateButton('', 24, 81, 172, 47, $BS_BITMAP)
GUICtrlSetImage(-1, 4 & ".bmp", -1)
$F = GUICtrlCreatePic('', 206, 24, 47, 104, $BS_BITMAP)
GUICtrlSetImage(-1, 6 & ".bmp", -1)
GUISetState(@SW_SHOWNOACTIVATE, $Form1)

While 1
$msg = GUIGetMsg()
    Switch $msg
        Case $B1
            GUICtrlSetImage($B1, 3  & ".bmp", -1)
            sleep(200)
            GUICtrlSetImage($B1, 2  & ".bmp", -1)
            sleep(200)
            if not FileExists(@ScriptDir & "\ЭКСПОРТ") then DirCreate(@ScriptDir & "\ЭКСПОРТ")
            $var = FileSaveDialog("Сохранение", @ScriptDir & "\ЭКСПОРТ", "текст (*.txt)", 16, "текст.txt") ;возникает проблема
;~             $var = FileSaveDialog("Сохранение", @ScriptDir, "текст (*.txt)", 16, "текст.txt")    ;работает без проблем
            if not $var = "" then
            if FileExists($var) then FileDelete($var)
            FileWrite($var, "некий текст")
            FileClose($var)
            endif
        Case $B2
            GUICtrlSetImage($B2, 5  & ".bmp", -1)
            sleep(200)
            GUICtrlSetImage($B2, 4  & ".bmp", -1)
            sleep(200)
            exit
    EndSwitch

    if $N = 0 then
    GUICtrlSetImage($F, 7 & ".bmp", -1)
    $N = 1
    Else
    GUICtrlSetImage($F, 6 & ".bmp", -1)
    $N = 0
    endif
    sleep(50)
wend
 

Вложения

  • тест.rar
    73.5 КБ · Просмотры: 3

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Интересно. Проблема в том, что меняется путь работы скрипта. То есть, выбирая другую папку скрипт в макросе @ScriptDir уже указывает эту выбранную папку, хотя сам находится в другом. Чтобы таких казусов не возникало, нужно указывать полный путь к картинкам
я чуть изменил пример, но суть, думаю, понятна
Код:
#include <GDIPlus.au3>
#include <GuiConstants.au3>
#include <WinAPI.au3>
Global $N = 0, $iFlsave = 0
Global $sPathPic = @ScriptDir; путь к картинкам
$Form1 = GUICreate('', 277, 152, -1, -1, BitOR($WS_CLIPCHILDREN, $WS_POPUP), $WS_EX_CONTROLPARENT)
$PicBack1 = GUICtrlCreatePic('', 0, 0, 277, 152)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetImage(-1, $sPathPic & '\' & 1 & ".bmp", -1)
Global $B1 = GUICtrlCreatePic('', 24, 24, 172, 47)
GUICtrlSetImage(-1, $sPathPic & '\' & 2 & ".bmp", -1)
Global $B2 = GUICtrlCreatePic('', 24, 81, 172, 47)
GUICtrlSetImage(-1, $sPathPic & '\' & 4 & ".bmp", -1)
Global $F = GUICtrlCreatePic('', 206, 24, 47, 104)
GUICtrlSetImage(-1, $sPathPic & '\' & 6 & ".bmp", -1)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    If $iFlsave Then
        $iFlsave = 0
        GUICtrlSetImage($B1, $sPathPic & '\' & 3 & ".bmp", -1)
        Sleep(200)
        GUICtrlSetImage($B1, $sPathPic & '\' & 2 & ".bmp", -1)
        Sleep(200)
        If Not FileExists(@ScriptDir & "\ЭКСПОРТ") Then DirCreate(@ScriptDir & "\ЭКСПОРТ")
        $var = FileSaveDialog("Сохранение", @ScriptDir, "текст (*.txt)", 16, "текст.txt") ;работает без проблем
        If Not @error Then
            ConsoleWrite($var)
            If FileExists($var) Then FileDelete($var)
            FileWrite($var, "некий текст")
        EndIf
    EndIf
    If $N = 0 Then
        GUICtrlSetImage($F, $sPathPic & '\' & 7 & ".bmp", -1)
        $N = 1
    Else
        GUICtrlSetImage($F, $sPathPic & '\' & 6 & ".bmp", -1)
        $N = 0
    EndIf
    Sleep(10)
WEnd


Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    Local $ID = _WinAPI_LoWord($iwParam)
    Switch $ID
        Case $B1
            $iFlsave = 1
        Case $B2
            GUICtrlSetImage($B2, $sPathPic & '\' & 5 & ".bmp", -1)
            Sleep(200)
            GUICtrlSetImage($B2, $sPathPic & '\' & 4 & ".bmp", -1)
            Sleep(200)
            Exit
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
Кстати, если в параметре сохранения файла указать не @ScriptDir, а оставить пустую строку, то автоматически будет открыта папка ЭКСПОРТ
Возможно, так удобнее будет))
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Это не баг. В спраке к FileSaveDialog указано
Используйте после её вызова
Код:
FileChangeDir(@ScriptDir)

Или полные пути как предложил joiner
Спасибо) спасли прямо. То как предложил Joiner это полное перелопачивание всего скрипта, а там 1000+ строк.
 
Верх