Page 93 of 96

ScreenView.js

Posted: Sat Apr 05, 2014 12:52 pm
by San_dr
KDJ, Можно ли в плагине ScreenView.js ввести окно выбора и чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI ? (как сделано для Font, ColorTheme, ColorCoderTheme)

Использую так-же плагин LineBoardRClickPanel.js Совместное использование позволяет создавать очень гибкие еонфигурации, например такую, когда для текста отводится все место, остается только панель нумерации строк и возможность вызвать два контекстных меню - меню поля редактирования и меню, вызываемое скриптом LineBoardRClickPanel.js. Здесь нужен режим PMDI - иначе есть риск остаться без всяких меню закрыв последнюю вкладку. А вот, например режим совместной прокрутки двух документов в одном окне для визуального сравнения ( Call("Scripts::Main", 1, "tileTabs.js")) - требует режим MDI... это я навскидку назвал пару примеров, когда нужно менять режим работы окна, есть и другие.

Posted: Sat Apr 05, 2014 1:10 pm
by Skif_off
San_dr wrote:чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI?
Для этого, вероятно, понадобится перезапуск AkelPad.

Posted: Sat Apr 05, 2014 1:20 pm
by San_dr
Skif_off wrote: Для этого, вероятно, понадобится перезапуск AkelPad.
Скорее всего, но не думаю, чтоб это было проблемой, просто надо, чтобы возле чекбокса была предупреждающая надпись о необходимости рестарта.,

Posted: Sat Apr 05, 2014 6:56 pm
by Infocatcher
Небольшое дополнение.
Версии AkelPad'а и Scripts, напоминаю, по-прежнему тестовые.
У меня еще и на стареньком VersionInfo.js периодически падает.
Только этот под отладкой ни в какую не падает, тогда как tileTabs.js стабильно падает как раз при подключении отладчика (а в нормальных условиях – только периодически).
Если сделать «Run To Cursor» к концу файла, то падает, но ничего интересного не показывает. Даже переменные все почему-то в undefined стоят – кроме функций и объектов AkelPad, WScript и Constants.

Re: ScreenView.js

Posted: Sat Apr 05, 2014 8:26 pm
by KDJ
San_dr wrote:Можно ли в плагине ScreenView.js ввести окно выбора и чекбокс влючения для изменения оконного режима - SDI-MDI-PMDI ?
It seems to me that the script ScreenView.js is no right place for the function switching window mode.
For fast switching, you can assign shortcut keys or put icons on the toolbar and use the script restart.js.
Example for toolbar:

Code: Select all

"SDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 0) {AkelPad.Command(4261); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
"PMDI" Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 2) {AkelPad.Command(4263); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

Posted: Sun Apr 06, 2014 6:24 am
by Instructor
Infocatcher wrote:Я даже на всякий случай проверил без
Даже? Это первое, что надо было сделать :)

У тестовых файлов отличающаяся архитектура, поэтому не используйте их в рабочей папке: 4.8.8 Dev + Scripts плагин.

Добрался до Win7 падения действительно есть на winMergeTabs.js и tileTabs.js, где используется "AkelPad.WindowSubClass(hMainWnd". Стоило поменять на "AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/", как падений больше не было.

Posted: Sun Apr 06, 2014 8:05 am
by San_dr
KDJ, помоги, не хватает ума - как мне слить в одной кнопке или пункте меню такие действия (если это возможно):

Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0') + Call("Scripts::Main", 1, "EvalCmd.js", `if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

Posted: Sun Apr 06, 2014 10:04 am
by KDJ
San_dr

Code: Select all

"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0'); if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)

Posted: Sun Apr 06, 2014 10:51 am
by San_dr
KDJ wrote:

Code: Select all

"MDI" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="Default" -FullScreen=0'); if (AkelPad.IsMDI() != 1) {AkelPad.Command(4262); AkelPad.Call("Scripts::Main", 1, "restart.js");}`)
Dziękujemy! Udało się.

