Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ Плагин графического интерфейса

Автор: Cockney 24.2.2016, 11:49

Набросал ради развлечения небольшой плагин, позволяющий общаться с диалогами любой сложности(но пока урезаные).

Ссылка(ЯДиск, надеюсь можно) : https://yadi.sk/d/D3IjSGTIpPzKS или Прикрепленный файл  Release0000.zip ( 93,47 килобайт ) Кол-во скачиваний: 18071


В архиве сам плагин и файл разметки. Плагин в Плагинс, а разметку рядом с пилотом.

Саму разметку пока не документирую(будет, если время позволит), но там несложно разобрать что к чему. Удаление полей чревато исключением(пока нет проверок). Желательно заполнять все поля, однако некоторые спокойно могут быть пустыми(какие именно, укажу возможно позже).

Небольшое описание :

Каждый параметр заключается в *. Например, так : *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


Тестировано на XP,7,8,8.1

Вроде все работает, однако могут быть проблемы.


Если понравилось, предлагайте идеи. Может что-то годное и выйдет.
-------------------------------------------------------------
Архив версий:

https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219168
https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219189
https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219281
https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219674
https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219832

Автор: cirus 24.2.2016, 14:22

Сделай время для двойного клика побольше, а то иногда сначала срабатывает одинарный.

Цитата
И небольшой скрипт управления :

Что-то мне кажется большинство не поймут что с этим делать.
Примеры лучше попроще делать.
Код
set %action GUI.GetAction () //получаем событие
if %action [1 2] = Button and %action [1 3] = BUTTON_CLICK
    log Сделан клик по первой кнопке
end_if

Цитата
GUI.HideForm (<Имя формы>) //Скрывает форму с именем

Напиши пример, а то что-то не понял как это работает.

Можно ли сделать чтобы кнопка была в статусе зажата/отжата?

Автор: Cockney 24.2.2016, 14:31

Время клика задаю не я, а система. Тут возможно с задержками в скрипте надо играть.
-----
Пример писан на коленке, дабы проверить функциональность в целом.
-----

Код
set $a GUI.HideForm (*Main*) //если брать имя окна из примера разметки
--------------------
<Form_1>
    <Name>Main</Name> //имя окна, задаваемое в хмл
</Form_1>

-----
Пока не представляю, зачем нужна зажатая программно кнопка, но, думаю это вполне можно реализовать технически..

С кликами ,возможно, что-то решу. Но это даже не знаю когда возьмусь.

Автор: cirus 24.2.2016, 15:07

Цитата
Пока не представляю, зачем нужна зажатая программно кнопка

Например в игре юзаются банки HP, MP и прочее. Иногда не надо использовать все. Сейчас чтобы отключить не нужные надо переключаться на пилот, останавливать скрипт и ставить // перед gosub, чтобы не было перехода к метке с какой-то банкой. А при зажатой/отжатой кнопке можно указывать к какой метке переходить, а какой нет. Сразу видно используется какой-то блок кода или нет.

Автор: Cockney 24.2.2016, 15:35

Ну тут тогда подходят чекбоксы. выбираешь, что нужно и скрипт проверяет/выполняет. а то чет мудрено с отключением ненужных кнопок. или я не допонял.

а может так?

Код
if %action[1 2] = XP //если нажата кнопка использования XP
    //отключаем ее
   set #q 1 //флаг использования чего-то там
end_if


а в рабочем блоке :

Код
if #q = 1
/////
else
////
end_if


или другое?

Кстати, что по шрифтам? не жирноват?

Автор: cirus 24.2.2016, 15:45

Цитата
а может так?

С флагами понятно как включить/отключить блок кода. При этом не понятно включился он или выключился, придётся выводить в лог или хинт результат.

Вариант с чекбоксами то что надо. Как их сделать?
Цитата
Кстати, что по шрифтам? не жирноват?

Нормально.

P.S. Ушёл на работу.

Автор: Cockney 24.2.2016, 19:20

Теперь понял про что ты. Пока никак. Сейчас поиграюсь с кликами. Попутно добавлю новые контролы, включая чекбокс.

Автор: Cockney 25.2.2016, 22:52

Апдейт.

-Новые элементы : чекбоксы(Checkbox), текст(Text).
-Функция GetState(). Возвращает состояние элемента(пока поддерживаются только чекбоксы). 1 - галка стоит, 0 - нет.
-Новые сообщения от контролов:
CHECKBOX_CLICK
CHECKBOX_DBL_CLICK
TEXT_CLICK
TEXT_DBL_CLICK

Пример:

Код
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)

----------
Аттрибуты новых элементов смотрите в GUI.xml (узел <Text> - текст, а <CheckBox> - чекбокс).
---------
Возможно будут тормоза с работой функций, так что кто будет юзать отпишитесь есть ли они.
---------
Прикрепленный файл  Test0200.zip ( 97,04 килобайт ) Кол-во скачиваний: 6772
или https://yadi.sk/d/D3IjSGTIpPzKS

Автор: cirus 26.2.2016, 3:40

Цитата
Возможно будут тормоза с работой функций, так что кто будет юзать отпишитесь есть ли они.

Есть немного, галки с чекбоксов как-то вяло ставятся и снимаются, но в целом работают.
Двойной клик по кнопкам нормально работает.
Цитата
CHECKBOX_DBL_CLICK

Вроде как не работает, да и зачем он нужен. Поставить и тут же снять галку?
Цитата
TEXT_DBL_CLICK

Один клик работает, двойной нет.


Если возможно добавь к стилю Form статус поверх всех окон.
Цитата
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)

Удобнее бы было указывать заголовки чекбоксов, а не имена, если возможно.
Цитата
GUI.GetAction () //получение описания события. Вернет массив 1х3 с именами
формы, компонента и описанием события.

Лучше возвращать 4 элемента:
Форма, компонент, имя компонента, событие.
Например, есть кнопка с именем Button3 и заголовком Script5.
Удобнее в условии писать:
Код
if %action [1 3] = Script5     
//чем
if %action [1 2] = Button3

Потому что заголовок видно на форме, а за номером кнопки придётся лезть в xml файл.

Автор: Cockney 26.2.2016, 11:37

Можно систему узнать?именно процессор и ос.
-----------
Возможно, это не тормоз, а анимация установки флажка.

Автор: cirus 26.2.2016, 11:41

Запустил утром, уже нормально галки ставятся, но опять двойные клики плохо срабатывают.
Win7 x64, i7 2600k

Автор: Cockney 26.2.2016, 11:45

А в чем проблема брать имя чекбокса из GetAction по событию клика? или там у тебя другая система обработки?

Клики еще в работе.

Автор: cirus 26.2.2016, 12:25

Цитата
А в чем проблема брать имя чекбокса из GetAction по событию клика?

Можно и так. Просто с заголовком удобнее, т. к. его видно без лишних действий.

По поводу торможения чуть позже отпишу, пока немного занят. Есть одно предположение.
Когда на компе ничего не запущено (пусть даже мелочь типа аськи или браузера) пилот в разы медленнее работает, видимо из-за технологий энергосбережения, проц частоту сбрасывает.

Автор: cirus 26.2.2016, 13:31

Цитата
Есть одно предположение.
Когда на компе ничего не запущено (пусть даже мелочь типа аськи или браузера) пилот в разы медленнее работает, видимо из-за технологий энергосбережения, проц частоту сбрасывает.

Проверил. Так и есть.

Чекбоксы работают нормально.

Автор: Cockney 26.2.2016, 13:35

Хорошо. Я уж думал мой косяк.

Автор: Cockney 26.2.2016, 19:34

По поводу чекбоксов : да, удобнее, если отображается 5 букв на чекбоксе, а если больше? + имя это уникальный(в принципе, может быть одинаковым, но тогда система даст сбой) идентификатор любого элемента. И указав его, можно безошибочно сделать все что угодно. Так и зачем возвращать написанное на контроле?



или я опять не понял суть?

