Что нового

Do Until обновление картинки

VladislavM

Новичок
Сообщения
12
Репутация
0
Пытаюсь разобраться в функциях и наткнулся на непонятное для меня. Программа должна выдавать рандомно картинку каждые 5секунд. При запуске оно выдаёт правильную картинку, а через 5секунд оно выдает мне всегда картинку которая должна была быть до этого. Random при открытие передал 5, оно открыло 5тую картинку. Дальше оно оставляет 5тую картинку, а рандом выдал 7 дальше рандом выдал 9 оно показало 7 картинку 10 показало 9ю 2 показала 10 и так далее. Как исправить и почему так? :thanks:
Код:
Func NEWIMG()
	Do
		$sText = Random(1, 10, 1);
		_WinAPI_SetWindowText($hLabel, getimg($sText))
		_WinAPI_SetWindowText($hLabel2, $sText)
		Sleep(5000)
		NEWIMG()
	Until GUIGetMsg() = -3
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вы точно ту функцию привели? Картинка и _WinAPI_SetWindowText не подходят друг для друга 8)
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
inververs сказал(а):
Вы точно ту функцию привели? Картинка и _WinAPI_SetWindowText не подходят друг для друга 8)
Работает )) getimg возвращает переменную в которой GUICtrlCreatePic, правда сверху на ней еще и рандомное число..
А как по человечески сделать?..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
VladislavM [?]
А как по человечески сделать?
Ну раз вы новичок, то пока не нужно лазить в winapi, все что вам нужно - есть в autoit из коробки. Работа с картинками там тоже имеется. Смотрите примеры к функциям
Код:
GUICtrlCreatePic и GUICtrlSetImage

Так функция GUICtrlCreatePic - создает элемент картинка, картинку можно не указывать - эта функция - одна из построителей gui, который вы можете спроектировать в программе koda, она идет в комплекте.
Функция GUICtrlSetImage - уже применяется когда нужно изменить изображение, так сказать runtime и используется во всяких циклах итп.. Поэтому в процессе работы она предпочтительнее.
И обратите внимание, что вы сперва создаете контрол первой функцией, и задаете изображение второй.
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
inververs сказал(а):
VladislavM [?]
А как по человечески сделать?
Ну раз вы новичок, то пока не нужно лазить в winapi, все что вам нужно - есть в autoit из коробки. Работа с картинками там тоже имеется. Смотрите примеры к функциям
Код:
GUICtrlCreatePic и GUICtrlSetImage

Так функция GUICtrlCreatePic - создает элемент картинка, картинку можно не указывать - эта функция - одна из построителей gui, который вы можете спроектировать в программе koda, она идет в комплекте.
Функция GUICtrlSetImage - уже применяется когда нужно изменить изображение, так сказать runtime и используется во всяких циклах итп.. Поэтому в процессе работы она предпочтительнее.
И обратите внимание, что вы сперва создаете контрол первой функцией, и задаете изображение второй.
:thanks: Можете разъяснить "И обратите внимание, что вы сперва создаете контрол первой функцией, и задаете изображение второй" ? не пойму..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А что именно объяснить? Зачем 2 функции?
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
inververs сказал(а):
А что именно объяснить? Зачем 2 функции?
Первая функция принимает число и оператором switch выбирает картинку возвращая результат.
return $result = GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386);
Вторую вы видели. Сейчас попробую без WinAPI и повторно вызов функции наверное правильнее за Do Until вывести.
switch можно было поместить и в туже функцию, но я подумал что лучше отдельно что бы мне легче было править когда функции будет больше. А стоп, до меня дошло что её не нужно снова вызывать..)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я уточнял, что именно вам не понятно, а не спрашивал у вас зачем вам две функции. 8)
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
inververs сказал(а):
Я уточнял, что именно вам не понятно, а не спрашивал у вас зачем вам две функции. 8)
"И обратите внимание, что вы сперва создаете контрол первой функцией, и задаете изображение второй." Что такое контрол. Кстати то что числа совпадали это мне так просто складывалось, всегда изображение опаздывает.
Код:
Func NEWIMG()
    Do
        $sText = Random(1, 10, 1);
        GUICtrlSetData($hLabel, getimg($sText))
        _WinAPI_SetWindowText($hLabel2, $sText)
        Sleep(5000)
    Until GUIGetMsg() = -3
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
VladislavM [?]
Что такое контрол
Это всякие кнопочки, переключатели, иконки, слайдеры, выпадающие списки. - все то, с чем взаимодействует пользователь. Это все контролы (controls)
Элемент картинка - это тоже контрол.
Функции которые начинаются на GUICtrlCreate как раз предназначены для этого.
Почитайте тут https://autoit-script.ru/autoit3_docs/guiref/GUIRef.htm - база, а то без понимания этого вам дальше не сдвинуться в обучении.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
VladislavM
С Delphi переходим, да? ;)
return $result = GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386);
Подобная конструкция вернёт boolean, т.е. результат сравнения $result с идентификатором созданного элемента (контрола). Если вы хотите получить ID созданного элемента, то нужно делать так
Код:
$result = GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386)
return $result
Или ещё проще
Код:
return GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386)
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
InnI сказал(а):
VladislavM
С Delphi переходим, да? ;)
return $result = GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386);
Подобная конструкция вернёт boolean, т.е. результат сравнения $result с идентификатором созданного элемента (контрола). Если вы хотите получить ID созданного элемента, то нужно делать так
Код:
$result = GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386)
return $result
Или ещё проще
Код:
return GUICtrlCreatePic(@ScriptDir & "/img/1.jpg", 0, 0, 410, 386)
Делаю как в первом варианте, просто для ясноты картины решил дописать return. С языками незнаком, просто решил для саморазвития позаниматься.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
VladislavM
С языками незнаком, просто решил для саморазвития позаниматься.
(шёпотом, дружески похлопывая по плечу)
- Ну, занимайтесь. Не буду вас отвлекать.
(уходит)
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
inververs сказал(а):
VladislavM [?]
Что такое контрол
Это всякие кнопочки, переключатели, иконки, слайдеры, выпадающие списки. - все то, с чем взаимодействует пользователь. Это все контролы (controls)
Элемент картинка - это тоже контрол.
Функции которые начинаются на GUICtrlCreate как раз предназначены для этого.
Почитайте тут - база, а то без понимания этого вам дальше не сдвинуться в обучении.
Я понял, я передаю контрол внутри контрола получается.. или контрол поверх контрола что бессмысленно :-\
Вот так уже лучше, но проблема не решена..
Код:
Func NEWIMG()
    Do
        $sText = Random(1, 10, 1);
        getimg($sText)
        GUICtrlCreateLabel($sText, 10, 420)
        Sleep(5000)
    Until GUIGetMsg() = -3
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
VladislavM

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Автор
V

VladislavM

Новичок
Сообщения
12
Репутация
0
Нашел решение своей проблемы в документации. GUICtrlSetState Изменить состояние элемента.

Так всё идеально работает:
Код:
Func NEWIMG()
    Do
        $sText = Random(1, 10, 1);
        GUICtrlSetState(getimg($sText), $GUI_SHOW)
        GUICtrlCreateLabel($sText, 10, 420)
        Sleep(5000)
    Until GUIGetMsg() = -3
EndFunc
 

Вложения

  • randomimg.au3
    961 байт · Просмотры: 3
Верх