Posted: Sun Apr 06, 2014 12:55 pm
by Infocatcher
Instructor wrote:
Infocatcher wrote:Я даже на всякий случай проверил без
Даже? Это первое, что надо было сделать :)
Ммм... а, возможно, и нет.
Я снова убрал autoSaveSession.js из автозагрузки (пока что на старых версиях), так пока что tileTabs.js падает только при отладке. Во всяком случае, выходит, что с autoSaveSession.js частота падений выше.
Instructor wrote:У тестовых файлов отличающаяся архитектура, поэтому не используйте их в рабочей папке: 4.8.8 Dev + Scripts плагин.
Хм, с autoSaveSession.js уже не проверить.
Под отладкой tileTabs.js по-прежнему падает, без отладки пока ни разу не упал.

А нельзя ли в oSys.RegisterCallback() проверять тип первого аргумента, чтобы все старые скрипты по-прежнему работали?
Или как можно из самого скрипта проверить, не запущен ли он на старой версии?

Upd:
Более того, если в autoSaveSession.js закомментировать собственно сохранение:

Code: Select all

//AkelPad.Call("Sessions::Main", 2, sessionName);
, то падать продолжает.

Даже вот такого достаточно в автозагрузке, чтобы увеличить частоту падений:

Code: Select all

var isMDI = AkelPad.IsMDI();
if(!isMDI) // We silently ignore SDI mode to allow use the same settings in any mode!
	WScript.Quit();

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();

var hScript = AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/);
if(hScript && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/)) {
	// Script is running, second call close it
	AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
	WScript.Quit();
}

if(hMainWnd) {
	if(
		AkelPad.WindowSubClass(
			1 /*WSC_MAINPROC*/,
			mainCallback,
			0x4E /*WM_NOTIFY*/,
			0x416 /*AKDN_FRAME_ACTIVATE*/,
			0x418 /*AKDN_FRAME_DESTROY*/
			//0x436 /*AKDN_OPENDOCUMENT_FINISH*/
			//0x406 /*AKDN_MAIN_ONFINISH*/
		)
	) {
		if(
			isMDI != 1 /*WMD_MDI*/
			|| AkelPad.WindowSubClass(
				3 /*WSC_FRAMEPROC*/,
				mainCallback,
				0x4E /*WM_NOTIFY*/
			)
		) {
			AkelPad.ScriptNoMutex(); // Allow other scripts running
			AkelPad.WindowGetMessage(); // Message loop

			AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
			AkelPad.WindowUnsubClass(3 /*WSC_FRAMEPROC*/);
		}
		else {
			AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
			AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_FRAMEPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
		}
	}
	else {
		AkelPad.MessageBox(hMainWnd, "AkelPad.WindowSubClass(WSC_MAINPROC) failed!", WScript.ScriptName, 16 /*MB_ICONERROR*/);
	}
}

function mainCallback(hWnd, uMsg, wParam, lParam) {
}
Даже с

Code: Select all

		AkelPad.WindowSubClass(
			1 /*WSC_MAINPROC*/,
			mainCallback,
			0x4E /*WM_NOTIFY*/
		)
по-прежнему падает.


Upd #2:
Вообще, логично предположить, что и скрипт в автозагрузке, и отладка влияют на «производительность» обработки сообщений. То есть что-то начинает работать медленнее, а другое что-то некорректно ожидает окончания предыдущей операции. :?

Posted: Sun Apr 06, 2014 3:07 pm
by Infocatcher
Для проверки подключил AutoScript-Sample1.js, так и с ним tileTabs.js падает, хотя и, кажется, пореже...
Причем с последними тестовыми версиями AkelPad'а и Scripts тоже воспроизводится.

P.S. Использовались tileTabs-test.js + timer.js

Posted: Sun Apr 06, 2014 4:09 pm
by Instructor
Infocatcher wrote:Все, кроме вот этого

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"
у меня в наличии. :?
Если попробовать добавить?
А нельзя ли в oSys.RegisterCallback() проверять тип первого аргумента, чтобы все старые скрипты по-прежнему работали?

Code: Select all

try
{
  oSys.RegisterCallback(timerProc);
}
catch ()
{
  oSys.RegisterCallback("timerProc"); 
}
Причем с последними тестовыми версиями AkelPad'а и Scripts тоже воспроизводится.
Как будет возможность, проверю на Win7.