Автор: Cockney 26.2.2016, 19:45

Апдейт.

-Пофикшены несрабатывающие события
-Добавлено свойство форм : AlwaysTop. 1 - окно всегда будет сверху других, 0 - обычное поведение.

Прикрепленный файл  Test0201.zip ( 97,38 килобайт ) Кол-во скачиваний: 6728
или https://yadi.sk/d/D3IjSGTIpPzKS

Автор: DarkMaster 26.2.2016, 19:54

Ну и в целом можно коснуться старой, но все еще болезненно актуальной темы контроля статуса: https://forum.uokit.com/index.php?s=&showtopic=19856&view=findpost&p=157513
Переменные пока не выведешь, но вот массивы можно начинать разгр<вырезано анти-матом>.

Автор: cirus 27.2.2016, 3:51

Цитата
По поводу чекбоксов : да, удобнее, если отображается 5 букв на чекбоксе, а если больше? + имя это уникальный(в принципе, может быть одинаковым, но тогда система даст сбой) идентификатор любого элемента. И указав его, можно безошибочно сделать все что угодно. Так и зачем возвращать написанное на контроле?

То что всё и так можно сделать это да.

Прикрепленное изображение
Что вижу в форме: Главное меню, Script1, Script2, Script3, start_script, HP, MP, CP.
Что пишу в скрипте: Main, Button, Button2, Button3, label, chk, chk2, chk3.
Т. е. вижу одно, пишу другое.


Возьмём, например, кнопку с именем Button2 и заголовком Script2. If будет выглядеть так:
Код
set %action GUI.GetAction ()
if %action [1 2] = Button2 and %action [1 3] = BUTTON_CLICK

Если надо будет что-то отредактировать в скрипте, придётся либо ползти в xml, либо выводить в лог или хинт GUI.GetAction чтобы узнать как называется кнопка.

Если же возвращать 4 элемента (форма, компонент, имя компонента, событие.), то If будет таким:
Код
set %action GUI.GetAction ()
if %action [1 3] = Script2 and %action [1 4] = BUTTON_CLICK

Сразу понятно что используется кнопка Script2.

Не думаю что кто-то будет делать кнопки с одинаковым названием. Никто ведь не пишет переменные с одинаковым названием.

Автор: cirus 27.2.2016, 23:47

Двойной клик по тексту (label) копирует этот текст в буфер. Так и должно быть?

Автор: Cockney 28.2.2016, 12:35

Вроде как нет.
-------
А вроде как бы и да. На ХР такого эффекта не должно быть. Но начиная с висты при двойном клике по тексту он скопируется в буфер. Этот эффект убирается путем отключения двойных кликов.

Автор: Cockney 28.2.2016, 13:37

Есть небольшой костыль.

Автор: cirus 28.2.2016, 13:51

Цитата
Но начиная с висты при двойном клике по тексту он скопируется в буфер. Этот эффект убирается путем отключения двойных кликов.

Я и не знал что такое есть smile.gif Обычно текст просто выделяется.

Автор: Cockney 28.2.2016, 15:04

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

Автор: Cockney 28.2.2016, 17:18

Апдейт.

-Теперь GetAction возвращает 4 элемента:

1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события

-GetState может получить статус чекбокса, обратившись к нему по его же тексту.(по имени так же работает).
Текст указывается во втором параметре.


Прикрепленный файл  Test0221.zip ( 97,34 килобайт ) Кол-во скачиваний: 1455
или https://yadi.sk/d/D3IjSGTIpPzKS



----------------------------------
Так, я не помню, клики менял или нет? все так же некорректно отрабатывают?

Автор: cirus 28.2.2016, 17:37

Цитата
-Теперь GetAction возвращает 4 элемента:

Спасибо. Так намного удобнее.
Цитата
Так, я не помню, клики менял или нет? все так же некорректно отрабатывают?

Да, также, если двойной клик делать не очень быстро, то перед ним срабатывает одиночный.

Автор: Cockney 28.2.2016, 17:53

в целом работает нормально?тормоза,баги?

Автор: cirus 28.2.2016, 18:15

Цитата
в целом работает нормально?тормоза,баги?

Пока только тестил что и как работает. Проблем не было. Если что-то будет отпишу.
Ошибки могут быть если использовать несколько плагинов одновременно, но уже к кнайту вопросы.

Автор: Cockney 28.2.2016, 19:02

А к чему несколько то их?один плагин в теории сможет обслуживать сколь угодно окон с любой начинкой.

Автор: cirus 28.2.2016, 19:05

Я имел ввиду несколько разных плагинов. Например, "Плагин для получения информации об окне" и "Математические операции с плавающей точкой" вместе не работают.

Автор: cirus 28.2.2016, 21:24

Цитата
GUI.Enable (<Тип элемента> <Имя формы> <Имя элемента> <Статус>)

Для Edit работает, для других элементов, вроде как, нет или я как-то не так пишу.

Автор: Cockney 28.2.2016, 21:45

для кнопки:

Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить


Или ты хочешь отключить что-то по ТЕКСТУ а не по ИМЕНИ?

Автор: cirus 28.2.2016, 22:11

Цитата
Или ты хочешь отключить что-то по ТЕКСТУ а не по ИМЕНИ?

Проще было бы по имени, но для начала чтобы вообще работало.
Прикрепленное изображение

Автор: Cockney 28.2.2016, 22:21

Странно, я не трогал Enable, но когда тестил он работал. Проверю.

Забыл, регистр имеет значенее, в моем коде ошибка.

Текст и чекбоксы пока не добавил.

Автор: cirus 28.2.2016, 22:21

Цитата
регистр имеет значенее

Теперь работает.

Автор: cirus 28.2.2016, 22:42

Цитата
Текст и чекбоксы пока не добавил.

Будешь добавлять, сделай чтоб по имени тоже можно было.

Что за пункт <MultiText>?

Автор: Cockney 29.2.2016, 0:37

если это для едита,то свойство,позволяющее вмещать несколько строк в поле ввода.

Автор: cirus 29.2.2016, 10:51

Цитата
если это для едита,то свойство,позволяющее вмещать несколько строк в поле ввода.

Символ перевода строки воспринимается какой-то? Типа \n?

Еще такой момент:
Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить

Выдаст ошибку, т. к неправильно указано имя.
Меняем на:
Код
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить

И тоже выдаст ошибку, пока не перезапустишь пилот или плагин.
Цитата
Ну и в целом можно коснуться старой, но все еще болезненно актуальной темы контроля статуса: https://forum.uokit.com/index.php?s=&sh...st&p=157513
Переменные пока не выведешь, но вот массивы можно начинать разгр<вырезано анти-матом>.

В поля Edit и Text уже и так можно выводить переменные.

Можно еще добавить 5й параметр для GUI.SetText <Цвет текста>.
Код
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)


Потом в описании плагина лучше исправить <> на **.
Код
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)

Автор: DarkMaster 29.2.2016, 11:02

Цитата
Потом в описании плагина лучше исправить <> на **.

Спорное утверждение. <> - является стандартным обозначением обязательного параметра. ** - являются никому не понятным костылем из-за особенностей пилота. Возможно стоит ввести оба набора обозначений и/или добавить сноску.

Цитата
В поля Edit и Text уже и так можно выводить переменные.

Тем не менее есть еще паразитные рамки окон, само окно можно было бы сделать прозрачным. Все это очень легко вылазит, когда начинаешь использовать. Сейчас под те же надобности использую лог. Весь набор проблем при использовании окон по сути остается: пропадает куча места, мешает работе, нет цветовых обозначений. Даже еще один момент появляется - нет настройки размера кегля и уйдя на кухню я уже не увижу, что там на мониторе.

Автор: cirus 29.2.2016, 11:24

Цитата
Спорное утверждение. <> - является стандартным обозначением обязательного параметра. ** - являются никому не понятным костылем из-за особенностей пилота.

