Kibor |
Отправлено: 10 Апреля, 2021 - 21:19:36
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Приступил к реализации принципа работы редактора.
Протестировать можно нажав на кнопку ТЕСТ в правом верхнем углу. В папке с редактором лежит файл Блок.txt, который можно редактировать.
Данный редактор не будет содержать в себе готовые блоки. Все блоки будут подключаться с файлов, которые пользователь сможет создавать сам и импортировать в редактор для дальнейшего использования. Или использовать созданные другими пользователями.
При импорте в редакторе будет на панели соответствующая этому блоку кнопка.
Созданные таким образом блоки будут содержать в себе весь функционал, который присутствует в старом редакторе.
То есть диалоговое окно настроек, тело функции, вызов функции, глобальный код, возвращаемые значения, выбор переходов Истина Ложь.
Все это можно будет создавать и корректировать созданные блоки по своему усмотрению.
По сути сам редактор будет просто универсальным движком, снабдив который соответствующей библиотекой блоков, можно будет создавать код на любом языке.
Файл созданного блока выглядит таким образом:
В нем содержится вся нужная информация от диалогового окна настроек (какой появляется при выборе свойства блока в старом редакторе), до кода, который он будет генерировать.
Пояснение:
BUTTON_CANCEL - Закрывает окно настроек не применив изменения.
BUTTON_OK - Закрывает окно настроек применив изменения.
Данные кнопки не имеют своих переменных и могут быть созданы только по одной.
Далее могут быть созданы в нужном количестве:
STATIC - Статичный текст. Не имеет переменной.
EDIT - Однострочный текст. Имеет переменную. Может принимать тип string, int, double, char, win, или переменную любого типа.
EDIT_MULTILINE - Многострочный текст. Может принимать тип string.
CHECK - Галка. Имеет переменную типа int, которая соответствует 0 или 1.
COMBO - Выпадающий список. Может возвращать string (текст пункта) или номер пункта в зависимости от указанного типа переменной. string или int.
BUTTON_FILE - Кнопка вызывающая диалоговое окно для выбора файла. Не имеет своей переменной. Указывается переменная типа string EDIT или EDIT_MULTILINE. После выбора файла в соответствующее поле к которому привязана переменная будет введен выбранный путь.
BUTTON_PATH - Кнопка вызывающая диалоговое окно для выбора пути. Все аналогично BUTTON_FILE.
CODE:[INTERFACE]
DIALOG, "Диалог настроек", 577, 452;
BUTTON_OK, "Принять", 365, 400, 100, 25;
BUTTON_CANCEL, "Закрыть", 470, 400, 100, 25;
STATIC, "Простой Edit", 10, 10, 90, 18;
STATIC, "Мультитекст", 10, 40, 90, 18;
EDIT, 105, 8, 120, 18, string Edit_S;
EDIT, 255, 80, 120, 18, int Edit_I;
EDIT, 255, 110, 120, 18, double Edit_D;
EDIT_MULTILINE, 105, 38, 120, 108, string Edit_Sm;
CHECK, "Включить опцию", 10, 155, 105, 18, int Check;
COMBO, "Выбор строки 1" "Выбор строки 2" "Выбор строки 3", 10, 180, 212, 200, string Combo_S;
STATIC, "Вернет текст строки", 250, 180, 190, 18;
COMBO, "Выбор числа 1" "Выбор числа 2" "Выбор числа 3", 10, 250, 212, 200, int Combo_I;
STATIC, "Вернет номер строки", 250, 250, 190, 18;
BUTTON_FILE, "Выбрать файл", 255, 10, 200, 25, Edit_S;
BUTTON_PATH, "Выбрать путь", 255, 50, 200, 25, Edit_Sm;
[END]
[GLOBAL]
external(INT, "DeleteFile", "DeleteFileA", "kernel32.dll");
int Global_Var;
[END]
[FUNCTION_BODY]
function Fun(string Edit_S, int Edit_I, int Check, string Combo_S)
{
if (Combo_I==1)
{
if (Edit_S==Combo_S)return 1;
}
return 0;
}
[END]
[FUNCTION_CALL]
Fun("C:\", 52, 0, "Выбор строки 2")
[END]
[FUNCTION_RETURN]
ON;
TRUE, 1;
FALSE, 0;
[END]
Диалоговые окна свойств блоком являются не модальными и могут быть одновременно открыты и использованы для разных блоков схемы. |
|
|
Kibor |
Отправлено: 11 Апреля, 2021 - 21:42:45
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обновил архив.
Доработал создание своих боков. Конкретнее механизм взаимодействия с созданным диалоговым окном.
В архиве код созданного блока:
CODE:[ESCAPE_CHAR]
^
[END]
[INTERFACE]
DIALOG, "Диалог настроек", 577, 452;
BUTTON_OK, "Принять", 365, 400, 100, 25;
BUTTON_CANCEL, "Закрыть", 470, 400, 100, 25;
STATIC, "Простой Edit", 10, 10, 90, 18;
STATIC, "Мультитекст", 10, 40, 90, 18;
EDIT, 105, 8, 120, 18, string Edit_S;
EDIT, 255, 80, 120, 18, int #Edit_I;
EDIT, 255, 110, 120, 18, double Edit_D;
EDIT_MULTILINE, 105, 38, 120, 108, string Edit_Sm;
CHECK, "Включить опцию", 10, 155, 105, 18, int Check;
COMBO, "Выбор строки 1" "Выбор строки 2" "Выбор строки 3", 10, 180, 212, 200, string Combo_S;
STATIC, "Вернет текст строки", 250, 180, 190, 18;
COMBO, "Выбор числа 1" "Выбор числа 2" "Выбор числа 3", 10, 250, 212, 200, int Combo_I;
STATIC, "Вернет номер строки", 250, 250, 190, 18;
BUTTON_FILE, "Выбрать файл", 255, 10, 200, 25, Edit_S;
BUTTON_PATH, "Выбрать путь", 255, 50, 200, 25, Edit_Sm;
[END]
[GLOBAL]
external(INT, "DeleteFile", "DeleteFileA", "kernel32.dll");
int Global_Var;
[END]
[FUNCTION_BODY]
function Fun(string Edit_S, int #Edit_I, double Edit_D, string Edit_Sm, int Check, string Combo_S, int Combo_I)
{
string a="^"[END]";
if (Combo_I==1)
{
if (Edit_S==Combo_S)return 1;
}
return 0;
}
[END]
[FUNCTION_CALL]
Fun("C:\boltalka\Log.txt", #Yk_I, 0.25, "Строка1^r^nСтрока 2", 1, "Выбор строки 2", 2);
[END]
[FUNCTION_RETURN]
ON;
TRUE, 1;
FALSE, 0;
[END]
[ESCAPE_CHAR] отвечает за установку экранирующего символа. По умолчанию им является ^. Если его надо изменить, то этот блок указывается вверху.
CODE:[FUNCTION_CALL]
Fun("C:\boltalka\Log.txt", #Yk_I, 0.25, "Строка1^r^nСтрока 2", 1, "Выбор строки 2", 2);
[END]
Указывают параметры по умолчанию, с какими будет открываться диалоговое окно настроек.
Параметры заполняются в соответствие с параметрами
CODE:[FUNCTION_BODY]
function Fun(string Edit_S, int #Edit_I, double Edit_D, string Edit_Sm, int Check, string Combo_S, int Combo_I)
{
.........
и устанавливаются значения контролов в соответствие присвоенными им переменными.
При нажатие Принять, все заново введенные параметры считываются и заполняются соответствующие переменные, которые будут записаны в функцию при ее вставке в код. |
|
|
Zireael |
Отправлено: 12 Апреля, 2021 - 00:57:44
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: BUTTON_CANSEL
BUTTON_CANСEL
Цитата: BUTTON_FILE
Лучше вызывать нормальное окно для выбора файла, а не маленькое окошечко, в котором отображается 5 строчек.
CODE:#define MAX_PATH 260
external(INT, "GetOpenFileName", "GetOpenFileNameA", "Comdlg32.dll");
external(INT, "sprintf_s", "sprintf_s", "msvcrt.dll");
new char path[MAX_PATH]; // сюда путь к файлу получим
path[0]=0;
char ofn[88]; // OPENFILENAMEA structure
initialarray(#ofn[0], 0);
char strFilter[99]; // формат файла
sprintf_s(address(#strFilter[0]), sizearray(strFilter), "%s%c%s%c%s%c%s%c%c",
"Точечный рисунок", 0, "*.bmp", 0,
"Текстовый файл", 0, "*.txt", 0, 0);
new char strInitialDir[MAX_PATH];
strcpy(#strInitialDir[0], pathfolder()); // начальный каталог
char strTitle[99];
strcpy(#strTitle[0], "Открыть файл"); // заголовок диалога
writeaddress(sizearray(ofn), address(#ofn[0]));
writeaddress(address(#strFilter[0]), address(#ofn[12])); // тип файла
writeaddress(address(#path[0]), address(#ofn[28])); // путь к файлу
writeaddress(sizearray(path), address(#ofn[32])); // размер буфера
writeaddress(address(#strInitialDir[0]), address(#ofn[44])); // начальный каталог
writeaddress(address(#strTitle[0]), address(#ofn[48])); // заголовок диалога
int x=GetOpenFileName(address(#ofn[0]));
if(x)messagebox(format(#path[0]));
else messagebox("Ничего не выбрано"); |
|
|
Kibor |
Отправлено: 12 Апреля, 2021 - 01:06:18
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael пишет: Цитата:
BUTTON_CANSEL
BUTTON_CANСEL
Да уж......)
Обновил архив и исправил примеры.
Zireael пишет: Лучше вызывать нормальное окно для выбора файла, а не маленькое окошечко, в котором отображается 5 строчек.
Согласен. |
|
|
ivantu |
Отправлено: 12 Апреля, 2021 - 10:06:02
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
Kibor пишет: Обновил.
Кнопка "Тест" так и не работает
Kibor пишет: А что показывает кнопка правее кнопок масштаба?
|
|
|
|