Баг: вызов скрипта с диалоговым окном через пользовательское меню

Статус
Закрыто для дальнейших ответов.

eugene10901

Участник
Топикстартер
Сообщения
84
Реакции
17
В версиях ID выше 6.0.5 такая беда: создаю собственное меню, каждый элемент меню вызывает скрипт в файле .jsx. Так вот, скрипт, который выводит окно с кнопками, списками и т.п., "убивает-вешает" ID. Если такой скрипт запустить из панели скриптов, то проблем нет. В ID 6.0.5 такой проблемы еще нет. Во всех последующих версиях появляется. Как быть, чтобы не отказываться от диалоговых окон в скрипте и вызывать скрипт через пользовательское меню, а не из панели скриптов?
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

Выкладывайте код вашего скрипта и тех, которые вызываются. Посмотрим, может и придумается что. А без кода - вряд ли.
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

В строке 169 файла sturtup.jsx не закрыта скобка. Возможно есть еще ошибки. Трудно проверить не имея полного комплекта файлов

Вот работающий сриптик добавляющий пункт в меню Help со ссылкой на файл скрипта:

Код:
#targetengine 'session'
var menuHelp = app.menus.item("$ID/Main").submenus.item("$ID/&Help");


AddScriptMenuItemWithOnInvokeAction(
	menuHelp, 
	'Форматирование файлов книги...', 
	new File(GetScriptFolderName() + '/formatFiles.jsx'));




// Возвращает путь к папке из которой запущен скрипт
function GetScriptFolderName() {
	try {
		app.activeScript.parent.fsName;
	} catch (e) {
		// исключение, если скрипт запущен из редактора ESTK
		return (new File(e.fileName)).parent.fsName;
	}
}


// Добавляет или обновляет пункт меню
function AddScriptMenuItemWithOnInvokeAction(
		parentMenu,                   // меню в которое добавляется элемент
		title,                        // название пункта меню
		scriptFile,                   // объект File ссылающийся на файл скрипта
		/* optional */ nextMenuItem   // пункт меню перед которым будет добавлен элемент
		) {
			
	var menuItem = parentMenu.menuItems.itemByName(title);
	
	// если такой пункт меню существует - обновим его
	if (menuItem.isValid) {
		menuItem.associatedMenuAction.eventListeners.everyItem().remove();
		
		menuItem.associatedMenuAction.addEventListener(
			'onInvoke',
			scriptFile,
			false);
			
		return menuItem;
	}
	// создадим новый
	var sma = app.scriptMenuActions.add(title);
	sma.eventListeners.add('onInvoke', scriptFile, false);


	menuItem = parentMenu.menuItems.add(
		sma, 
		nextMenuItem ? LocationOptions.BEFORE : undefined, 
		nextMenuItem);
	
	return menuItem;
}
 

eugene10901

Участник
Топикстартер
Сообщения
84
Реакции
17
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

Спасибо за внимание.
В строке 169 файла sturtup.jsx не закрыта скобка
: скобки все закрыты, иначе компилятор не запустит скрипт.
Насколько я догадываюсь, беда в создании окна:
Код:
var myDialog = new Window('dialog', 'Форматирование файлов книги');
...
myDialog.close();

Окно создается, но видимо при закрытии myDialog.close(); оно реально не выгружается из памяти и во время работы скриптов висит на экране со вдавленной кнопкой 'OK'
А вот если запустить из панели скриптов, то окно при нажатии на 'OK' мгновенно закрывается, и скрипт корректно отрабатывается.
 

pirate-party

Участник
Сообщения
42
Реакции
150
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

Заменил formatFiles.jsx на:

Код:
#targetengine 'session'

var myDialog = new Window('dialog', 'Форматирование файлов книги');
myDialog.add('statictext', undefined, 'Для следующих файлов книги будет произведено форматирование по заданным параметрам:\n\n');
myDialog.add('button', undefined, 'Нет').onClick = function(){
	myDialog.close();
};


myDialog.show();

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

eugene10901

Участник
Топикстартер
Сообщения
84
Реакции
17
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

а если добавить еще кнопку разрешения действий
Код:
myDialog.add('button', undefined, 'Да', {name:'ok'});
то тогда и пойдет процесс форматирования, в результате чего ID рухнет...
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

В окнах типа "dialog" кнопки "OK" и "Cancel" в любом случае закрывают окно, и зачем здесь ещё принудительно прописано вот это myDialog.close(); — не совсем понятно.
С другой стороны, я допускаю мысль, что диалог по какой-то причине не закрывается, тем самым блокируя дальнейшее выполнение сценария и вообще всю работу с файлом.
В качестве эксперимента могу предложить такой выход. Создать окно типа "palette":
Код:
var myDialog = new Window('[B]palette[/B]', 'Форматирование файлов книги');
Это окно, будучи открытым, не блокирует работу с документом, что нам собственно и нужно.
Вторым шагом нужно на кнопку "Да" повесить выполнение сценария, который сейчас выполняется при условии:
Код:
var DS = myDialog.show();
	if (DS == true) {...}
Т.е. выглядеть это должно так:
Код:
myDialog.myOKButton.onClick = function(){...}
И там в конце else от DS == true надо будет не забыть выкинуть.
 

eugene10901

Участник
Топикстартер
Сообщения
84
Реакции
17
Ответ: Баг: вызов скрипта с диалоговым окном через пользовательское меню

УРА! ПОМОГЛО! Как Вы думаете, отчего в версиях до 6.0.5 окна типа dialog не вызывали проблем, а позже...
 
Статус
Закрыто для дальнейших ответов.