Для 99% людей, в том числе для меня, <> от ** ни чем не отличается и ничего не означает smile.gif
Цитата
Возможно стоит ввести оба набора обозначений и/или добавить сноску.

Хотя бы так.

Автор: DarkMaster 29.2.2016, 11:32

Цитата
Для 99% людей,

Разве что местных и то сомнительно smile.gif Если человек хоть немного сталкивался с любым языком программирования или скриптовым языком, то он должен это знать. Даже, если хотя бы батники писал.

Автор: Cockney 29.2.2016, 18:19

Цитата(cirus @ 29.2.2016, 10:51) *

Символ перевода строки воспринимается какой-то? Типа \n?

Еще такой момент:
Код
set $a GUI.Enable (*Button* *Main* *button* *0*) //выключить

Выдаст ошибку, т. к неправильно указано имя.
Меняем на:
Код
set $a GUI.Enable (*Button* *Main* *Button* *0*) //выключить

И тоже выдаст ошибку, пока не перезапустишь пилот или плагин.

В поля Edit и Text уже и так можно выводить переменные.

Можно еще добавить 5й параметр для GUI.SetText <Цвет текста>.
Код
GUI.SetText (<Тип элемента> <Имя формы> <Имя элемента> <Новый текст> <Цвет текста>)


Потом в описании плагина лучше исправить <> на **.
Код
GUI.SetText (*Тип элемента* *Имя формы* *Имя элемента* *Новый текст* *Цвет текста*)



1)Вроде как да, \n
2)Пока только так, любая ошибка - смерть плагина. По этому я был за обращение по имени из GetAction
3)Будут отдельные команды для установки цвета, шрифта, размера
4)Это конечно на вкус и цвет, но <> намного визуально приятней, чем *, поэтому, в описании функций лучше использвать <>. Легче воспринимается. + я указывал, как передаются параметры.

Автор: Cockney 29.2.2016, 18:44

Цитата(DarkMaster @ 29.2.2016, 11:02) *

нет настройки размера кегля


это что такое?т.е. шрифт?

Автор: DarkMaster 29.2.2016, 18:58

Цитата
это что такое?т.е. шрифт?

Размер шрифта. Шрифт желательно иметь возможность установить моноширный(все буквы одинаковой ширины, обычно используется в консоли, при написании кода, в теге "код" на форуме и т.д.).

Автор: Cockney 29.2.2016, 19:29

могу,ошибаться,но шрифты так и накладываются на контролы.

Автор: DarkMaster 29.2.2016, 19:43

Цитата
могу,ошибаться,но шрифты так и накладываются на контролы.

Это свойства шрифта моноширный он или нет. В винде обычно используется Arial - он не моноширный. Самый просто способ посмотреть шрифты - открыть выбор шрифта в пилоте. Все что консольные, курьер, систем и т.д. моноширные. По большому счету, если будет, как ты говорил, поддержка изменения шрифта, то это позволит использовать моноширный шрифт.

Автор: Cockney 29.2.2016, 21:07

Цитата(DarkMaster @ 29.2.2016, 19:43) *

Это свойства шрифта моноширный он или нет.



На сколько я могу судить по мдсн, то это стандартные кисти шрифтов, которые имеют системные размеры (ширина, высота и диагональ вроде(или специфическая мерка какая-то)). а можно создать кастом кисть со своими мерками. Надеюсь я не утону в справке и смогу реализовать.

Автор: DarkMaster 29.2.2016, 22:49

Цитата
Надеюсь я не утону в справке и смогу реализовать.

По идее все, что нужно - это возможность задать шрифт, остальное само встанет должным образом.

Автор: cirus 1.3.2016, 2:17

Цитата
Вроде как да, \n

Код
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)

Выведет всё в одну строку. Как-то по-другому надо?

Автор: Cockney 1.3.2016, 6:27

Цитата(cirus @ 1.3.2016, 2:17) *

Код
set $a GUI.SetText (*Edit* *Main* *edit* *aaa\nbbb*)

Выведет всё в одну строку. Как-то по-другому надо?


а пилот служебные обрабатывает?
-------
я не знаю,как написать этот символ в пилоте,но в делфи он так пишется - #13

Автор: DarkMaster 1.3.2016, 7:56

Можно попробовать 0x13, но скорее всего передаст строку. Тем не менее можно использовать chr(0x13).

Автор: cirus 1.3.2016, 10:47

Цитата
а пилот служебные обрабатывает?

Да.
Код
Hint aaa\nbbb

Для кнопки работает такой вариант:
Код
set %b [1] chr(13)
set $a GUI.SetText (*Button* *Main* *Button* *aaa%b [1]bbb*)

А вот Edit в таком же виде пишет aaabbb.

Почему в стиле кнопок </MultiText>, а в edit </MultiLine>? Это одно и тоже?

Автор: DarkMaster 1.3.2016, 15:10

Цитата
а пилот служебные обрабатывает?

Да.
Код

Hint aaa\nbbb

Да ну щас. Это не более чем кнайтовский прасинг. Там вообще сначала было /n по ошибке.

Автор: Cockney 1.3.2016, 17:12

мульти лайн и мульти текст отключаются тем, что мультилайн(для этида) позволяет вмещать произвольное кол-во строк в поле,а мультитекст(другие элементы) позволяет растянуть текст(если он не помещается в одну строку) на всем элементе.

Автор: Cockney 1.3.2016, 18:39

Копаюсь в прозрачности окон. Если главное окно прозрачное, то все контролы - тоже. Есть идеи как обойти?

Автор: DarkMaster 1.3.2016, 19:00

С гуями никогда не работал. Хотя вру - делал формочку под скрины, но толку от этого не много.

Автор: DarkMaster 3.3.2016, 19:12

А если чайлды перебрать и поснимать с них прозрачность? Решение, конечно, хреновое, но если тупик, то может помочь.

Автор: Cockney 3.3.2016, 21:22

Не-а. Прозрачность лепится либо на все окно(родитель), либо эмулируется битмапами с альфа-каналом.

Было два варианта:
1)Делать каждый контрол самостоятельным окном, что очень плохо.
2)Намазывать прозрачные битмапы на контролы

Второй более реальный, но слишком много мороки, т.к. придется для каждого элемента снимать его размеры, создавать битмап.....

Автор: DarkMaster 3.3.2016, 21:38

а если вспомнить мобидика нашего? оверлеи?

Автор: Cockney 3.3.2016, 22:52

что за мобидик?

Автор: Cockney 3.3.2016, 23:06

а что оверлей?обычное окно же.

Автор: DarkMaster 4.3.2016, 8:30

кхе... Оверлей сильно не обычное окно. Прорисовывается уже после формирования выходной картинки при конвертации в сигнал. Т.е. оно может быть поверх всех окон не сбивая фокус. При этом оно не является виндовым окном. Ну разве, что костылями каким-то аналогичный прозрачный апи сделан. Оверлей накладывается на какую-либо область либо на какой-нибудь цвет. Подобным образом тот же фрапс выводит фпс в играх. Аналогично работают видео плееры, если отрисовка включена через оверлей(умеют вроде все или почти все). При воспроизведении видео как правило создается черно окно на которое по цвету проецируется картинка в связи с чем возможны некоторые грабли, которые, как раз и могут пригодиться: уведя плеер на второй план и написав в блокноте черным шрифтом "Hello world", ты получишь воспроизведение в пределах этой надписи. Подобным образом либо при использовании областей, можно выводить любую информацию, при этом будет прозрачный фон(ну точнее фона вообще не будет), необходимый текст/изображение. Так же сквозь подобные надписи можно свободно кликать, т.к. это не окна, а не более чем картинка. При необходимости для кликабельности можно на те же координаты помещать полностью прозрачное окно с необходимыми фичами.

Автор: Cockney 4.3.2016, 13:17

Я понял про что ты. Да, это реализуемо вроде на GDI или директе, однако, повлечет за собой переписание всего с нуля, абсолютно всего. Вроде как даже нужно ручками определять куда как и чем произошел инпут с клавы или мыши(могу ошибаться). + рисование контролов тоже руками + продумать еще анимации(как при наведении и тд.). По моему это не жизнеспособный вариант.