Posted: Sun Apr 06, 2014 5:59 pm
by Infocatcher
Instructor wrote:
Infocatcher wrote:Все, кроме вот этого

Code: Select all

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{51973C2F-CB0C-11D0-B5C9-00A0244A0E7A}]
@="IProcessDebugManager"
у меня в наличии. :?
Если попробовать добавить?
Добавил.
После перезагрузки (пока не перезагрузился, изменений не было) при запуске AkelPad'а стало выводиться вот такое сообщение:
Microsoft Visual Studio Debugger
---------------------------
An exception occurred. Process will be terminated. (Exception address is 00413E6C)
---------------------------
ОК
Выводит его
"C:\Program Files\Common Files\Microsoft Shared\VS7Debug\VS7JIT.EXE" -Embedding
И через какое-то время (секунд через 50) вылезает еще вот такое:
Just-In-Time Debugging
---------------------------
An exception 'Runtime Error' has occurred in Script.

However, no debuggers are registered that can debug this exception. Unable to JIT debug.
---------------------------
ОК
Кстати, без этого ключа в реестре еще и AkelPad при запуске падал.
Если убрать галочку «с начала», то, вроде, вообще ничего визуально не меняется.
Если запускать с правами администратора, то результат точно такой же, только окошко с сообщением об ошибке уже не может перехватить фокус.

Posted: Sun Apr 06, 2014 7:59 pm
by KDJ
FileAndStream_functions.js
Added ability to call IsSupportStreams() function without a parameter or with empty string, for checking the current drive.

Posted: Mon Apr 07, 2014 5:20 am
by Infocatcher
Instructor
А на работе уже Visual Studio 2005 на борту, при падении предлагает отладку.

Code: Select all

Unhandled exception at 0x003e8b4c in AkelPad.exe: 0xC0000005: Access violation reading location 0x00000182.

No symbols are loaded for any call stack frame. The source code cannot be displayed.

003E8B10  call        003E2C6A 
003E8B15  add         esp,14h 
003E8B18  mov         dword ptr [edi],eax 
003E8B1A  jmp         003E8B20 
003E8B1C  and         dword ptr [esi+28h],0 
003E8B20  xor         eax,eax 
003E8B22  inc         eax  
003E8B23  jmp         003E8B2A 
003E8B25  and         dword ptr [edi],0 
003E8B28  xor         eax,eax 
003E8B2A  pop         edi  
003E8B2B  pop         esi  
003E8B2C  pop         ebx  
003E8B2D  pop         ebp  
003E8B2E  ret         18h  
003E8B31  push        ebp  
003E8B32  mov         ebp,esp 
003E8B34  push        esi  
003E8B35  mov         esi,dword ptr [ebp+8] 
003E8B38  xor         eax,eax 
003E8B3A  test        esi,esi 
003E8B3C  push        edi  
003E8B3D  mov         edi,dword ptr [ebp+1Ch] 
003E8B40  jne         003E8B4C 
003E8B42  mov         esi,dword ptr ds:[3EEF40h] 
003E8B48  test        esi,esi 
003E8B4A  je          003E8BAA 
003E8B4C  cmp         dword ptr [esi+8],1 ; <-- падает вот тут
Так что неплохо бы сборку с отладочными символами и актуальный Sessions (потому как это было на последних тестовых AkelPad и Scripts со старой архитектурой).
Впрочем, можно и без Sessions, но на AutoScript-Sample1.js падает реже.


Upd: Отладка скриптов тут запускается без проблем (но только с галочкой «с начала»), при этом падает там же. Информации о падении не видать, а если в окошке о том, что программа упала, выбрать «Отладка», то выдает
Microsoft Visual Studio
---------------------------
Unable to attach to the crashing process. A debugger is already attached.
---------------------------
ОК
Система, в принципе, такая же: Windows 7 x86 SP1, только корпоративная версия и есть VS 2005.

Upd #2:
(но только с галочкой «с начала»)
Я что-то туплю, без галочки надо было «AkelPad.DebugJIT();» в коде добавить?