Кибор » Кибор - Интегрированная среда разработки ботов » Тестирование Кибор » Новый Визуальный редактор

Страниц (18): В начало « ... 6 7 8 9 [10] 11 12 13 14 ... » В конец
 

91. ivantu - 26 Апреля, 2021 - 07:19:59 - перейти к сообщению
 Kibor пишет:
ivantu , А каким кодом окна создаете?


стандартными, если вы про это?

createdialog(0);

Но мне если честно, понравился этот вариант, т.к. нет ограничений на диалоги:

ссылка
92. Kibor - 26 Апреля, 2021 - 09:18:05 - перейти к сообщению
Я имею ввиду кнопки и тд как делаете?
createdialog(0); только диалог создает.

==================================

Обновил архив.
В архиве появился файл test

Этот блок содержит функцию возвращающую результат и позволяет генерировать различные вариации кода по усмотрению пользователя:

С логикой:
CODE:
win win0 = window("Калькулятор","CalcFrame",-1);

if (test(#win0)>0){}

function test(win #w)
{
return openprocess(w);
}


С объявление переменной с указанным пользователем именем и возврат результата в нее:
CODE:
win win0 = window("Калькулятор","CalcFrame",-1);
int Rez;

Rez=test(#win0);

function test(win #w)
{
return openprocess(w);
}


=========================

Как реализовано:
В блоке [INTERFACE] необходимо создать Edit типа EDIT_WRITE_RETURN

То что будет прописано в нем будет вставлено в виде
CODE:
Var =

После него будет вызов функции.
CODE:
Var = Fun();

Так же надо создать блок [FUNCTION_LOGIC]

Если поле EDIT_WRITE_RETURN оставить пустым, будет сгенерирован логический вариант
CODE:
if (test(#win0)>0){}


Ели в нем прописать имя переменной, буде объявлена такая переменная и сгенерирован такой вариант
CODE:
Rez=test(#win0);


Переменная будет объявлена с таким именем, если в блоке [GLOBAL_VAR] прописать не жесткое условие
CODE:
int Rez;

а
CODE:
int ~Return~;

где ~Return~ является именем переменной, привязанной к EDIT_WRITE_RETURN в блоке [INTERFACE].

То есть вместо ~Return~ будет вставлено то, что пользователь ввел в это поле.

По умолчанию при наличие блока [FUNCTION_LOGIC] от блока можно вести красную линию. Но при наличие переменной в поле EDIT_WRITE_RETURN данная возможность отключается и будет включена только при очищение этого поля.
Если линия была и пользователь заполнил это поле и нажал принять - линия удалится.

В блоке test есть блок [FUNCTION_LOGIC], но по умолчанию в поле EDIT_WRITE_RETURN находится имя переменной Rez. Поэтому после создания блока от него нельзя вести красную линию. Данная возможность появится только после очищения поля.

Код блока test
CODE:
[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 = Rez;
W=#win~*~;
[END]

[GLOBAL_VAR]
win win~*~ = ~Win~;
int ~Return~;
[END]


[FUNCTION_BODY]
function (win #w)
{
return openprocess(w);
}
[END]

[FUNCTION_CALL]
(W)
[END]


[FUNCTION_LOGIC]
>0
[END]


======================

Если при использование EDIT_WRITE_RETURN отсутствует блок [FUNCTION_LOGIC] , то при заполненном поле будет объявляться переменная и генерироваться такой код:

CODE:
win win0 = window("Калькулятор","CalcFrame",-1);
int Proc;

Proc=OpenProcess(#win0);

function OpenProcess(win #w)
{
return openprocess(w);
}


При пустом такой
CODE:
win win0 = window("Калькулятор","CalcFrame",-1);

OpenProcess(#win0);

function OpenProcess(win #w)
{
return openprocess(w);
}
93. Kibor - 26 Апреля, 2021 - 11:03:39 - перейти к сообщению
Описание блоков шаблона:

[ESCAPE_CHAR]
Позволяет указать экранирующий символ.
Если блок отсутствует, по умолчанию экранирующим символом будет ^

============================================================================================

[APPEARANCE] - Задает цвет и размерность блока. Размер делает кратным 2 в сторону увеличения.
CODE:
[APPEARANCE]
COLOR = 50, 50, 150;
SIZE_X = 12;
SIZE_Y =8;
[END]

Размер задается в шаге редактора. При отсутствие создается Блок фиксированного цвета и размера.

============================================================================================

[INTERFACE]
Описывает диалоговое окно настройки, которое появляется при выборе свойства Блока виз редактора.

DIALOG - создает окно.

BUTTON_OK - создает кнопку, при нажатие на которую все изменения применяются.

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

STATIC - вставляет статичный текст

EDIT - создает поле для ввода однострочного текста. К нему надо указать переменную, в которую будет записан введенный текст после нажатия кнопки BUTTON_OK.
Может принимать любой тип данных, имена переменных, вызв других функций и тд. Если это текст string или char, надо брать в двойные или одинарные кавычки.

EDIT_WRITE_RETURN - создает поле для ввода однострочного текста. Предназначен для указания имени переменной в которую будет записан результат выполнения функции. К нему надо указать переменную, в которую будет записан введенный текст после нажатия кнопки BUTTON_OK.
CODE:
Rez=fun();


EDIT_MULTILINE - создает поле для ввода многострочного текста. К нему надо указать переменную, в которую будет записан введенный текст после нажатия кнопки BUTTON_OK.
Может принимать только текст. Текст в кавычки брать не надо, но при использование данного текста он будет находится в кавычках. Использовать для инициализации переменных и тд.

EDIT_CODE - создает поле для ввода многострочного текста. К нему надо указать переменную, в которую будет записан введенный текст после нажатия кнопки BUTTON_OK.
Может принимать любые текстовые данные. Текст в кавычки брать не надо, и при использование данного текста он не будет находится в кавычках. Использовать для вставки частей кода. Для блоков кода, объявления переменных и тд.

CHECK - создает галку. К нему надо указать переменную типа int, в которой будет 0 или 1 после нажатия кнопки BUTTON_OK.

COMBO - создает выпадающий список. К нему надо указать переменную типа int или string, в которой будет номер выбранного пункта или текст пункта после нажатия кнопки BUTTON_OK.

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

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

============================================================================================

[ASSOC_NUMBER] - в этом блоке указываем имена переменных с блока [INTERFACE], уникальность значений которых будет нумеровать генерируемые данные. Или наоборот, если Блоки виз реактора имеют одинаковые значения этих переменных, то у них будут одинаковые номера.
Подробнее ниже.

============================================================================================

[ASSOC_VAR] - предназначен для ассоциации переменных в блоке [INTERFACE] и имен переменных в блоке [CALL] с указанными данными после =.
Пояснение:

 Цитата:
[INTERFACE]
DIALOG, "Диалог", 250, 90;
EDIT, 8, 8, 228, 20, string D_Var;
BUTTON_OK, "Принять", 32, 36, 100, 20;
BUTTON_CANCEL, "Закрыть", 136, 36, 100, 20;
[END]

[ASSOC_VAR]
D_Var = Var;
[END]

[GLOBAL_VAR]
string D_Var;
[END]

[CALL]
(D_Var)
[END]


При открытие диалогового окна в переменную D_Var будет записано то, что идет после равно в блоке [ASSOC_VAR]
То есть в D_Var будет записан текст Var и показан в EDIT, к которому привязана переменная D_Var.
После редактирования пользователем этого поля и нажатие кнопки BUTTON_OK в D_Var запишется новый текст.
В блоках [GLOBAL_VAR] и [CALL] D_Var заменится на значение, которое в нем находится.

Пример с использованием нумерации:
Нумерация предназначена для объявления и использования уникальных имен переменных, когда в этом есть необходимость.
К примеру мы указали что в функции findimage ищем другой файл изображения.
Для него надо объявить уникальный двухмерный массив, в который загрузим это изображение.

Пример без возможности изменить имя переменной:

 Цитата:
[INTERFACE]
DIALOG, "Диалог", 250, 90;
EDIT, 8, 8, 228, 20, string D_Var;
BUTTON_OK, "Принять", 32, 36, 100, 20;
BUTTON_CANCEL, "Закрыть", 136, 36, 100, 20;
[END]

[ASSOC_NUMBER]
D_Var
[END]

[ASSOC_VAR]
D_Var = Var;
C_Var = Var~*~;
[END]

[GLOBAL_VAR]
string Var~*~;
[END]

[CALL]
(C_Var)
[END]

При уникальности значения переменной, имя которой (можно указывать несколько переменных) указано в блоке [ASSOC_NUMBER], вместо ~*~ будет вставлен уникальный номер.
И наоборот, если значение переменной в блоке [ASSOC_NUMBER] равно значению в другом Блоке виз редактора (такого же типа), то номер у них будет одинаков.
На данном примере при открытие диалога в D_Var будет записан текст после = (Var). После изменения в EDIT и нажатия BUTTON_OK, то что после = будет изменено на новое значение. И в D_Var попадет то что ввел пользователь.
В блоке [ASSOC_VAR] в C_Var будет записан текст Var, к которому прибавится номер вместо ~*~.
Так же само в блоке [GLOBAL_VAR] будет и с string Var~*~;
То есть string Var~*~; преобразуется в string Var0; или string Var1; и тд.
В блоке [CALL] вместо C_Var будет то, что записано в C_Var в блоке [ASSOC_VAR]. То есть Var0 или Var1 и тд.


Пример с возможностью пользователю изменить имя переменной (в этом случае будет объявлена новая переменная с этим именем):

 Цитата:
[INTERFACE]
DIALOG, "Диалог", 250, 90;
EDIT, 8, 8, 228, 20, string D_Var;
BUTTON_OK, "Принять", 32, 36, 100, 20;
BUTTON_CANCEL, "Закрыть", 136, 36, 100, 20;
[END]

[ASSOC_NUMBER]
D_Var
[END]

[ASSOC_VAR]
D_Var = Var;
C_Var = ~D_Var~~*~;
[END]

[GLOBAL_VAR]
string ~D_Var~~*~;
[END]

[CALL]
(C_Var)
[END]


Все так же само как и выше, но вместо ~D_Var~ вставится значение, которое оно содержит.
То есть после ввода в поле пользователем и нажатия кнопки BUTTON_OK, в D_Var запишется введенный текст. Им будет заменено все что ~D_Var~
Соответственно
C_Var = ~D_Var~~*~; станет
C_Var = новое_значение0;
string ~D_Var~~*~; станет
string новое_значение0;
и в
[CALL] будет
(новое_значение0)

Что бы в [CALL] указать указатель на переменную надо ее указать в C_Var = #~D_Var~~*~;

Если необходимо сгенерировать нужные данные (к примеру выделить двухмерный массив для загрузки изображения, то надо выделять массив размерностью этого изображения), то необходимо воспользоваться функцией GET
Пример:
~GET(imagewidth(~Path~))~
преобразуется в
~GET(imagewidth("То что находится в Path"))~, к примеру там находится путь к изображению
~GET(imagewidth("C:\Image_0.bmp"))~
Затем вместо ~GET(imagewidth("C:\Image_0.bmp"))~ будет вставлено число равное ширине этого изображения.

Еще пример использования функции GET
~GET(amtelement(~D_Color~))~
Вернет количество элементов, которые находятся в D_Color разделенных запятыми.
К примеру D_Color = 0,5, 7
~GET(amtelement(0,5, 7))~ вернет 3, которое вставится вместо GET

Еще пример использования функции GET для регулярного выражения:
Возвращает часть строки согласно условиям регулярного выражения.
Пример:
CODE:
~GET(regexsearch("C:\Image_0.bmp", "(?<=\\)(.*)+(?=\.)"))~

Первый параметр функции regexsearch строка с которой ищем.
Второй - регулярное выражение.

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

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

-----

Так же может быть третий параметр в regexsearch.
Число, соответствующее значению одной или сумме значений нескольких констант:
CODE:
IGNORECASE=8
SINGLELINE=1
MULTILINE=2
GLOBAL=4
RIGHTTOLEFT=16
EXTENDED=32

Описание констант -(для просмотра ссылки Вам необходимо авторизоваться)
Пример:
IGNORECASE
CODE:
~GET(regexsearch("C:\Image_0.bmp", "(?<=\\)(.*)+(?=\.)", 8))~


IGNORECASE+MULTILINE
CODE:
~GET(regexsearch("C:\Image_0.bmp", "(?<=\\)(.*)+(?=\.)", 10))~


============================================================================================

[GLOBAL_VAR] - в этом блоке прописываются объявления глобальных переменных. Правила генерирования пояснены выше.


============================================================================================

[REGEXPLACE_CODE] - в этом блоке прописывается регулярные выражения которые будут выполнены в самом конце генерирования кода.
С помощью них можно произвести замену указанных частей кода на свои.
Команды в этом блоке выполняются в последовательности снизу вверх.
Синтаксис:
 Цитата:
Что менять1 = На что менять1 ;
Что менять2 = На что менять2 ;



Пояснение к синтаксису регулярнго выражения в блоке [REGEXPLACE_CODE]:
CODE:
"RESOURCE" ~%13~~%10~"\{"~%13~~%10~ = "RESOURCE"~%13~~%10~"{"~%13~~%10~~Path~~%59~~%13~~%10~;

Символы
CODE:
=
;
перенос строки
новая строка

если они не в кавычках надо заменять на команды ~%код_символа~

Данное выражение означает заменить
CODE:
RESOURCE
{


на
CODE:
RESOURCE
{
~Path~;


где ~Path~ будет заменено на значение переменной Path.

Пример:
Есть сгенерированный код:
CODE:
RESOURCE
{
}

Если указать в блоке [REGEXPLACE_CODE] регуоярное выражение:
CODE:
[REGEXPLACE_CODE]
"RESOURCE" ~%13~~%10~"\{"~%13~~%10~ = "RESOURCE"~%13~~%10~"{"~%13~~%10~~Path~~%59~~%13~~%10~;
[END]

данный код заменится на
CODE:
RESOURCE
{
"C:\Image_0.bmp";
}

[END][/code]
где "C:\Image_0.bmp" значение переменной Path

Еще пример:
При наличие такого кода:
CODE:

RESOURCE
{
}

function load_images_RES()
{
}


Команды
CODE:
[REGEXPLACE_CODE]
"function load_images_RES\(\)"~%13~~%10~"\{"~%13~~%10~ = "function load_images_RES()"~%13~~%10~"{"~%13~~%10~"unpack("~Path~", tempfolder()+"~%34~~File~~%34~", 1);"~%13~~%10~;
"function load_images_RES\(\)"~%13~~%10~"\{"~%13~~%10~ = "function load_images_RES()"~%13~~%10~"{"~%13~~%10~"loadimage (#Image"~*~"[0][0], tempfolder()+"~%34~~File~~%34~");"~%13~~%10~;
"RESOURCE" ~%13~~%10~"\{"~%13~~%10~ = "RESOURCE"~%13~~%10~"{"~%13~~%10~~Path~~%59~~%13~~%10~;
[END]


сгенерируют такой код:
CODE:
RESOURCE
{
"C:\Image_0.bmp";
}

function load_images_RES()
{
unpack("C:\Image_0.bmp", tempfolder()+"Image_0.bmp", 1);
loadimage (#Image0[0][0], tempfolder()+"Image_0.bmp");
}



Вызов функции load_images_RES()
можно сделать в блоке
CODE:
[GLOBAL_REPEAT_CODE]
load_images_RES();
[END]


============================================================================================

[GLOBAL_SINGLE_CODE_TOP] - в этом блоке прописывается глобальный код, выполняемый один раз вверху скрипта.
#define, #include, external и код который не должен меняться, хотя на этот блок действует привило замены ~...~
#define, #include, external отделяются от другого кода.
Если в коде где то есть ~...~, то будет замена и код станет уникальным и вставится повторно.
Данный код должен быть закончен по своему смыслу выполнения.

============================================================================================


[GLOBAL_SINGLE_CODE_BOTTOM] - в этом блоке прописывается глобальный код, вставляемый один раз в самом низу скрипта.
Использовать для создания независимых блоков кода.
К примеру такой код блока [GLOBAL_SINGLE_CODE_BOTTOM]
CODE:
[GLOBAL_SINGLE_CODE_BOTTOM]
RESOURCE
{
}
[END]

вставит в самом низу код:
CODE:
RESOURCE
{
}

Затем с помощью команд блока [REGEXPLACE_CODE] можно вставлять в этот блок кода свои строчки кода.
Данный код должен быть закончен по своему смыслу выполнения.

============================================================================================


[GLOBAL_REPEAT_CODE] - предназначен для глобального кода, выполняемого один раз, который может быть продублирован, если он уникален.
На него действует правило замены ~...~
Использовать для таких функций как
loadimage, loadsymbolbase и тд.

============================================================================================

[FUNCTION_BODY] - не обязательный блок, содержащий тело вызываемой функции.

============================================================================================

[CALL] - В нем прописано как будут заполнятся параметры вызываемой функции.
Имена переменных ассоциируются с именами переменных в блоке [ASSOC_VAR]

============================================================================================

[FUNCTION_LOGIC] - не обязательный блок. В нем прописано условие, по которому с Блока виз редактора можно перейти по зеленой или красной линии.
Если этого блока нет и нет блока [LOGIC], можно вести только зеленую линию.
Если указан раздел [FUNCTION_LOGIC] , формирутся код:
 Цитата:
if ((то что в блоке [CALL])(условие)) goto ...;
goto ...;

Раздел [LOGIC] не совместим с разделом [FUNCTION_LOGIC]

============================================================================================


[LOGIC] - не обязательный блок. В нем указано или с блока можно вести красный переход.
Если этого блока нет и нет блока [FUNCTION_LOGIC], можно вести только зеленую линию.
Если указан раздел [LOGIC], а в нем есть параметр:
 Цитата:
[LOGIC]
FALSE=1
[END]

формируется код
 Цитата:
(то что в блоке [CALL]) goto ...;
goto ...;

Раздел [LOGIC] не совместим с разделом [FUNCTION_LOGIC]

============================================================================================


[INFO] - не обязательный блок. Его назначение указать какая информация будет выведена в Блок в Визуальную схему в виде текста.
Данная информация добавляется сразу после названия функции или шаблона, который идет в Блоке по умолчанию.
Синтаксис:
CODE:
[INFO]
[ENDL]>>~GET(regexsearch(~Path~, "(?<=\\)(.*)+(?=\.)"))~>>[ENDL]>>Comment
[END]


[ENDL] - Перевод строки.
>> - Разделение параметров.


============================================================================================

[EVENT] Его назначение отслеживать состояние галок, текста и тд при открытом диалоговом окне.
Пример:
CODE:
[EVENT]
IF (GT==0)ENABLE(GETID(Col_T), 0);
IF (GT==1)ENABLE(GETID(Col_T), 1);
IF (GF==0)ENABLE(GETID(Col_F), 0);
IF (GF==1)ENABLE(GETID(Col_F), 1);
[END]


IF (GT==0)ENABLE(GETID(Col_T), 0);

IF (GT==0) - условие, где GT это имя переменной, привязанной при создание контрола.

В условиях раздела [EVENT] могут применяться

CODE:
==
!=
<
>
<=
>=


В шаблоне ReadText это переменная привязана к CHECK
CODE:
CHECK, "Учитывать Цвета текста (через запятую)", 4, 268, 240, 20, int GT;

ENABLE(GETID(Col_T), 0); означает что при соблюдение условия контрол к которому привязана переменная Col_T становится не активным (последний параметр 0). При параметре 1 - станет активным.
CODE:
EDIT, 4, 292, 252, 20, int Col_T;


----------------

Команды в разделе [EVENT]

ENABLE(GETID(Col_T), 0);
Сделать не активным контрол к которому привязана переменная Col_T

ENABLE(GETID(Col_T), 1);
Сделать активным контрол к которому привязана переменная Col_T

---------------------

SENDBUTTON(GETID(G1), 0);
Выключить галку к которой привязана переменная G1

SENDBUTTON(GETID(G1), 1);
Включить галку к которой привязана переменная G1

---------------------

SENDBUTTON(GETID(BB), "Название");
Переименовать кнопку или галку к которой привязана переменная BB

---------------------

SENDEDIT(GETID(E), "Текст");
Ввести текст в EDIT к которому привязана переменная E

---------------------

SENDBUTTON(GETID(CC), "Второй пункт");
Выбрать пункт COMBO к которому привязана переменная CC по его названию

---------------------


SENDBUTTON(GETID(CC), 1);
Выбрать пункт COMBO к которому привязана переменная CC по его номеру

---------------------

MESSAGE("Сообщение")
Вывести сообщение.

---------------------

Эти команды доступны после проверки условий:

IF (A==1) ...Команда
IF (B=="Текст") ...Команда

Это дает возможность сделать активными или не активными нужные контролы, в зависимости от состояния других контролов.



---------------------

Так же в блоке [EVENT] доступны переменные привязанные к выпадающему списку на главном окне визуального редактора, позволяющего выбрать привязку к окну или указателю.

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

Пример раздела [EVENT] Блока FindImage

CODE:
[EVENT]
IF (I_MODE_BIND_WINDOW!=0)SENDBUTTON(GETID(EW), S_MODE_BIND_WINDOW);
IF (I_MODE_BIND_WINDOW!=0)SENDEDIT(GETID(W), W_Kib);
IF (I_MODE_BIND_WINDOW!=0)ENABLE(GETID(EW), 0);
IF (I_MODE_BIND_WINDOW!=0)ENABLE(GETID(W), 0);
IF (I_MODE_BIND_WINDOW!=0)ENABLE(GETID(Screen), 0);
[END]


Данные команды означают:
Если выбран не 0 пункт, в настройках Блока в левом верхнем COMBO выбрать пункт с название пункта выбора привязки по умолчанию.
Сделать не активным список в настройках Блока.
Сделать не активным поле для ввода имени переменной win в настройках Блока.
Сделать не активным поле для ввода указателя на скрин в настройках Блока.
Изменить имя переменной win на W_Kib (без кавычек).

============================================================================================

[GLOBAL_SINGLE_CALL_CODE] - Позволяет указывать код, который вставится один раз перед вызововом функции с раздела [CALL]
При следующих вызовах он вставляться не будет.

 Цитата:
__python_sync
#Импорт
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
__end_python
StartBrowser(0, "C:\Program Files (x86)\Mozilla Firefox\Firefox.exe", pathfolder()+"python\webdriver\geckodriver.exe", "Активный режим", 1024, 768);

StartBrowser(0, "C:\Program Files (x86)\Mozilla Firefox\Firefox.exe", pathfolder()+"python\webdriver\geckodriver.exe", "Активный режим", 1024, 768);
StartBrowser(0, "C:\Program Files (x86)\Mozilla Firefox\Firefox.exe", pathfolder()+"python\webdriver\geckodriver.exe", "Активный режим", 1024, 768);


============================================================================================
94. ivantu - 26 Апреля, 2021 - 12:07:53 - перейти к сообщению
 Kibor пишет:
Я имею ввиду кнопки и тд как делаете?


тогда вот так:

CODE:
function getmessage(0, WM_CREATE){
btn_start= CreateWindow(0, "BUTTON", "Запустить", WS_VISIBLE | WS_CHILD, 183, 2, 90, 25, gethwnd(0), 0, 0, 0);
}
95. Kibor - 26 Апреля, 2021 - 13:34:46 - перейти к сообщению
ivantu , Это несколько затруднительно для открытия и редактирования такого окна, которое встроено в код.
Так как требуется парсить код, выискивая в нем команды, которые отвечают за создание контролов.
С учетом того, что пользователь может его писать в вольном стиле указывая свои стили и применяя переменные вместо числовых значений.
Разве что генерировать новый шаблон.
96. ivantu - 26 Апреля, 2021 - 13:37:47 - перейти к сообщению
Владимир, Вы умный человек, я думаю у вас получится! Это был бы огромный прорыв.
97. Zireael - 26 Апреля, 2021 - 18:43:27 - перейти к сообщению
Добавить кнопку, при нажатии которой заново будут импортированы файлы.
98. Kibor - 27 Апреля, 2021 - 07:26:38 - перейти к сообщению
Обновил архив.
Программа генерирует логику работы скрипта.

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

Если к блоку нет связей, он не генерируется.
Если от блока, от которого можно вести 2 линии, красную и зеленую отведена только зеленая, он в любом случае пойдет по ней. Так же как в старом редакторе. Это дает возможность игнорировать красные линии и использовать функции без проверки.

Если отведена только красная, переход по красной будет только при Не правда. При Правда пойдет на завершение скрипта, так как нет зеленого перехода.

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

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

=================

Отличия от старого редактора:

Расширяемый с помощью внешних шаблонов, который каждый может создать сам или использовать созданные кем то.

Удобный (в будущем)) Резиновые связи.

Быстрый, по сравнению с прошлым.

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

Без ограничений в количестве блоков.

Понятный, минималистичный формат сохранения, так как для сохранения состояния блока в файл достаточно сохранить параметры блока [ASSOC_VAR].

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

И тд..

=================

Добавил кнопку - обновить шаблоны.
99. Zireael - 27 Апреля, 2021 - 18:37:55 - перейти к сообщению
При выборе шаблона переключаться на галку 'Блок'.
Добавить в файл шаблона блок, в котором можно указать цвет, которым этот блок будет отображаться в редакторе, и цвет текста этого блока.
100. ivantu - 28 Апреля, 2021 - 00:14:31 - перейти к сообщению
И пора уже добавить - удалить блок, я не нашел...

Powered by ExBB FM 1.0 Final