Автор: DarkMaster 4.3.2016, 13:54

Цитата
Я понял про что ты. Да, это реализуемо вроде на GDI или директе, однако, повлечет за собой переписание всего с нуля, абсолютно всего. Вроде как даже нужно ручками определять куда как и чем произошел инпут с клавы или мыши(могу ошибаться). + рисование контролов тоже руками + продумать еще анимации(как при наведении и тд.). По моему это не жизнеспособный вариант.

На директе точно можно, на GDI до конца не уверен, т.к. если правильно помню, то оверлей обработка идет после сбора изображения в GDI.
Хелло вролд напишешь - буду ковырять, будет вывод инфы в оверлей, можно будет разделить на 2 модуля, возможно даже вызвать из одного второй получится. Я не смог найти ничего рабочего...
Инпута там вообще нет и быть не может ибо это не окно. По сути это очень схоже с тем, чтобы налепить на монитор трафарет и получать наложенную картинку. Только трафарет этот между видюхой и выходным сигналом.

Автор: Cockney 4.3.2016, 14:19

как это инпута не может быть?если в директ-приложениях есть возможность использовать мышку и клаву...

Автор: DarkMaster 4.3.2016, 15:46

Инпута куда? Инпута в оверлей не может быть даже в теории. Инпут в область, где оверлей - возможно. Т.е. по факту, например, инпут в окно бразуера, а мы его перехватываем и обрабатываем. Оверлей не хранится в памяти, не является окном и т.д. Для оси его вообще нет по сути. Его раньше даже вернуть невозможно было(скрином, напрмер, до висты не видел наложенное изображение).

Автор: Cockney 4.3.2016, 17:55

Вот и на кой такие сложности? Плагин позволяет настроить скрипт щелчками по кнопкам, а уж эти исчезающе-прозрачно-информационные оверлеи явно не для обычного плагина.

Автор: DarkMaster 4.3.2016, 18:36

Цитата
Вот и на кой такие сложности?

Сначала думал решится все прозрачностью без заморочек и убьется сразу два зайца. Не получилось...
Потом понадеялся, что твоего опыта будет достаточно хотя бы, чтобы показать рабочий пример и наваять наболевшее самому...
Как-то так smile.gif

Автор: cirus 6.3.2016, 12:55

За час работы скрипта пару раз вылезла ошибка такого вида:
Прикрепленное изображение

Кусок кода
Код
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

Вообще суть скрипта такая: при нажатии на кнопку Ress1, Ress2 или Ress3 обновляется время (число после кнопки). В целом всё работает нормально, но вот пару ошибок было.
Первый раз была ошибка на set $ress1cd GUI.SetText, второй раз та что на скрине. Выскакивала ошибка после нажатия на кнопку (в первом случае Ress1, во-втором Ress3) т. е. дальше должно было время обновиться. Поле edit в это время не редактировалось.

Автор: Cockney 6.3.2016, 13:23

прикрепи пожалуйста xml.
----------
А если задержку побольше выставить?

Автор: cirus 6.3.2016, 13:50

Цитата
А если задержку побольше выставить?

Попробую как время будет.


Прикрепленные файлы
Прикрепленный файл  GUI.rar ( 999 байт ) Кол-во скачиваний: 403

Автор: Cockney 6.3.2016, 14:58

Потестил. Гонял ровно час, баг не воспроизводится. Во время работы менял едит. Все корректно. Возможно задержка. Если еще будет проявляться - пиши, буду глубже смотреть.

Автор: cirus 6.3.2016, 15:24

Тоже проверял сейчас, причём задержку в 0 поставил, проблем пока нет. Погоняю до вечера, если что-то будет напишу.

А вообще спасибо за плагин, классная вещь.

Автор: cirus 6.3.2016, 23:13

Скорее всего из-за маленьких задержек были ошибки. При linedelay 0, пару раз была эта же ошибка когда быстро и много раз кликал по кнопкам. Хотя иногда как ни старайся ошибки нет. Врят ли кто-то будет такой ерундой заниматься smile.gif Было ещё это:
Прикрепленное изображение
Поставил задержку (точнее таймер на 100мс) перед GUI.ActionExist () пока не было ошибок. Как будет время проверю ещё.

И ещё, если в пустой скрипт написать:

Код
set %a GUI.GetAction ()

Запустить скрипт и пару раз (или больше) кликнуть по кнопке какой-нибудь, то будет ошибка.

Автор: Cockney 7.3.2016, 6:29

вот этот второй скрипт работает вместе с основным?или отдельно?

100мс слишком,думаю тут до 20мс вполне нормально будет.

и какую ошибку бьет? что на скрине?

Автор: cirus 7.3.2016, 18:18

Цитата
вот этот второй скрипт работает вместе с основным?или отдельно?

Отдельно.
Прикрепленное изображение
Пару кликов по любой кнопке и будет такая ошибка.

Автор: Cockney 7.3.2016, 18:48

чет я даже не знаю на че думать.....помнится дарк обмолвился, что плагины как-то с вкладками связаны.
-----
А если в этом скрипте перед GetAction вызвать pluginload?

Автор: Cockney 7.3.2016, 18:59

Хотя тут что-то другое. Возможно связанное с потоками. Да, скорее всего так и есть.

Автор: cirus 7.3.2016, 19:24

Пока можно решить проблему таймером. Врят ли кто-то умеет кликать больше 10 раз в секунду. На меньших задержках не тестил.

Код
set #time 100

:start
if #time < timer
    set #time timer + 100
    set %a GUI.GetAction ()
end_if
goto start

Автор: DarkMaster 7.3.2016, 19:55

Цитата
чет я даже не знаю на че думать.....помнится дарк обмолвился, что плагины как-то с вкладками связаны.

Плагин общий для всех вкладок вроде. Т.е. если в одной создать что-то в плагине, то и во второй созданное будет доступно. Соответственно надо быть аккуратным, чтобы не налепить одинаковых объектов.

Автор: Cockney 7.3.2016, 21:42

Цитата(DarkMaster @ 29.7.2015, 1:52) *

если вопрос по созданию окна, то в инит его не надо пихать, т.к. получится что-то не очень вменяемое и не понятно с какими вкладками связанное либо находящееся вообще вне вкладок. Если я не ошибаюсь, то в каждой вкладке пилота своя копия плагина и работать они будут незваисимо.

Автор: cirus 7.3.2016, 22:06

На счёт этой ошибки: https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219482
Вчера тестил скрипт, кликал на кнопки пилотом, работало часа 2 без проблем, причём задержка была 0. Потом запустил 2 окна lineage2, еще где-то час работало без проблем, как только запустил третье окно l2 вылезла эта ошибка. Стал пробовать запускать и выгружать окна во время работы скрипта, ошибок не было никаких. Решил что совпадение.
Сегодня было запущено 2 окна l2, часа 1,5 никаких проблем, но уже с задержкой 100 мс, как только запустил третье окно l2 та же ошибка вылезла.
Как связан запуск приложения с работой плагина не знаю, но когда я только написал про эту ошибку первый раз, то никакие окна не загружались.

Автор: Cockney 7.3.2016, 22:23

Чудеса. Плагин никак не связан с линейкой. Абсолютно. Более того, он не связан вообще с другими окнами системы. Что может мешать работе - не знаю. Лично у себя такого не наблюдаю. Может и причуды винды, а может и моя криворукость.

Автор: DarkMaster 7.3.2016, 22:36

Цитата
если вопрос по созданию окна, то в инит его не надо пихать, т.к. получится что-то не очень вменяемое и не понятно с какими вкладками связанное либо находящееся вообще вне вкладок. Если я не ошибаюсь, то в каждой вкладке пилота своя копия плагина и работать они будут незваисимо.

Ну дык "если не ошибаюсь". Вроде последующие тесты это опровергли...

