Kibor |
Отправлено: 12 Апреля, 2021 - 16:48:24
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обновил архив.
В архиве должна быть папка templates
Если ее нет, очистите кеш браузера или скачайте архив другим.
Реализовал импорт готовых шаблонов в редактор, создание блоков в соответствие с этими шаблонами и при клике на блок правой кнопкой мыши появление меню, в котором можно выбрать Свойства и появится диалоговое окно настроек этого типа блока.
Рядом с редактором находится папка templates. В ней находятся шаблоны.
В данном случае там два демонстративных шаблона. KEY и MOUSE..
Можно добавлять свои. Сколько добавите, столько появится кнопок.. Если в папку templates переместить шаблон Блок, который в папке с программой - появится третья кнопка.
При запуске редактор проверяет эту папку и все шаблоны которые там есть загружает в память, создавая соответствующие кнопки на панели справа.
В дальнейшем это можно будет настраивать, настроив выбор шаблонов по своему усмотрению и выбрав, какие поставить на главную панель, какие скрыть до того как понадобятся.
Выбрав справа нужную кнопку шаблона можно ставить блок. На блоке будет название шаблона.
При клике правой кнопкой мыши на блоке можно вызвать его свойства, которые соответствуют его типу.
При нажатие ТЕСТ открывается шаблон рядом с редактором Блок
Пример шаблонов
Key
CODE:[INTERFACE]
DIALOG, "Клавиатура", 230, 160;
BUTTON_OK, "Принять", 20, 110, 100, 25;
BUTTON_CANCEL, "Закрыть", 123, 110, 100, 25;
STATIC, "Пауза До", 10, 10, 90, 18;
EDIT, 105, 8, 115, 18, int Edit_P1;
STATIC, "Символ", 10, 30, 90, 18;
EDIT, 105, 28, 115, 18, int Edit_S;
COMBO, "Нажать - Отпустить" "Нажать" "Отпустить", 10, 50, 212, 200, int Combo;
STATIC, "Пауза После", 10, 78, 90, 18;
EDIT, 105, 76, 115, 18, int Edit_P2;
[END]
[FUNCTION_BODY]
function Key_(int Edit_P1, int Edit_S, int Combo, int Edit_P2)
{
pause(Edit_P1);
if (Combo==0)key(Edit_S);
if (Combo==1)keydown(Edit_S);
if (Combo==2)keyup(Edit_S);
pause(Edit_P2);
}
[END]
[FUNCTION_CALL]
Key_(100, 65, 0, 500);
[END]
[FUNCTION_RETURN]
OFF;
[END]
mouse
CODE:[INTERFACE]
DIALOG, "Мышь", 230, 150;
BUTTON_OK, "Принять", 20, 100, 100, 25;
BUTTON_CANCEL, "Закрыть", 123, 100, 100, 25;
STATIC, "Пауза До", 10, 10, 90, 18;
EDIT, 105, 8, 115, 18, int Edit_P1;
COMBO, "Левая Нажать - Отпустить" "Левая Нажать" "Левая Отпустить"
"Правая Нажать - Отпустить" "Правая Нажать" "Правая Отпустить"
"Средняя Нажать - Отпустить" "Средняя Нажать" "Средняя Отпустить"
"Переместить", 10, 30, 212, 200, int Combo;
EDIT, 10, 55, 100, 18, int X;
EDIT, 120, 55, 100, 18, int Y;
STATIC, "Пауза После", 10, 78, 90, 18;
EDIT, 105, 76, 115, 18, int Edit_P2;
[END]
[FUNCTION_BODY]
function Mouse_(int Edit_P1, int Combo, int X, int Y, int Edit_P2)
{
pause(Edit_P1);
if (Combo==0)mouse(LEFT, X, Y);
if (Combo==1)mousedown(LEFT, X, Y);
if (Combo==2)mouseup(LEFT, X, Y);
if (Combo==3)mouse(RIGHT, X, Y);
if (Combo==4)mousedown(RIGHT, X, Y);
if (Combo==5)mouseup(RIGHT, X, Y);
if (Combo==6)mouse(MIDDLE, X, Y);
if (Combo==7)mousedown(MIDDLE, X, Y);
if (Combo==8)mouseup(MIDDLE, X, Y);
if (Combo==9)mousemove(X, Y);
pause(Edit_P2);
}
[END]
[FUNCTION_CALL]
Mouse_(100, 0, 0, 0, 500);
[END]
[FUNCTION_RETURN]
OFF;
[END]
|
|
|
Kibor |
Отправлено: 13 Апреля, 2021 - 17:33:23
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обновил архив.
Сделал сохранение параметров блоков.
Можно одновременно открывать много окон настроек разных блоков.
Изменил блок [FUNCTION_RETURN] на [FUNCTION_LOGIC]
Если функция сравнивается с чем то и от нее можно вести две линии (зеленая и красная), то этот блок надо указывать.
Если от функции идет только зеленая линия - не указывать.
Формат [FUNCTION_LOGIC]
Сравнение или больше 0
Будет так: if (fun(5)>0)
CODE:[FUNCTION_LOGIC]
>0
[END]
Сравнение со строкой
Будет так: if (fun(5)=="wwwwww ee")
CODE:[FUNCTION_LOGIC]
=="wwwwww ee"
[END]
Без условия.
Будет так: if (fun(5))
CODE:[FUNCTION_LOGIC]
[END]
Если данного блока нет, то будет так
fun(5);
В зависимости от присутствия данного блока от функции можно вести только зеленую линию или зеленую и красную.
В данном тесте от блоков mouse и key можно только зеленую вести, а от блока Блок - зеленую и красную.
(Добавление)
Улучшил юзабилити диалоговых окон.
Они появляются в месте блока. Не вызываются повторно, а активируются. Активируются все окна открытые при работе с каким то диалогом, если они были под низом. |
|
|
Kibor |
Отправлено: 18 Апреля, 2021 - 21:36:07
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Реализовал генератор переменных.
К примеру есть такой скрипт:
Код (Отобразить)CODE:int Image0[24][20]//Объявляем один раз с номером 0
loadimage (#Image0[0][0], "C:\A.bmp");//Загружаем один раз
int Image1[24][20];//Объявляем один раз с номером 1
loadimage (#Image1[0][0], "C:\B.bmp");//Загружаем один раз
int Kol_Kib, K_kib;
int X_Kib[1000], Y_kib[1000];
if (FindImage(#Image0[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0)//Ищем A.bmp
{
}
if (FindImage(#Image1[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0)//Ищем B.bmp
{
}
if (FindImage(#Image0[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0)//Ищем A.bmp
{
}
if (FindImage(#Image1[0][0], 1, #K_kib, #X_Kib[0], #Y_kib[0], 0)>0)//Ищем B.bmp
{
}
function FindImage(int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
Тут у нас 4 блока поиска изображения, но ищется всего 2 изображения.
Поэтому мы должны выделить память под два массива и загрузить эти изображения по одному разу в память.
Как это реализовать в подключаемом файле при создание блока:
Какое изображение мы будем искать зависит от пути к файлу (в данном случае).
Код созданного блока:
CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Поиск изображения", 441, 132;
BUTTON_OK, "Принять", 230, 80, 100, 25;
BUTTON_CANCEL, "Закрыть", 333, 80, 100, 25;
STATIC, "Путь к файлу", 10, 10, 90, 18;
EDIT, 105, 8, 220, 18, string Path;
BUTTON_FILE, "Выбрать файл", 330, 8, 100, 18, Path;
STATIC, "Сколько искать", 10, 30, 90, 18;
EDIT, 105, 28, 220, 18, int Kol;
EDIT, 235, 50, 50, 18, int K;
EDIT, 300, 50, 50, 18, int X;
EDIT, 355, 50, 50, 18, int Y;
COMBO, "Мышь клик" "Мышь нажать" "Мышь отпустить", 10, 50, 212, 200, int M;
[END]
[ASSOC_NUMBER]
Path
[END]
[ASSOC_VAR]
Path="C:\Image_0.bmp";
Kol = Kol_Kib;
X = #X_Kib;
Y = #Y_kib;
K = #K_kib;
M = 0;
Image = #Image~*~;
[END]
[GLOBAL_VAR]
int Kol_Kib, K_kib;
int X_Kib[1000], Y_kib[1000];
int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
[END]
[GLOBAL_SINGLE_CODE]
external(INT, "MessageBoxA", "MessageBoxA", "user32.dll");
[END]
[GLOBAL_REPEAT_CODE]
loadimage (#Image~*~[0][0], ~Path~);
[END]
[FUNCTION_BODY]
function (int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
[END]
[FUNCTION_CALL]
(Image[0][0], Kol, K, X[0], Y[0], M)
[END]
[FUNCTION_LOGIC]
>0
[END]
Блок [ASSOC_NUMBER] отвечает за переменную указанную в [INTERFACE], которая ассоциируется с номером объявленных вспомогательных переменных.
В [INTERFACE] к EDIT в котором находится путь к файлу привязана переменная string Path.
Переменные в [INTERFACE] не входят в генерируемый код. Они предназначены для взаимодействия диалогового окна настроек с Редактором для создания кода.
В блоке [ASSOC_NUMBER] указываем
CODE:[ASSOC_NUMBER]
Path
[END]
Это означает что вспомогательные переменные (в данном случае переменная int Image*[?][?], которую надо объявить и в которую будет загружено изображение) будет пронумерована в соответствие в тем что находится в Path.
Если в Path в различных блоках находится один и тот же путь к файлу, то int Image*[?][?] будет объявлена один раз и один раз будет вызвана для нее loadimage.
Блок [GLOBAL_VAR] отвечает за объявление глобальных переменных, необходимых для работы блока.
CODE:[GLOBAL_VAR]
int Kol_Kib, K_kib;
int X_Kib[1000], Y_kib[1000];
int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
[END]
Пояснение:
~*~ - в это место вставляется номер, который зависит от переменной в [ASSOC_NUMBER]
Сколько в коде содержится блоков с разными Path, столько различных номеров будет у ~*~ и эти переменные будут уникальные.
Одноименные переменные объявляются по одному разу.
~Path~ - в это место вставится то, что содержится в переменной Path после нажатия кнопки Принять.
В данном случае там будет путь к файлу.
~GET(imagewidth("C:\A.bmp"))~ - Функция GET возвращает информацию, запрос о которой находится в его параметре.
В данном случае она вернет ширину изображения C:\A.bmp
Пример:
CODE:int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
Все ~*~ заменятся на номер, который зависит от переменной в блоке [ASSOC_NUMBER]. В данном случае Path. Пути к файлу.
Каждый уникальный путь получит свой номер. Одинаковые будут иметь одинаковые номера и переменная дублироваться не будет.
CODE:int Image0[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
Затем все ~Path~ (Path это переменная, значение которой подставится) заменится на "C:\A.bmp", или что будет в EDIT после нажатия кнопки Принять.
CODE:int Image0[~GET(imagewidth("C:\A.bmp"))~][~GET(imageheight("C:\A.bmp"))~];
Затем все ~GET(....)~ заменятся на возвращаемые ей значения. В данном случае ширину и высоту C:\A.bmp
В итоге будет сгенерированя переменная
25 и 12, это ширина и высота изображения, которое будем загружать в массив.
Блок [ASSOC_VAR] отвечает за ассоциацию названий переменных с переменным в [INTERFACE] и [FUNCTION_CALL]
Пример:
CODE:[INTERFACE]
...........................
EDIT, 235, 50, 50, 18, int K;
...........................
[END]
CODE:[ASSOC_VAR]
..............................
K = #K_kib;
.................................
[END]
CODE:[FUNCTION_CALL]
(Image[0][0], Kol, K, X[0], Y[0], M)
[END]
Означает то, что то что записано в EDIT будет вставлено в вызов функции на место переменной K
По умолчанию в [ASSOC_VAR] указано #K_kib. Если мы в EDIT изменим это, при вызове функции на место K будет вставлен другой текст (имя переменной)
.......................................................................................................
В [INTERFACE] добалено создание еще EDIT
EDIT_WRITE_RETURN
При создание этого поля становится возможно генерировать вызов функции такого плана:
Где Rez, это имя переменной, которое введено в это поле.
Если это поле оставить пустым, будет такой вызов:
.......................................................................................................
Код блока FindImage (Отобразить)CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Поиск изображения", 441, 132;
BUTTON_OK, "Принять", 230, 80, 100, 25;
BUTTON_CANCEL, "Закрыть", 333, 80, 100, 25;
STATIC, "Путь к файлу", 10, 10, 90, 18;
EDIT, 105, 8, 220, 18, string Path;
BUTTON_FILE, "Выбрать файл", 330, 8, 100, 18, Path;
STATIC, "Сколько искать", 10, 30, 90, 18;
EDIT, 105, 28, 220, 18, int Kol;
EDIT, 235, 50, 50, 18, int K;
EDIT, 300, 50, 50, 18, int X;
EDIT, 355, 50, 50, 18, int Y;
COMBO, "Мышь клик" "Мышь нажать" "Мышь отпустить", 10, 50, 212, 200, int M;
[END]
[ASSOC_NUMBER]
Path
[END]
[ASSOC_VAR]
Path="C:\Image_0.bmp";
Kol = Kol_Kib;
X = #X_Kib;
Y = #Y_kib;
K = #K_kib;
M = 0;
Image = #Image~*~;
[END]
[GLOBAL_VAR]
int Kol_Kib, K_kib;
int X_Kib[1000], Y_kib[1000];
int Image~*~[~GET(imagewidth(~Path~))~][~GET(imageheight(~Path~))~];
[END]
[GLOBAL_SINGLE_CODE]
external(INT, "MessageBoxA", "MessageBoxA", "user32.dll");
[END]
[GLOBAL_REPEAT_CODE]
loadimage (#Image~*~[0][0], ~Path~);
[END]
[FUNCTION_BODY]
function (int #image, int kol, int #mK, int #mX, int #mY, int Mouse)
{
mK=findimage(kol, #image[0][0], -1, #mX[0], #mY[0], 0, 0, 1024, 768, -1);
if (mK<0)MessageBoxA(0, "Ошибка", "Окно", 0);
if (Mouse==0)mouse(LEFT, mX[0], mY[0]);
if (Mouse==1)mousedown(LEFT, mX[0], mY[0]);
if (Mouse==2)mouseup(LEFT, mX[0], mY[0]);
return mK;
}
[END]
[FUNCTION_CALL]
(Image[0][0], Kol, K, X[0], Y[0], M)
[END]
[FUNCTION_LOGIC]
>0
[END]
Код блока OpenProcess (Отобразить)CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Открыть процесс", 370, 102;
BUTTON_OK, "Принять", 159, 50, 100, 25;
BUTTON_CANCEL, "Закрыть", 262, 50, 100, 25;
STATIC, "Указатель на окно", 10, 10, 120, 18;
EDIT, 135, 8, 220, 18, win Win;
STATIC, "Переменная", 10, 30, 90, 18;
EDIT_WRITE_RETURN, 100, 30, 70, 18, int Return;
[END]
[ASSOC_VAR]
Win = window ("Калькулятор", "CalcFrame", -1);
Return = Proc;
[END]
[GLOBAL_VAR]
win W = ~Win~;
int Proc;
[END]
[FUNCTION_BODY]
function ()
{
return openprocess(W);
}
[END]
[FUNCTION_CALL]
()
[END]
.......................................................................................................
Посмотреть как это работает можно скачав архив.
В нем есть два блока в папке templates
После создания блоков надо открыть их свойства и нажать Принять (после изменения или не изменения данных в диалогах настроек).
Затем нажать кнопку Получить код. Выйдет диалог в объявленными переменными и вызовами функций.
(Добавление)
Обновил.
Баг устранил.
(Добавление)
Выложил правильный файл блока OpenProcess
Старый. В котором не возможно было в разных блоках указать разные указатели на окна, так как переменная не копировалась в зависимости от разных указателей.
CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Открыть процесс", 370, 102;
BUTTON_OK, "Принять", 159, 50, 100, 25;
BUTTON_CANCEL, "Закрыть", 262, 50, 100, 25;
STATIC, "Указатель на окно", 10, 10, 120, 18;
EDIT, 135, 8, 220, 18, win Win;
STATIC, "Переменная", 10, 30, 90, 18;
EDIT_WRITE_RETURN, 100, 30, 70, 18, int Return;
[END]
[ASSOC_VAR]
Win = window ("Калькулятор", "CalcFrame", -1);
Return = Proc;
[END]
[GLOBAL_VAR]
win W = ~Win~;
int Proc;
[END]
[FUNCTION_BODY]
function ()
{
return openprocess(W);
}
[END]
[FUNCTION_CALL]
()
[END]
Новый. Где все работает корректно. Переменные на указатели копируются столько, сколько разных указателей.
CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Открыть процесс", 370, 102;
BUTTON_OK, "Принять", 159, 50, 100, 25;
BUTTON_CANCEL, "Закрыть", 262, 50, 100, 25;
STATIC, "Указатель на окно", 10, 10, 120, 18;
EDIT, 135, 8, 220, 18, win Win;
STATIC, "Переменная", 10, 30, 90, 18;
EDIT_WRITE_RETURN, 100, 30, 70, 18, int Return;
[END]
[ASSOC_NUMBER]
Win
[END]
[ASSOC_VAR]
Win = window ("Калькулятор", "CalcFrame", -1);
Return = Proc;
[END]
[GLOBAL_VAR]
win W~*~ = ~Win~;
int Proc;
[END]
[FUNCTION_BODY]
function ()
{
return openprocess(W~*~);
}
[END]
[FUNCTION_CALL]
()
[END]
|
|
|
|