Набросал ради развлечения небольшой плагин, позволяющий общаться с диалогами любой сложности(но пока урезаные).
Ссылка(ЯДиск, надеюсь можно) : https://yadi.sk/d/D3IjSGTIpPzKS или
Release0000.zip ( 93,47 килобайт )
Кол-во скачиваний: 18325
В архиве сам плагин и файл разметки. Плагин в Плагинс, а разметку рядом с пилотом.
Саму разметку пока не документирую(будет, если время позволит), но там несложно разобрать что к чему. Удаление полей чревато исключением(пока нет проверок). Желательно заполнять все поля, однако некоторые спокойно могут быть пустыми(какие именно, укажу возможно позже).
Небольшое описание :
Каждый параметр заключается в *. Например, так : *par1*.
Параметры ЧУВСТВИТЕЛЬНЫ к регистру. Пробелы на концах обрезаются (для поддержки переменных).
Доступные типы элементов:
Form - само окно
Button - кнопка
Edit - поле ввода
Text - текст
Checkbox - флажок
Сами функции :
GUI.ShowForm (<Имя формы>) //Показывает форму с именем
GUI.HideForm (<Имя формы>) //Скрывает форму с именем
GUI.ActionExist () //получение флага события. Возвращает 0 или 1
GUI.GetAcion () //получение описания события. Вернет массив 1х3 с именами
формы, компонента и описанием события.
GUI.Enable (<Тип элемента> <Имя формы> <Имя элемента> <Статус>) //включает/отключает элемент на форме. Статус принимает 0 или 1.
GUI.GetText (<Тип элемента> <Имя формы> <Имя элемента>) //вернет текст элемента.
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст>) //устанавливает текст элемента
//Скрипт обслуживания оболочки
set linedelay 5
//Очистка начального сообщения(пока так)
set $a GUI.ActionExist ()
set #f 1
set logging clear
//Начинаем
while (#f = 1) //пока не прекратим
set $act_ex GUI.ActionExist () //проверим наличие события
if ($act_ex = 1) //если есть событие
set %action GUI.GetAction () //получаем это событие
//тут обработка событий
if (%action[1 3] = BUTTON_CLICK) //если нажата кнопка(любая)
set logging Произошел клик на кнопке с именем %action[1 2]
end_if
if (%action[1 3] = BUTTON_DBL_CLICK) //если дабл.клик кнопки(любая)
set logging Произошел двойной клик на кнопке с именем %action[1 2]
end_if
if (%action[1 3] = EDIT_CHANGE) //если редактируется поле ввода
set $txt GUI.GetText (*Edit* * %action[1 1] * * %action[1 2] *)
set logging Новый текст поля %action[1 2] : $txt
if ($txt = stop) //если введено стоп
set $a GUI.SetText (*Form* *Main* *Стоп!!!!*) //установка заголовка
set linedelay 50 //побольше задержка перед выходом
set #f 0
end_if
if ($txt = msg) //если введено стоп
msg Введено msg
end_if
end_if
end_if
end_while
exit
end_script
Сделай время для двойного клика побольше, а то иногда сначала срабатывает одинарный.
set %action GUI.GetAction () //получаем событие
if %action [1 2] = Button and %action [1 3] = BUTTON_CLICK
log Сделан клик по первой кнопке
end_if
Время клика задаю не я, а система. Тут возможно с задержками в скрипте надо играть.
-----
Пример писан на коленке, дабы проверить функциональность в целом.
-----
set $a GUI.HideForm (*Main*) //если брать имя окна из примера разметки
--------------------
<Form_1>
<Name>Main</Name> //имя окна, задаваемое в хмл
</Form_1>
Ну тут тогда подходят чекбоксы. выбираешь, что нужно и скрипт проверяет/выполняет. а то чет мудрено с отключением ненужных кнопок. или я не допонял.
а может так?
if %action[1 2] = XP //если нажата кнопка использования XP
//отключаем ее
set #q 1 //флаг использования чего-то там
end_if
if #q = 1
/////
else
////
end_if
Теперь понял про что ты. Пока никак. Сейчас поиграюсь с кликами. Попутно добавлю новые контролы, включая чекбокс.
Апдейт.
-Новые элементы : чекбоксы(Checkbox), текст(Text).
-Функция GetState(). Возвращает состояние элемента(пока поддерживаются только чекбоксы). 1 - галка стоит, 0 - нет.
-Новые сообщения от контролов:
CHECKBOX_CLICK
CHECKBOX_DBL_CLICK
TEXT_CLICK
TEXT_DBL_CLICK
Пример:
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)
if %action [1 3] = Script5
//чем
if %action [1 2] = Button3
Можно систему узнать?именно процессор и ос.
-----------
Возможно, это не тормоз, а анимация установки флажка.
Запустил утром, уже нормально галки ставятся, но опять двойные клики плохо срабатывают.
Win7 x64, i7 2600k
А в чем проблема брать имя чекбокса из GetAction по событию клика? или там у тебя другая система обработки?
Клики еще в работе.
Хорошо. Я уж думал мой косяк.
По поводу чекбоксов : да, удобнее, если отображается 5 букв на чекбоксе, а если больше? + имя это уникальный(в принципе, может быть одинаковым, но тогда система даст сбой) идентификатор любого элемента. И указав его, можно безошибочно сделать все что угодно. Так и зачем возвращать написанное на контроле?
или я опять не понял суть?
Апдейт.
-Пофикшены несрабатывающие события
-Добавлено свойство форм : AlwaysTop. 1 - окно всегда будет сверху других, 0 - обычное поведение.
Test0201.zip ( 97,38 килобайт )
Кол-во скачиваний: 6962
или https://yadi.sk/d/D3IjSGTIpPzKS
Ну и в целом можно коснуться старой, но все еще болезненно актуальной темы контроля статуса: https://forum.uokit.com/index.php?s=&showtopic=19856&view=findpost&p=157513
Переменные пока не выведешь, но вот массивы можно начинать разгр<вырезано анти-матом>.
set %action GUI.GetAction ()
if %action [1 2] = Button2 and %action [1 3] = BUTTON_CLICK
set %action GUI.GetAction ()
if %action [1 3] = Script2 and %action [1 4] = BUTTON_CLICK
Двойной клик по тексту (label) копирует этот текст в буфер. Так и должно быть?
Вроде как нет.
-------
А вроде как бы и да. На ХР такого эффекта не должно быть. Но начиная с висты при двойном клике по тексту он скопируется в буфер. Этот эффект убирается путем отключения двойных кликов.
Есть небольшой костыль.
Я до сегодняшнего дня тоже не знал....инновации..
------
выделяется в поле с возможностью редактирования,а в статическом поле сразу в буфер.
Апдейт.
-Теперь GetAction возвращает 4 элемента:
1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события
-GetState может получить статус чекбокса, обратившись к нему по его же тексту.(по имени так же работает).
Текст указывается во втором параметре.
Test0221.zip ( 97,34 килобайт )
Кол-во скачиваний: 2111
или https://yadi.sk/d/D3IjSGTIpPzKS
----------------------------------
Так, я не помню, клики менял или нет? все так же некорректно отрабатывают?
в целом работает нормально?тормоза,баги?
А к чему несколько то их?один плагин в теории сможет обслуживать сколь угодно окон с любой начинкой.
Я имел ввиду несколько разных плагинов. Например, "Плагин для получения информации об окне" и "Математические операции с плавающей точкой" вместе не работают.
для кнопки:
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить
Странно, я не трогал Enable, но когда тестил он работал. Проверю.
Забыл, регистр имеет значенее, в моем коде ошибка.
Текст и чекбоксы пока не добавил.
если это для едита,то свойство,позволяющее вмещать несколько строк в поле ввода.
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)
могу,ошибаться,но шрифты так и накладываются на контролы.
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)
Можно попробовать 0x13, но скорее всего передаст строку. Тем не менее можно использовать chr(0x13).
Hint aaa\nbbb
set %b [1] chr(13)
set $a GUI.SetText (*Button* *Main* *Button* *aaa%b [1]bbb*)
мульти лайн и мульти текст отключаются тем, что мультилайн(для этида) позволяет вмещать произвольное кол-во строк в поле,а мультитекст(другие элементы) позволяет растянуть текст(если он не помещается в одну строку) на всем элементе.
Копаюсь в прозрачности окон. Если главное окно прозрачное, то все контролы - тоже. Есть идеи как обойти?
С гуями никогда не работал. Хотя вру - делал формочку под скрины, но толку от этого не много.
А если чайлды перебрать и поснимать с них прозрачность? Решение, конечно, хреновое, но если тупик, то может помочь.
Не-а. Прозрачность лепится либо на все окно(родитель), либо эмулируется битмапами с альфа-каналом.
Было два варианта:
1)Делать каждый контрол самостоятельным окном, что очень плохо.
2)Намазывать прозрачные битмапы на контролы
Второй более реальный, но слишком много мороки, т.к. придется для каждого элемента снимать его размеры, создавать битмап.....
а если вспомнить мобидика нашего? оверлеи?
что за мобидик?
а что оверлей?обычное окно же.
кхе... Оверлей сильно не обычное окно. Прорисовывается уже после формирования выходной картинки при конвертации в сигнал. Т.е. оно может быть поверх всех окон не сбивая фокус. При этом оно не является виндовым окном. Ну разве, что костылями каким-то аналогичный прозрачный апи сделан. Оверлей накладывается на какую-либо область либо на какой-нибудь цвет. Подобным образом тот же фрапс выводит фпс в играх. Аналогично работают видео плееры, если отрисовка включена через оверлей(умеют вроде все или почти все). При воспроизведении видео как правило создается черно окно на которое по цвету проецируется картинка в связи с чем возможны некоторые грабли, которые, как раз и могут пригодиться: уведя плеер на второй план и написав в блокноте черным шрифтом "Hello world", ты получишь воспроизведение в пределах этой надписи. Подобным образом либо при использовании областей, можно выводить любую информацию, при этом будет прозрачный фон(ну точнее фона вообще не будет), необходимый текст/изображение. Так же сквозь подобные надписи можно свободно кликать, т.к. это не окна, а не более чем картинка. При необходимости для кликабельности можно на те же координаты помещать полностью прозрачное окно с необходимыми фичами.
Я понял про что ты. Да, это реализуемо вроде на GDI или директе, однако, повлечет за собой переписание всего с нуля, абсолютно всего. Вроде как даже нужно ручками определять куда как и чем произошел инпут с клавы или мыши(могу ошибаться). + рисование контролов тоже руками + продумать еще анимации(как при наведении и тд.). По моему это не жизнеспособный вариант.
как это инпута не может быть?если в директ-приложениях есть возможность использовать мышку и клаву...
Инпута куда? Инпута в оверлей не может быть даже в теории. Инпут в область, где оверлей - возможно. Т.е. по факту, например, инпут в окно бразуера, а мы его перехватываем и обрабатываем. Оверлей не хранится в памяти, не является окном и т.д. Для оси его вообще нет по сути. Его раньше даже вернуть невозможно было(скрином, напрмер, до висты не видел наложенное изображение).
Вот и на кой такие сложности? Плагин позволяет настроить скрипт щелчками по кнопкам, а уж эти исчезающе-прозрачно-информационные оверлеи явно не для обычного плагина.
За час работы скрипта пару раз вылезла ошибка такого вида:
set linedelay 1
set $edit GUI.GetText (*Edit* *Main2* *edit*)
:start
if #timeRess1cd < timer1 and #timeRess1 > 0
set #timeRess1 #timeRess1 - 1
set $ress1cd GUI.SetText (*Text* *Main2* *label* * #timeRess1 *) //обновляется время(число после кнопки Ress1)
set #timeRess1cd timer1 + 1000
end_if
if #timeRess2cd < timer2 and #timeRess2 > 0
set #timeRess2 #timeRess2 - 1
set $ress2cd GUI.SetText (*Text* *Main2* *label2* * #timeRess2 *) //обновляется время(число после кнопки Ress2)
set #timeRess2cd timer2 + 1000
end_if
if #timeRess3cd < timer3 and #timeRess3 > 0
set #timeRess3 #timeRess3 - 1
set $ress3cd GUI.SetText (*Text* *Main2* *label3* * #timeRess3 *) //обновляется время(число после кнопки Ress3)
set #timeRess3cd timer3 + 1000
end_if
wait 2
set #a GUI.ActionExist ()
if #a = 1
wait 2
set %a GUI.GetAction ()
if %a [1 4] = EDIT_CHANGE //если редактируется Edit
set $edit GUI.GetText (*Edit* *%a [1 1]* *%a [1 2]*)
end_if
if %a [1 3] = Ress1 and %a [1 4] = BUTTON_CLICK //если сделан клик по кнопке Ress1
set workwindow %handle [1 1]
send f1
set #timeRess1 $edit //присваиваем число из edit
end_if
if %a [1 3] = Ress2 and %a [1 4] = BUTTON_CLICK //если сделан клик по кнопке Ress2
set workwindow %handle [2 1]
send f1
set #timeRess2 $edit //присваиваем число из edit
end_if
if %a [1 3] = Ress3 and %a [1 4] = BUTTON_CLICK //если сделан клик по кнопке Ress3
set workwindow %handle [3 1]
send f1
set #timeRess3 $edit //присваиваем число из edit
end_if
end_if
goto start
прикрепи пожалуйста xml.
----------
А если задержку побольше выставить?
Потестил. Гонял ровно час, баг не воспроизводится. Во время работы менял едит. Все корректно. Возможно задержка. Если еще будет проявляться - пиши, буду глубже смотреть.
Тоже проверял сейчас, причём задержку в 0 поставил, проблем пока нет. Погоняю до вечера, если что-то будет напишу.
А вообще спасибо за плагин, классная вещь.
Скорее всего из-за маленьких задержек были ошибки. При linedelay 0, пару раз была эта же ошибка когда быстро и много раз кликал по кнопкам. Хотя иногда как ни старайся ошибки нет. Врят ли кто-то будет такой ерундой заниматься Было ещё это:
Поставил задержку (точнее таймер на 100мс) перед GUI.ActionExist () пока не было ошибок. Как будет время проверю ещё.
И ещё, если в пустой скрипт написать:
set %a GUI.GetAction ()
вот этот второй скрипт работает вместе с основным?или отдельно?
100мс слишком,думаю тут до 20мс вполне нормально будет.
и какую ошибку бьет? что на скрине?
чет я даже не знаю на че думать.....помнится дарк обмолвился, что плагины как-то с вкладками связаны.
-----
А если в этом скрипте перед GetAction вызвать pluginload?
Хотя тут что-то другое. Возможно связанное с потоками. Да, скорее всего так и есть.
Пока можно решить проблему таймером. Врят ли кто-то умеет кликать больше 10 раз в секунду. На меньших задержках не тестил.
set #time 100
:start
if #time < timer
set #time timer + 100
set %a GUI.GetAction ()
end_if
goto start
На счёт этой ошибки: https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219482
Вчера тестил скрипт, кликал на кнопки пилотом, работало часа 2 без проблем, причём задержка была 0. Потом запустил 2 окна lineage2, еще где-то час работало без проблем, как только запустил третье окно l2 вылезла эта ошибка. Стал пробовать запускать и выгружать окна во время работы скрипта, ошибок не было никаких. Решил что совпадение.
Сегодня было запущено 2 окна l2, часа 1,5 никаких проблем, но уже с задержкой 100 мс, как только запустил третье окно l2 та же ошибка вылезла.
Как связан запуск приложения с работой плагина не знаю, но когда я только написал про эту ошибку первый раз, то никакие окна не загружались.
Чудеса. Плагин никак не связан с линейкой. Абсолютно. Более того, он не связан вообще с другими окнами системы. Что может мешать работе - не знаю. Лично у себя такого не наблюдаю. Может и причуды винды, а может и моя криворукость.
самый простой способ проверить:
1 функция - записывает строку с параметром
2 функция - возвращает эту строку
вызови их из разных вкладок.
Когда происходит событие(от 1 скрипта), плагин запоминает имя окна, от которого произошло событие, этот же скрипт получает описание события(внутренняя структура плагина о событии очищается), и в это же время, скрипт 2 тоже получает событие,(и вот тут он обращается к пустой структуре события, т.к скрипт забрал пред. события, а новое еще не обработалось).
вот кажется и возможная проблема. поэтому иногда задержка и прокатывает. однако теперь не ясно при чем тут окна другие.
элементарно. больше окон - больше нагрузка на камень, больше необходимые задержки. Как только количество окон достигает того количества, которое может загрузить все ядра, то мы получаем резкий скачек необходимых задержек.
Да, но это сколько окон нужно?
+ плагин обрабатывает события методом он-евент, а не циклом, что как бы дает маленькую нагрузку.
А запись и чтение одновременно не происходят случаем? Чтение оно вроде как безопасно, но учитывая, что там должны быть структуры, то может получиться ситуация когда считывается половина старой и половина новой. Результат поведения после этого не ясен.
В плагине?структура(это я так обозвал) на самом деле просто несколько отдельных переменных. Может, о чем я и говорил, первый скрипт очищает эти переменные, очистил часть, а тут второй скрипт обращается либо к пустым данным, либо к данным, которые косвенно связаны с уже пустыми переменными.
очередь надо, чтобы исключить подобные варианты.
Эт понятно. Каким методом? читал про мьютексы, но они вроде только для кодовых потоков. Флаг какой-нибудь завести и таймер на него повесить?
А там не все так просто. Можно еще натворить взаимную блокировку процессов и будет рыба. Смысл будет тот же самый - считан флаг, что свободно, а оно уже начало заниматься, но не успело. Полноценную многопоточку с очередью в таком ключе никогда не реализовывал на практиктике. Если надо добавить данные в очередь в другом потоке, который эту очередь постепенно очищает, то я представляю, как это сделать, а в данном случае - не очень. Ну или наоборот раздать на n потоков одну очередь. Мне кажется надо думать над созданием некоторого списка в котором будут хранится таски на основе номера вкладки или TID процесса. Далее эти таски будет собирать некоторый коллектор, после сбора удалять. Лучше использовать именно список, а не массив - проблем меньше будет с изменением размера, добавлением/удалением.
Грубо говоря что-то вроде https://forum.uokit.com/index.php?s=&showtopic=28316&view=findpost&p=209321
но уже в контексте нормального языка и некоторых ограничений из-за отсутствия прямого доступа к переменным скрипта, в виде списка и, скорее всего, идентификаторы завязывать на TID, а поток не закрывать пока таск не будет в очередь помещен.
В бусте что-то готовое есть для этого дела кстати. Там есть и очередь на n потоков и n потоков на одну очередь.
Сильно загнул).
-------------------
По поводу перекосов с флагом. Да, такое может быть, только думаю не дойдет до этого, ибо 1 байт обработать очень быстрое дело, не то, что сейчас, считывание/запись структуры.
Посмотри буст там есть готовое решение. Я с полгода назад ковырял многопоточку, неоднократно натыкался. У меня задача была несколько иная и подключение бустовских либ мне показалось слишком громоздким - там обошлось все проще.
Апдейт.
-Пофикшены клики. Теперь одиночный клик не лезет перед двойным.
Обработка одиночного клика идет с небольшой задержкой, так и должно быть.
Test0231.zip ( 97,2 килобайт )
Кол-во скачиваний: 447
или https://yadi.sk/d/D3IjSGTIpPzKS
-------------------------
На подходе изменение цвета элементов.
Предлагаешь мне буст переписать?)
плагин то на делфи)
---------
хотя,вроде он понимает obj.
А зачем тогда выспрашивал столько времени, как завести на с++, а потом сел на делфю?) Вообще и буст можно переписать конечно) Я вообще образец плагина переписывал с делфи на с++ не зная ни первого ни второго.
так с++ так, больше для развлечения,я в нем не уверенно себя чувствую. а плагин изначально на делфи был.
кстати ты меня заставил задуматься... буст это по сути дела либа... Может прилинковать и получится. Точнее даже не так. Может трудозатраты линковки окупят результат
текст элемента там должен быть?
----
вроде пофиксил, в следующий апдейт войдет.
Апдейт.
-Теперь Enable может принимать вместо имени элемента его текст.
-Добавлена возможность изменить цвет фона, текста.
set $a GUI.SetTextColor (<тип элемента> <форма> <имя элемента> <канал R> <канал G> <канал B>) //цвет текста
set $a GUI.SetBckgColor (<тип элемента> <форма> <имя элемента> <канал R> <канал G> <канал B>) //цвет фона
имхо - уходить от манифеста. Если привязывать часть интерфейса к теме винды, то может получиться тихий ужас...
в том то и дело,когда думал о манифесте не знал о таких граблях,думал все единообразно...но нет,это виндоуз.
В описание плагина надо дописать что нужно для его работы, чтоб не возникало лишних вопросов, почему это:
редисты установить надо. Можно взять из моей темы с антигейтом.
Вообще, удивлен, что программа, собранная на делфи требует редист. В первые вообще слышу об это. Может другой плагин требует?
скрин можно?
Cockney, а ты в плагине дллки никакие не подключал?
лично я - нет, сама дельфи , в теории может.
есть предположение одно...
Все, увидел. Не знаю как такое могло выдать.
После установки требуемой либы что-то еще просил?
тот баг повторялся?
всем привет, помогите сделать мини клиент для браузерной игры... скрипты все есть, только сам клиент надо сделать, всего пару кнопок... оплачу тем кто поможет!!! скайп mircha56 аька 324376342)
Cockney, собери в кучу первый пост. А то скоро болезнь пилота будет: хелпа норм нет, но есть история развития. Так же сейчас несколько не ясно какая версия последняя, которая релиз или которые имеют бОльший номер версии. Создается впечатление, что бОльшие версии были бетами, а релиз был выпущен под номером 0000.
Error loading plugin: GUI.dll. Call 'InitPlugin' failed.
0.2.3.1
0.3.4.1
Старые версии вообще не актуальны. Можно оставить только https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219832
Странно. Только что скачал, работает.
Дернул, даже в папку отдельную положил копию пилота, с нуля запустил. Не хочет.
Все понял, учту и сделаю.
По поводу ошибки - скорее всего, версия GUI.xml старая, это серьезная недоработка с моей стороны в плане оформления(казалось, что тот, кто пользуется будет только плагин заменять, а xml изредка), в будущем к каждой бетке и релизу буду прикладывать актуальный для текущей версии xml.
По поводу нумерации версий, да, пока самая актуальная версия, это та, которая имеет наибольший номер, пусть и с припиской "тест".
Релиз в моем понимании, это когда получается стабильная сборка. Пока же у меня такие еще не получались. Как получится, соответственно оформлю.
И справка тоже планируется.
С запуском то что делать?
xml взят https://forum.uokit.com/index.php?showtopic=29457&st=100&p=219832&#entry219832?
да.
Не знаю. Тоже завел новую папку, скачал и все встало как должно быть.
Вин какой?
вин7 x64.
Количество функций совпадает с объявленным?
Да. Да и не может быть в этом ошибки. Пилот получает адрес функции непосредственно перед ее вызовом.
чтение начальных данных из xml и создание контролов по этим данным.
у меня тоже 7 х64 и проблем нет.
можешь в качестве теста оставить только заглушки и непосредственно заполнение структуры?
т.е. вырезать весь код из инитплагин и оставить в нем только заполнение initstruct?
такое могу. через час-два в лс сброшу.
Ну да. Чтобы понять в чем именно проблема. В системном куске который должен вернуться в пилот или непосредственно в манипуляциях отвлеченных от пилота.
Так и не понял, как в личку прибить файл, поэтому тут прикреплю
-----------
Хех, забавно, вырезал весь функционирующий код и у меня появилась ошибка вызова инитплагин.
GUI.zip ( 52,41 килобайт )
Кол-во скачиваний: 322
Все функции, передаваемые в пилот, доступны к экспорту. Я не знаю нормального объяснения причины.
А с кодом работает.
Можешь дать функцию и объявление структуры? Можно в личку. Сяду и буду с примером сравнивать... Делфи я не знаю, но пример на с++ был написан именно с расшифровки дельфийского) Было бы все тоже самое - работало бы.
Ок
функцию без хмл кода.
Походу поздно)
Ну я как раз зашел еще раз написать про хмл после увиденного))
Так а все, вся функция и есть чтение хмл, ну не считая пары строк, которые я указал.
Я только не пойму, че не так. У меня работает, к цируса(или цайрус, как там) тоже. Только у тебя...
Дык если не работает в виде пары строк, то эти пару строк и надо смотреть. Смысл ковырять хмл, если проблемы возникают без него?
Как я могу понять, что проблема именно в них? Я лишь предположил. Сейчас соберу сборку без тех строк.
Ну дык если есть шапка без полезного когда, которая должна просто инициализироваться, но она сыпет ошибку, то очевидно, что проблема в шапке, а не в полезном коде.
GUI.zip ( 99,66 килобайт )
Кол-во скачиваний: 335
Без тех строк.
закинул 0.3.4.1 на чужой комп вин7 64 - та же самая проблема.
Дурдом. Я не знаю, честно. И повторить не получается.
в обрезке же получилось.
Ну, судя по обрезку, получается проблема в пилоте, что сомнительно.
Учитывая, что плагины на плюсах гарантированно работают и есть образец плагина который тоже должен работать(как минимум работал), то это никак не пилот. В конце концов эта функция должна вернуть просто набор байтов в определенном порядке. В этом плане для отладки артмани хорошо помогает Посмотри в хексе, что там идет. Структура то примитивная.
Так,если бы что-то не шло - не работало бы вообще. Полнофункциональная версия работает у меня без проблем(и не только у меня,на виндах начиная с хр).Т.е. по идее, код то не виноват. Обрезаная выбивает ошибку,хотя видимых причин нет. Вот и думай, что тут искать. Компилятор сменить если...
еще тесты:
почти чистая виртуалка вин7 32 - ошибка.
засраная вин7 64 - запустилась.
Клянчу копию виртуалки тебе в доступ, чтобы воспроизвести смог.
как можно компенсировать кривые указатели?этож абсурд. Полный плагин работает,а пустая шапка нет. в моем случае. а в твоем...
да,4
про некорректный \0. по дефолту этот символ ты не обязан писать нигде. система сама вставит где нужно. в дельфовых строках она ставит его в конец.
изменил свой пост,был не внимателен.
следовательно,если я не ставлю 0 в начало,а я и не ставлю,то все должно быть корректно.
Виртуалку выдать?
Результат или что?
Виртуалку, где будет еррор воспроизводится. Человек домой минут через 40 придет и сможет дать виртуалку на которой сможешь воспроизвести проблему.
Так а на кой мне? Никаких полезных данных я не получу.
Ладно, пошел отдыхать. Завтра еще поломаю голову.
Ну смотри. Было бы где тестить.
Проверил на втором компе, плагин работает. На обоих стоит Win7 x64. Пилот 2.36.1.
По моему я схожу с ума....
Сегодня имел :
3 ноутбука с виндами 8,8.1,10 соответственно.
1 мак с виртуалкой вин хр
стационар с вин 7 32х
еще один стационар с вин 7 64х
на каждом пересобрал плагин, начиная с пустой шапки и заканчивая полным функционалом. Добавлял все построчно. Абсолютно на всех и абсолютно все сборки работали. Просто запускались и без проблем. И да, сборка с шапкой фейлилась потому что я там выделение памяти под инитструкт затер.
вот поэтому я и предлагал выделить тебе виртуалку, где ошибка воспроизводилась бы.
ты серьезно? ну не может же так быть ,что на стольких машинах работает, а на других нет?это как так?
Ты думаешь, что я тебе вру что ли? В числе тестеров был zavas, если еще помнишь такого. Его виртуалку тебе и предлагали. Еще из вариантов - обновления винды, но тут очень сложно будет вычислить проблемный патч (имхо проще понять на что ругается и переписать).
Нет, не думаю) просто реально на издевку похоже. Дальнейшую беседу предлагаю перенести в лс, дабы не захламлять уж в конец тему.
Работа не заброшена) давит учеба. Скоро продолжу работу.
это гут
С запуском плагина решился вопрос?
Да. Мой косяк) В свою оправдание могу лишь сказать, что очень много факторов провоцировало на то, чтобы закинуть хмл в папку с плагинами...
Ну, первый, наверно, не лагающий релиз.
-Повысил стабильность работы раз в 40. Теперь плагин как и пилот, в теории, не валятся от неаккуратных действий.
-Добавил параметры в блок <SysInfo>в GUI.xml : <SafeMode>, <Warning>.
<SafeMode> - при отсутствии какого либо параметра или неправильного значения в нем автоматически применяет значение по дефолту.
Если установлено 1, то фича работает, 0 - будет выбивать ошибку при некорректном параметре, при этом прерывая обработку некоторых блоков полностью.
<Warnings> - работает только в сочетании с SafeMode = 1. Выводит предупреждения, о неправильных параметрах.
Перемудрил тут походу.
-Теперь функции при ошибке будут возвращать отрицательные значения. Расшифровка будет скоро.
-Поправил места потенциальных багов, в том числе связанных с возвращаемым результатом от GetAction.
Постарался оформить нормально. Если что не так - напишите.
---------------
В скором времени приведу в порядок описание и справку нормальную(надеюсь) прибью.
Release0341.zip ( 111,12 килобайт )
Кол-во скачиваний: 427
или https://yadi.sk/d/0wITwKnbqXjGc.
В связи с новой возможностью группировки функций по категориям появилась идея продублировать для каждого элемента все функции, тобиш вместо SetText будет SetButtonText и т.д. Основные плюсы :
1)Все функции элемента в отдельной вкладке.
2)Отпадет нужда указывать тип элемента в параметрах.
3)Специфичные функции для некоторых элементов будут во вкладке этого элемента.
Ну и минусы :
Полная или частичная потеря совместимости со старыми скриптами. Первый вариант - все функции будут переделаны под новый вид, и работать и экспортироваться будут во всех версиях одинаково. Второй вариант - экспортировать разные версии функций для разных пилотов, но это слишком накладно в плане дублирования кода и лишней путаницы. Да и новые функции под старый формат не охота переделывать.
Кто что думает?
Думаю, пока слишком не поздно перейти на новый формат.
Не вижу проблем для перехода.
Текущую версию плагина оставить без изменений. Те кто пользуются им сейчас,а таких немного судя по скачиваниям и дальше смогут его использовать, чтобы не переписывать скрипты. Пусть и без новых функций.
Новые версии плагина делать по-новому.
Скорее всего будем переписываться с нуля.
Причины? Переосмысление?
Ага, перфекционист во мне сидит. Да и костылей много. Охота все как надо сделать, а не через...
Ребят, подскажите чо как делать, я даже пример не могу заставить работать, может что не так делаю, пошагово дайте инструкцию как например сделать чтобы по нажатию на кнопку выполнялся "alarm" а дальше я как нить разберусь
Если архив взят отсюда https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=220793, то:
set %a GUI.GetAction ()
if %a [1 3] = Старт and %a [1 4] = BUTTON_CLICK // если сделан один клик по кнопке Старт
alarm
end_if
wait 100
set %a GUI.GetAction ()
if %a [1 3] = Старт and %a [1 4] = BUTTON_CLICK // если сделан один клик по кнопке Старт
alarm
end_if
wait 100
<Name>Button</Name>
<Caption>Старт</Caption>
1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события
BUTTON_CLICK - Клик по кнопке
BUTTON_DBL_CLICK - Двойной клик по кнопке
TEXT_CLICK - Клик по тексту
EDIT_CHANGE - Если редактируется поле ввода
<Name>Button</Name>
<Caption>Старт</Caption>
1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события
BUTTON_CLICK - Клик по кнопке
BUTTON_DBL_CLICK - Двойной клик по кнопке
TEXT_CLICK - Клик по тексту
EDIT_CHANGE - Если редактируется поле ввода
Можно просто получить текст из обоих edit.
set $a GUI.GetText (*Edit* *Main* *edit*) // присвоить переменной текст из edit
set $b GUI.GetText (*Edit* *Main* *edit2*) // присвоить переменной текст из edit2
hint $a $b
wait 100
А как к примеру при клики по одной кнопке, изменить visible = другой
set %a GUI.GetAction ()
if %a [1 3] = Старт and %a [1 4] = BUTTON_CLICK // если сделан один клик по кнопке Старт
set $a GUI.Enable (*Button* *Main* *Button2* *0*) // 0 - выключить, 1 - включить
end_if
wait 100
Спасибо!
Пытался по этому же принципу скрыть кнопку не получилось...
set %a GUI.GetAction ()
if %a [1 3] = Старт and %a [1 4] = BUTTON_CLICK // если сделан один клик по кнопке Старт
set $a GUI.Visible (*Button* *Main* *Button2* *0*) // 0 - выключить, 1 - включить
end_if
То есть, кликнув по одной кнопки, изменить свойство Visible у другой кнопки нет возможности?
В данный момент нет. Разве что Cockney допишет такую команду.
Не допишу. Пока закрыл развитие плагина, ибо нет подходящих инструментов для рисования гуи из под длл. Найду - продолжу работу. Исходники могу выложить в паблик, если кто-то осмелится поддерживать их, но код уж больно ужасен.
У меня еще вопрос как проверять чексбокс, стоит ли галочка?
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)
set $a GUI.GetState (*Main* *chk*) // chk - это имя чекбокса в xml
log $a
// или
set $a GUI.GetState (*Main* *Останавливать при ошибке*) // тут указано имя чекбокса на форме
log $a
End_script
В итоге я нашёл способ снимать галки, костылём конечно, но мне подходит.
exec UoPilotStart.bat
exit
Можно и кликом left поставить галку.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)