Изначально основывался на предположении кнайта, который пытался вспомнить что он там натворил)

Автор: Cockney 7.3.2016, 22:37

Цитата(DarkMaster @ 7.3.2016, 22:36) *

Вроде последующие тесты это опровергли...



Вот так.....

Автор: DarkMaster 7.3.2016, 22:39

самый простой способ проверить:
1 функция - записывает строку с параметром
2 функция - возвращает эту строку

вызови их из разных вкладок.

Автор: Cockney 7.3.2016, 22:53

Когда происходит событие(от 1 скрипта), плагин запоминает имя окна, от которого произошло событие, этот же скрипт получает описание события(внутренняя структура плагина о событии очищается), и в это же время, скрипт 2 тоже получает событие,(и вот тут он обращается к пустой структуре события, т.к скрипт забрал пред. события, а новое еще не обработалось).

вот кажется и возможная проблема. поэтому иногда задержка и прокатывает. однако теперь не ясно при чем тут окна другие.

Автор: DarkMaster 7.3.2016, 23:00

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

Автор: Cockney 7.3.2016, 23:04

Да, но это сколько окон нужно?

+ плагин обрабатывает события методом он-евент, а не циклом, что как бы дает маленькую нагрузку.

Автор: cirus 7.3.2016, 23:34

Цитата
элементарно. больше окон - больше нагрузка на камень, больше необходимые задержки. Как только количество окон достигает того количества, которое может загрузить все ядра, то мы получаем резкий скачек необходимых задержек.

Запуск одного окна l2 может вызвать ошибку. Естественно не всегда, можно и 10 окон запустить и всё работает. Кстати, как ни странно, закрываешь ошибку и всё работает дальше.
Видео с ошибкой:
https://yadi.sk/d/pCZgyAgWpyMmJ

Автор: DarkMaster 8.3.2016, 9:41

А запись и чтение одновременно не происходят случаем? Чтение оно вроде как безопасно, но учитывая, что там должны быть структуры, то может получиться ситуация когда считывается половина старой и половина новой. Результат поведения после этого не ясен.

Автор: Cockney 8.3.2016, 11:24

В плагине?структура(это я так обозвал) на самом деле просто несколько отдельных переменных. Может, о чем я и говорил, первый скрипт очищает эти переменные, очистил часть, а тут второй скрипт обращается либо к пустым данным, либо к данным, которые косвенно связаны с уже пустыми переменными.

Автор: DarkMaster 8.3.2016, 12:11

очередь надо, чтобы исключить подобные варианты.

Автор: Cockney 9.3.2016, 14:15

Эт понятно. Каким методом? читал про мьютексы, но они вроде только для кодовых потоков. Флаг какой-нибудь завести и таймер на него повесить?

Автор: DarkMaster 9.3.2016, 15:20

А там не все так просто. Можно еще натворить взаимную блокировку процессов и будет рыба. Смысл будет тот же самый - считан флаг, что свободно, а оно уже начало заниматься, но не успело. Полноценную многопоточку с очередью в таком ключе никогда не реализовывал на практиктике. Если надо добавить данные в очередь в другом потоке, который эту очередь постепенно очищает, то я представляю, как это сделать, а в данном случае - не очень. Ну или наоборот раздать на n потоков одну очередь. Мне кажется надо думать над созданием некоторого списка в котором будут хранится таски на основе номера вкладки или TID процесса. Далее эти таски будет собирать некоторый коллектор, после сбора удалять. Лучше использовать именно список, а не массив - проблем меньше будет с изменением размера, добавлением/удалением.

Грубо говоря что-то вроде https://forum.uokit.com/index.php?s=&showtopic=28316&view=findpost&p=209321
но уже в контексте нормального языка и некоторых ограничений из-за отсутствия прямого доступа к переменным скрипта, в виде списка и, скорее всего, идентификаторы завязывать на TID, а поток не закрывать пока таск не будет в очередь помещен.

В бусте что-то готовое есть для этого дела кстати. Там есть и очередь на n потоков и n потоков на одну очередь.

Автор: Cockney 10.3.2016, 18:28

Сильно загнул).
-------------------
По поводу перекосов с флагом. Да, такое может быть, только думаю не дойдет до этого, ибо 1 байт обработать очень быстрое дело, не то, что сейчас, считывание/запись структуры.

Автор: DarkMaster 10.3.2016, 18:57

Посмотри буст там есть готовое решение. Я с полгода назад ковырял многопоточку, неоднократно натыкался. У меня задача была несколько иная и подключение бустовских либ мне показалось слишком громоздким - там обошлось все проще.

Автор: Cockney 11.3.2016, 23:17

Апдейт.

-Пофикшены клики. Теперь одиночный клик не лезет перед двойным.


Обработка одиночного клика идет с небольшой задержкой, так и должно быть.


Прикрепленный файл  Test0231.zip ( 97,2 килобайт ) Кол-во скачиваний: 385
или https://yadi.sk/d/D3IjSGTIpPzKS
-------------------------
На подходе изменение цвета элементов.

Автор: Cockney 11.3.2016, 23:43

Предлагаешь мне буст переписать?)

Автор: DarkMaster 12.3.2016, 7:41

Цитата
Предлагаешь мне буст переписать?)

В смысле? Я наоборот тебе предлагаю взять готовую либу из буста, которой можно собрать такую очередь. ИМХО самый правильный вариант в данном случае.

Автор: Cockney 12.3.2016, 11:17

плагин то на делфи)
---------
хотя,вроде он понимает obj.

Автор: DarkMaster 12.3.2016, 15:12

А зачем тогда выспрашивал столько времени, как завести на с++, а потом сел на делфю?) Вообще и буст можно переписать конечно) Я вообще образец плагина переписывал с делфи на с++ не зная ни первого ни второго.

Автор: Cockney 12.3.2016, 16:18

так с++ так, больше для развлечения,я в нем не уверенно себя чувствую. а плагин изначально на делфи был.

Автор: DarkMaster 12.3.2016, 17:41

кстати ты меня заставил задуматься... буст это по сути дела либа... Может прилинковать и получится. Точнее даже не так. Может трудозатраты линковки окупят результат smile.gif

Автор: cirus 12.3.2016, 20:34

Цитата
Апдейт.
-Пофикшены клики. Теперь одиночный клик не лезет перед двойным.

Работает нормально, только при двойном клике в GetAction не возвращается 3й элемент.

Автор: Cockney 12.3.2016, 20:59

текст элемента там должен быть?
----
вроде пофиксил, в следующий апдейт войдет.

Автор: Cockney 12.3.2016, 21:42

Цитата(DarkMaster @ 12.3.2016, 17:41) *

кстати ты меня заставил задуматься... буст это по сути дела либа... Может прилинковать и получится. Точнее даже не так. Может трудозатраты линковки окупят результат smile.gif



Сначала собрать как-то, а уж потом прилинковать, и главное - понять как этим пользоваться.

Автор: Cockney 16.3.2016, 14:44

Апдейт.


-Теперь Enable может принимать вместо имени элемента его текст.
-Добавлена возможность изменить цвет фона, текста.

Код

set $a GUI.SetTextColor (<тип элемента> <форма> <имя элемента> <канал R> <канал G> <канал B>) //цвет текста
set $a GUI.SetBckgColor (<тип элемента> <форма> <имя элемента> <канал R> <канал G> <канал B>) //цвет фона


В GUI.xml добавлен узел <Color> для элементов : Edit, Text

Под-узел <Text> отвечает за цвет текста
Под-узел <Background> отвечает за фон

Под-узел элемента Edit <SetBckg> отвечает за цвет фона при установлении каретки на строчку.

Прикрепленный файл  Test0341.zip ( 101,28 килобайт ) Кол-во скачиваний: 264
или https://yadi.sk/d/D3IjSGTIpPzKS
----------------------------------

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

Автор: DarkMaster 16.3.2016, 19:26

имхо - уходить от манифеста. Если привязывать часть интерфейса к теме винды, то может получиться тихий ужас...

Автор: Cockney 16.3.2016, 19:57

в том то и дело,когда думал о манифесте не знал о таких граблях,думал все единообразно...но нет,это виндоуз.

Автор: cirus 18.3.2016, 2:14

В описание плагина надо дописать что нужно для его работы, чтоб не возникало лишних вопросов, почему это:
Прикрепленное изображение

Автор: DarkMaster 18.3.2016, 9:11

редисты установить надо. Можно взять из моей темы с антигейтом.

Автор: Cockney 18.3.2016, 11:56

Вообще, удивлен, что программа, собранная на делфи требует редист. В первые вообще слышу об это. Может другой плагин требует?

Автор: DarkMaster 18.3.2016, 12:07

Цитата
Вообще, удивлен, что программа, собранная на делфи требует редист. В первые вообще слышу об это.

Я лишь говорю о том, что это либа редиста. Ну а что ее требует я могу только гадать.

Автор: cirus 18.3.2016, 13:35

Цитата
Может другой плагин требует?

С другими такого не было после переустановки винды.
В xml 2 формы, вылезало 2 ошибки. И ошибки начинаются с имени формы.

Автор: Cockney 18.3.2016, 13:46

скрин можно?

Автор: DarkMaster 18.3.2016, 13:53

Cockney, а ты в плагине дллки никакие не подключал?

Автор: Cockney 18.3.2016, 14:11

лично я - нет, сама дельфи , в теории может.


есть предположение одно...

Автор: cirus 18.3.2016, 14:11

Цитата
скрин можно?

Так выше скрин ошибки с заголовком: ТВ:uopilot2361.exe - Системная ошибка. ТВ - это имя формы.
Других скринов нет.

Автор: Cockney 18.3.2016, 14:21

Все, увидел. Не знаю как такое могло выдать.

Автор: Cockney 18.3.2016, 22:47

После установки требуемой либы что-то еще просил?

Автор: cirus 19.3.2016, 3:38

Цитата
После установки требуемой либы что-то еще просил?

Я её не устанавливал. Скачал файл msvcr120.dll и закинул в C:\Windows\SysWOW64. Всё работает.

Автор: Cockney 19.3.2016, 6:55

тот баг повторялся?

Автор: cirus 19.3.2016, 11:09

Цитата
тот баг повторялся?

Если ты про SetText, то сегодня вечером проверю, тот скрипт нужен только раз в 2 недели. Напишу если что-то будет.

Автор: mircha 25.3.2016, 0:35

всем привет, помогите сделать мини клиент для браузерной игры... скрипты все есть, только сам клиент надо сделать, всего пару кнопок... оплачу тем кто поможет!!! скайп mircha56 аька 324376342)

Автор: DarkMaster 25.3.2016, 13:27

Cockney, собери в кучу первый пост. А то скоро болезнь пилота будет: хелпа норм нет, но есть история развития. Так же сейчас несколько не ясно какая версия последняя, которая релиз или которые имеют бОльший номер версии. Создается впечатление, что бОльшие версии были бетами, а релиз был выпущен под номером 0000.

Error loading plugin: GUI.dll. Call 'InitPlugin' failed.
0.2.3.1
0.3.4.1

Автор: cirus 25.3.2016, 14:09

Старые версии вообще не актуальны. Можно оставить только https://forum.uokit.com/index.php?s=&showtopic=29457&view=findpost&p=219832

Автор: DarkMaster 25.3.2016, 14:13

Цитата
Можно оставить только последний апдейт

Цитата
Error loading plugin: GUI.dll. Call 'InitPlugin' failed.

Автор: cirus 25.3.2016, 14:21

Странно. Только что скачал, работает.

Автор: DarkMaster 25.3.2016, 15:04

Дернул, даже в папку отдельную положил копию пилота, с нуля запустил. Не хочет.

Автор: Cockney 25.3.2016, 15:08

Все понял, учту и сделаю.


По поводу ошибки - скорее всего, версия GUI.xml старая, это серьезная недоработка с моей стороны в плане оформления(казалось, что тот, кто пользуется будет только плагин заменять, а xml изредка), в будущем к каждой бетке и релизу буду прикладывать актуальный для текущей версии xml.

По поводу нумерации версий, да, пока самая актуальная версия, это та, которая имеет наибольший номер, пусть и с припиской "тест".
Релиз в моем понимании, это когда получается стабильная сборка. Пока же у меня такие еще не получались. Как получится, соответственно оформлю.

И справка тоже планируется.

Автор: DarkMaster 25.3.2016, 15:10

С запуском то что делать?

Автор: Cockney 25.3.2016, 15:17

xml взят https://forum.uokit.com/index.php?showtopic=29457&st=100&p=219832&#entry219832?

Автор: DarkMaster 25.3.2016, 15:24

да.

Автор: Cockney 25.3.2016, 15:27

Не знаю. Тоже завел новую папку, скачал и все встало как должно быть.


Вин какой?

Автор: DarkMaster 25.3.2016, 15:33

вин7 x64.

Количество функций совпадает с объявленным?

Автор: Cockney 25.3.2016, 15:35

Да. Да и не может быть в этом ошибки. Пилот получает адрес функции непосредственно перед ее вызовом.

Автор: DarkMaster 25.3.2016, 15:47

Цитата
Да. Да и не может быть в этом ошибки. Пилот получает адрес функции непосредственно перед ее вызовом.

Может smile.gif Сыпалось у меня из-за этого. Вообще надо думать, что не так с инициализацией. Пилот явно не получает заполненную структуру. У тебя много наворочено в инитплагине?

Автор: Cockney 25.3.2016, 15:57

чтение начальных данных из xml и создание контролов по этим данным.


у меня тоже 7 х64 и проблем нет.

Автор: DarkMaster 25.3.2016, 15:59

можешь в качестве теста оставить только заглушки и непосредственно заполнение структуры?

Автор: Cockney 25.3.2016, 16:10

т.е. вырезать весь код из инитплагин и оставить в нем только заполнение initstruct?


такое могу. через час-два в лс сброшу.

Автор: DarkMaster 25.3.2016, 17:29

Ну да. Чтобы понять в чем именно проблема. В системном куске который должен вернуться в пилот или непосредственно в манипуляциях отвлеченных от пилота.

Автор: Cockney 25.3.2016, 18:10

Так и не понял, как в личку прибить файл, поэтому тут прикреплю

-----------
Хех, забавно, вырезал весь функционирующий код и у меня появилась ошибка вызова инитплагин.
Прикрепленный файл  GUI.zip ( 52,41 килобайт ) Кол-во скачиваний: 228

Автор: DarkMaster 25.3.2016, 18:19

Цитата
как в личку прибить файл

вроде никак. По крайней мере вменяемыми методами.

Error loading plugin: GUI.dll. Call 'InitPlugin' failed.
на обрезке. Видимо что-то все-таки не так.

Автор: Cockney 25.3.2016, 18:23

Все функции, передаваемые в пилот, доступны к экспорту. Я не знаю нормального объяснения причины.


А с кодом работает.

Автор: DarkMaster 25.3.2016, 18:25

Можешь дать функцию и объявление структуры? Можно в личку. Сяду и буду с примером сравнивать... Делфи я не знаю, но пример на с++ был написан именно с расшифровки дельфийского) Было бы все тоже самое - работало бы.

Автор: Cockney 25.3.2016, 18:28

Ок

Автор: DarkMaster 25.3.2016, 18:29

функцию без хмл кода.

Автор: Cockney 25.3.2016, 18:41

Походу поздно)

Автор: DarkMaster 25.3.2016, 18:43

Ну я как раз зашел еще раз написать про хмл после увиденного))

Автор: Cockney 25.3.2016, 18:53

Так а все, вся функция и есть чтение хмл, ну не считая пары строк, которые я указал.

Я только не пойму, че не так. У меня работает, к цируса(или цайрус, как там) тоже. Только у тебя...

Автор: DarkMaster 25.3.2016, 18:54

Дык если не работает в виде пары строк, то эти пару строк и надо смотреть. Смысл ковырять хмл, если проблемы возникают без него?

Автор: Cockney 25.3.2016, 18:56

Как я могу понять, что проблема именно в них? Я лишь предположил. Сейчас соберу сборку без тех строк.

Автор: DarkMaster 25.3.2016, 18:58

Ну дык если есть шапка без полезного когда, которая должна просто инициализироваться, но она сыпет ошибку, то очевидно, что проблема в шапке, а не в полезном коде.

Автор: Cockney 25.3.2016, 18:58

Прикрепленный файл  GUI.zip ( 99,66 килобайт ) Кол-во скачиваний: 213


Без тех строк.

Автор: DarkMaster 25.3.2016, 19:24

закинул 0.3.4.1 на чужой комп вин7 64 - та же самая проблема.

Автор: Cockney 25.3.2016, 19:26

Дурдом. Я не знаю, честно. И повторить не получается.

Автор: DarkMaster 25.3.2016, 19:33

в обрезке же получилось.

Автор: Cockney 25.3.2016, 19:38

Ну, судя по обрезку, получается проблема в пилоте, что сомнительно.

Автор: DarkMaster 25.3.2016, 19:53

Учитывая, что плагины на плюсах гарантированно работают и есть образец плагина который тоже должен работать(как минимум работал), то это никак не пилот. В конце концов эта функция должна вернуть просто набор байтов в определенном порядке. В этом плане для отладки артмани хорошо помогает smile.gif Посмотри в хексе, что там идет. Структура то примитивная.

Автор: Cockney 25.3.2016, 20:10

Так,если бы что-то не шло - не работало бы вообще. Полнофункциональная версия работает у меня без проблем(и не только у меня,на виндах начиная с хр).Т.е. по идее, код то не виноват. Обрезаная выбивает ошибку,хотя видимых причин нет. Вот и думай, что тут искать. Компилятор сменить если...

Автор: DarkMaster 25.3.2016, 20:13

еще тесты:
почти чистая виртуалка вин7 32 - ошибка.
засраная вин7 64 - запустилась.

Клянчу копию виртуалки тебе в доступ, чтобы воспроизвести смог.

Цитата
Т.е. по идее, код то не виноват.

Либо что-то компенсирует. Указатель кривой, например, где-то есть.
Имхо в любом случае надо начинать с создания рабочей шапки, а потом наращивать и смотреть.

Автор: Cockney 25.3.2016, 20:19

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

Автор: DarkMaster 25.3.2016, 20:29

Цитата
как можно компенсировать кривые указатели?

Банально перезаписать некорректно выставленный '\0' в начале строки.
Цитата
а в твоем...

ни как он не работает.
Да и не мой он. Уже у 3 человек не запустилось.

Лично мои действия, которые бы я предпринял:
1) Обрезать код до минимального состояния на котором воспроизводится ошибка.
2) Помедетировать на код.
3) Посмотреть артманей структуру.
4) Взять образец плагина, скомпилить, посмотреть работает ли.
5) Взять образец плагина и потихоньку подсовывать куски текущего плагина и смотреть результат.
Хотя, честно сомневаюсь, что ты хуже меня понимаешь возможные шаги.

Кардинал у тебя 4 байта? Вопрос может показаться дебильным, но в с++ int может быть как 4, так и 8 байт, а кардинал это по сути unsigned int. Это кстати в свою очередь привело бы к 0 экспортируемых функций, что может вызвать ошибку.

Автор: Cockney 25.3.2016, 20:42

да,4

про некорректный \0. по дефолту этот символ ты не обязан писать нигде. система сама вставит где нужно. в дельфовых строках она ставит его в конец.

Автор: DarkMaster 25.3.2016, 20:44

Цитата
ты имеешь ввиду работу со строками?

+

Автор: Cockney 25.3.2016, 20:45

изменил свой пост,был не внимателен.


следовательно,если я не ставлю 0 в начало,а я и не ставлю,то все должно быть корректно.

Автор: DarkMaster 25.3.2016, 21:16

Виртуалку выдать?

Автор: Cockney 25.3.2016, 21:33

Результат или что?

Автор: DarkMaster 25.3.2016, 22:39

Виртуалку, где будет еррор воспроизводится. Человек домой минут через 40 придет и сможет дать виртуалку на которой сможешь воспроизвести проблему.

Автор: Cockney 25.3.2016, 22:54

Так а на кой мне? Никаких полезных данных я не получу.


Ладно, пошел отдыхать. Завтра еще поломаю голову.

Автор: DarkMaster 25.3.2016, 23:45

Ну смотри. Было бы где тестить.

Автор: cirus 26.3.2016, 19:04

Проверил на втором компе, плагин работает. На обоих стоит Win7 x64. Пилот 2.36.1.

Автор: Cockney 26.3.2016, 21:33

По моему я схожу с ума....


Сегодня имел :

3 ноутбука с виндами 8,8.1,10 соответственно.
1 мак с виртуалкой вин хр
стационар с вин 7 32х
еще один стационар с вин 7 64х

на каждом пересобрал плагин, начиная с пустой шапки и заканчивая полным функционалом. Добавлял все построчно. Абсолютно на всех и абсолютно все сборки работали. Просто запускались и без проблем. И да, сборка с шапкой фейлилась потому что я там выделение памяти под инитструкт затер.

Автор: DarkMaster 26.3.2016, 23:06

вот поэтому я и предлагал выделить тебе виртуалку, где ошибка воспроизводилась бы.

Автор: Cockney 26.3.2016, 23:11

ты серьезно? ну не может же так быть ,что на стольких машинах работает, а на других нет?это как так?

Автор: DarkMaster 26.3.2016, 23:58

Ты думаешь, что я тебе вру что ли? В числе тестеров был zavas, если еще помнишь такого. Его виртуалку тебе и предлагали. Еще из вариантов - обновления винды, но тут очень сложно будет вычислить проблемный патч (имхо проще понять на что ругается и переписать).

Автор: Cockney 27.3.2016, 14:37

Нет, не думаю) просто реально на издевку похоже. Дальнейшую беседу предлагаю перенести в лс, дабы не захламлять уж в конец тему.

Автор: Cockney 5.4.2016, 16:14

Работа не заброшена) давит учеба. Скоро продолжу работу.

Автор: DarkMaster 6.4.2016, 7:04

это гут

Автор: cirus 6.4.2016, 11:07

С запуском плагина решился вопрос?

Автор: DarkMaster 6.4.2016, 11:21

Да. Мой косяк) В свою оправдание могу лишь сказать, что очень много факторов провоцировало на то, чтобы закинуть хмл в папку с плагинами...

Автор: Cockney 23.4.2016, 22:17

Ну, первый, наверно, не лагающий релиз.


-Повысил стабильность работы раз в 40. Теперь плагин как и пилот, в теории, не валятся от неаккуратных действий.
-Добавил параметры в блок <SysInfo>в GUI.xml : <SafeMode>, <Warning>.
<SafeMode> - при отсутствии какого либо параметра или неправильного значения в нем автоматически применяет значение по дефолту.
Если установлено 1, то фича работает, 0 - будет выбивать ошибку при некорректном параметре, при этом прерывая обработку некоторых блоков полностью.
<Warnings> - работает только в сочетании с SafeMode = 1. Выводит предупреждения, о неправильных параметрах.

Перемудрил тут походу.

-Теперь функции при ошибке будут возвращать отрицательные значения. Расшифровка будет скоро.
-Поправил места потенциальных багов, в том числе связанных с возвращаемым результатом от GetAction.


Постарался оформить нормально. Если что не так - напишите.

---------------
В скором времени приведу в порядок описание и справку нормальную(надеюсь) прибью.

Прикрепленный файл  Release0341.zip ( 111,12 килобайт ) Кол-во скачиваний: 300
или https://yadi.sk/d/0wITwKnbqXjGc.

Автор: Cockney 9.5.2016, 14:24

В связи с новой возможностью группировки функций по категориям появилась идея продублировать для каждого элемента все функции, тобиш вместо SetText будет SetButtonText и т.д. Основные плюсы :

1)Все функции элемента в отдельной вкладке.
2)Отпадет нужда указывать тип элемента в параметрах.
3)Специфичные функции для некоторых элементов будут во вкладке этого элемента.

Ну и минусы :

Полная или частичная потеря совместимости со старыми скриптами. Первый вариант - все функции будут переделаны под новый вид, и работать и экспортироваться будут во всех версиях одинаково. Второй вариант - экспортировать разные версии функций для разных пилотов, но это слишком накладно в плане дублирования кода и лишней путаницы. Да и новые функции под старый формат не охота переделывать.

Кто что думает?

Думаю, пока слишком не поздно перейти на новый формат.

Автор: cirus 9.5.2016, 16:17

Не вижу проблем для перехода.
Текущую версию плагина оставить без изменений. Те кто пользуются им сейчас,а таких немного судя по скачиваниям и дальше смогут его использовать, чтобы не переписывать скрипты. Пусть и без новых функций.
Новые версии плагина делать по-новому.

Автор: DarkMaster 9.5.2016, 18:14

Цитата
Текущую версию плагина оставить без изменений. Те кто пользуются им сейчас,а таких немного судя по скачиваниям и дальше смогут его использовать, чтобы не переписывать скрипты. Пусть и без новых функций.
Новые версии плагина делать по-новому.

+

Автор: Cockney 29.6.2016, 15:14

Скорее всего будем переписываться с нуля.

Автор: DarkMaster 29.6.2016, 15:42

Причины? Переосмысление?

Автор: Cockney 29.6.2016, 21:21

Ага, перфекционист во мне сидит. Да и костылей много. Охота все как надо сделать, а не через...

Автор: InG 1.12.2016, 1:00

Ребят, подскажите чо как делать, я даже пример не могу заставить работать, может что не так делаю, пошагово дайте инструкцию как например сделать чтобы по нажатию на кнопку выполнялся "alarm" а дальше я как нить разберусь

Автор: cirus 1.12.2016, 2:11

Если архив взят отсюда 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

Автор: InG 2.12.2016, 0:59

Цитата(cirus @ 1.12.2016, 3:11) *

Если архив взят отсюда 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


Такс, спасибо большое, работает, а теперь вопросик, что значит [1 3] и [1 4]
Я немного понял, ну типа 1 - айдишник формы, а второе не понимаю наверное кнопка но где это указано и тд

Автор: cirus 2.12.2016, 2:10

Цитата
но где это указано и тд

Справки нет. Частично в первом посте написано, но там кое-что менялось, дорабатывалось, что-то может быть не актуально.
Цитата
а второе не понимаю наверное кнопка

Это имя кнопки, указанное в gui.xml
Код
<Name>Button</Name>    
<Caption>Старт</Caption>

Т. е. в %a [1 2] вернёт Button, в %a [1 3] - Старт
GUI.GetAction () возвращает:
Код
1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события

События:
Код
BUTTON_CLICK - Клик по кнопке
BUTTON_DBL_CLICK - Двойной клик по кнопке
TEXT_CLICK - Клик по тексту
EDIT_CHANGE - Если редактируется поле ввода

Автор: InG 2.12.2016, 14:07

Цитата(cirus @ 2.12.2016, 3:10) *

Справки нет. Частично в первом посте написано, но там кое-что менялось, дорабатывалось, что-то может быть не актуально.

Это имя кнопки, указанное в gui.xml
Код
<Name>Button</Name>    
<Caption>Старт</Caption>

Т. е. в %a [1 2] вернёт Button, в %a [1 3] - Старт
GUI.GetAction () возвращает:
Код
1 - Имя формы
2 - Имя контрола
3 - Текст контрола
4 - Описание события

События:
Код
BUTTON_CLICK - Клик по кнопке
BUTTON_DBL_CLICK - Двойной клик по кнопке
TEXT_CLICK - Клик по тексту
EDIT_CHANGE - Если редактируется поле ввода


с этим разобрались, спасибо, я вчера эксперементировал и заметил что getaction захватывает только последний активный обжект, кнопка то или чек бокс, нельзя сделать чтобы можно было проверять сразу два едита на наличия правильного лога и пароля?
а то я конечно могу сделать поэапно но это геморно и куча кода лишнего, типа - "Введите логи.. проверка на логин, потом скрытие едита с логином и открытие едита с паролем, если пароль тоже ввели вено то скрытие едита с паролем и вывод кнопки после нажатия на которую открываются кнопки Старт и Стоп и тд" но это уж очень как то некрасиво хд

Автор: cirus 2.12.2016, 14:59

Можно просто получить текст из обоих edit.

Код
set $a GUI.GetText (*Edit* *Main* *edit*)      // присвоить переменной текст из edit
set $b GUI.GetText (*Edit* *Main* *edit2*)    // присвоить переменной текст из edit2
hint $a   $b
wait 100

Автор: ivanTu 24.1.2017, 15:30

А как к примеру при клики по одной кнопке, изменить visible = другой

Автор: cirus 24.1.2017, 15:52

Код
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

При нажатии на кнопку Старт кнопка Стоп станет не активна.

Автор: ivanTu 24.1.2017, 16:04

Спасибо!

Пытался по этому же принципу скрыть кнопку не получилось...

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

Автор: cirus 24.1.2017, 16:16

Цитата
GUI.Visible

Потому что такой команды нет.

Автор: ivanTu 24.1.2017, 16:22

То есть, кликнув по одной кнопки, изменить свойство Visible у другой кнопки нет возможности?

Автор: cirus 24.1.2017, 16:25

В данный момент нет. Разве что Cockney допишет такую команду.

Автор: Cockney 26.1.2017, 23:06

Не допишу. Пока закрыл развитие плагина, ибо нет подходящих инструментов для рисования гуи из под длл. Найду - продолжу работу. Исходники могу выложить в паблик, если кто-то осмелится поддерживать их, но код уж больно ужасен.

Автор: ivanTu 9.2.2017, 11:28

У меня еще вопрос как проверять чексбокс, стоит ли галочка?

Автор: cirus 9.2.2017, 11:41

Цитата
У меня еще вопрос как проверять чексбокс, стоит ли галочка?

Код
set $a GUI.GetState (*Имя формы, на которой лежит чекбокс* *Имя чекбокса*)

Например:
Код
set $a GUI.GetState (*Main* *chk*)      // chk - это имя чекбокса в xml
log $a
// или
set $a GUI.GetState (*Main* *Останавливать при ошибке*)   // тут указано имя чекбокса на форме
log $a
End_script

Автор: sel 2.8.2018, 2:03

Цитата(Cockney @ 29.2.2016, 0:21) *

Странно, я не трогал Enable, но когда тестил он работал. Проверю.

Забыл, регистр имеет значенее, в моем коде ошибка.

Текст и чекбоксы пока не добавил.



Не нашёл в теме интересующей меня функции плагина. GetState позволяет получить статус чекбокса 1 или 0, есть ли возможность менять статус, т.е. ставить\снимать флажок с чекбокса командой?

Автор: cirus 2.8.2018, 3:12

Цитата
есть ли возможность менять статус, т.е. ставить\снимать флажок с чекбокса командой?

Вроде нет. Можно только включить/отключить элемент.

Автор: sel 2.8.2018, 6:03

В итоге я нашёл способ снимать галки, костылём конечно, но мне подходит.

Код

exec UoPilotStart.bat
exit
wink.gif

Автор: cirus 2.8.2018, 11:51

Можно и кликом left поставить галку.

Автор: sel 25.12.2018, 14:38

Цитата(cirus @ 2.8.2018, 13:51) *

Можно и кликом left поставить галку.


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

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)