Scripts discussion (4)
- Author
- Message
-
Offline
- Posts: 351
- Joined: Mon Jun 03, 2019 2:33 am
Re: Scripts discussion (4)
InputBox_function.js не работает на новой версии, даже пример InputBox.js не работает, крашит AkelPad. Может кто поправит?
-
Offline
- Posts: 3248
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Re: Scripts discussion (4)
Instructor
Результаты обратной трассировки по InputBox_function.js.
Результаты обратной трассировки по InputBox_function.js.
-
Offline
- Posts: 3248
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Re: Scripts discussion (4)
И ещё у меня при попытке вызова FindReplaceFiles.js вылетает сообщение об ошибке:
---------------------------
Scripts plugin
---------------------------
Script: C:\Portable\AkelPad\AkelFiles\Plugs\Scripts\FindReplaceFiles.js
Line: 663
Symbol: 5
Error: Недостаточно места в стеке
Code: 800A001C
Source: Ошибка выполнения JavaScript
---------------------------
Да Нет Отмена
---------------------------
При попытке его закрыть, оно не закрывается, а в цикле появляется ещё одно такое же сообщение, и так до бесконечности. Приходится снимать задачу.
Строка 663 это:
ОС: Windows 11 Корпоративная, 24H2, 26100.4652, 1000.26100.128.0.
---------------------------
Scripts plugin
---------------------------
Script: C:\Portable\AkelPad\AkelFiles\Plugs\Scripts\FindReplaceFiles.js
Line: 663
Symbol: 5
Error: Недостаточно места в стеке
Code: 800A001C
Source: Ошибка выполнения JavaScript
---------------------------
Да Нет Отмена
---------------------------
При попытке его закрыть, оно не закрывается, а в цикле появляется ещё одно такое же сообщение, и так до бесконечности. Приходится снимать задачу.
Строка 663 это:
Code: Select all
nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));-
Offline
- Site Admin
- Posts: 6430
- Joined: Thu Jul 06, 2006 7:20 am
Re: Scripts discussion (4)
См. Scripts v19.3
Уведомил KDJ.VladSh wrote: ↑Mon Aug 11, 2025 11:04 am И ещё у меня при попытке вызова FindReplaceFiles.js вылетает сообщение об ошибке...
Как временное решение: 1. строку
Code: Select all
nMaxFileSize = parseInt(GetWindowText(lParam), 10);Code: Select all
//+Win11 fix
var sMaxFileSize = GetWindowText(lParam);
if (sMaxFileSize == "")
{
nMaxFileSize = 0;
return 0
}
nMaxFileSize = parseInt(sMaxFileSize, 10);
//nMaxFileSize = parseInt(GetWindowText(lParam), 10);
//-Win11 fixCode: Select all
nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
if (nID == IDFILELV)
nID = IDEDITB;
else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
nID = IDSEARCHB;
oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
Code: Select all
//+Win11 fix
//nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
//if (nID == IDFILELV)
// nID = IDEDITB;
//else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
// nID = IDSEARCHB;
//oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
var nDefID = LoWord(oSys.Call("User32::DefDlgProcW", hWnd, 1024 /*DM_GETDEFID*/, 0, 0));
nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
if (nID == IDFILELV)
nID = IDEDITB;
else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
nID = IDSEARCHB;
else
nID = 0;
if (nID && nDefID != nID)
oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
//-Win11 fix-
Offline
- Posts: 351
- Joined: Mon Jun 03, 2019 2:33 am
Re: Scripts discussion (4)
Спасибо, теперь всё работает.
-
Offline
- Posts: 3248
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Re: Scripts discussion (4)
Instructor
У меня "временное решение" для FindReplaceFiles.js с новой версией Scripts-плагина не работает - та же ошибка "Недостаточно места в стеке" на строке 663.
У меня "временное решение" для FindReplaceFiles.js с новой версией Scripts-плагина не работает - та же ошибка "Недостаточно места в стеке" на строке 663.
-
Offline
- Posts: 351
- Joined: Mon Jun 03, 2019 2:33 am
Re: Scripts discussion (4)
Это? У меня работает.


-
Offline
- Site Admin
- Posts: 6430
- Joined: Thu Jul 06, 2006 7:20 am
Re: Scripts discussion (4)
-
Offline
- Posts: 3248
- Joined: Wed Nov 29, 2006 1:19 pm
- Location: Киев, Русь
- Contact:
Re: Scripts discussion (4)
Instructor
Последние изменения работают. Спасибо!
P.S. Только что 11-я винда обновилась до сборки 26100.7171, с пакетом интерфейса компонентов 1000.26100.265.0, и на ней старый код всё ещё не работает. Проверил, т.к. надеялся, что м.б. исправили, но - нет...
Последние изменения работают. Спасибо!
P.S. Только что 11-я винда обновилась до сборки 26100.7171, с пакетом интерфейса компонентов 1000.26100.265.0, и на ней старый код всё ещё не работает. Проверил, т.к. надеялся, что м.б. исправили, но - нет...
-
Offline
- Posts: 9
- Joined: Tue Feb 03, 2026 1:20 pm
Re: AkelPad и другие приложения
Instructor, спасибо за ответы, у меня такая проблема возникла. Я сделал резидентный скрипт, который следит за вводом и выравнивает пробелы во вводимом и вставляемом коде и он работает нормально. Но, если во время выполнения скрипта я хучу убавить табуляцию (Shift + Tab) у какого-то блока текста, то прога падает с ошибкой. На Shift + Tab у меня назначен свой скрипт. В обоих скриптах прописан AkelPad.ScriptNoMutex, но это не помагает. Получается, что где-то возникает конфликт двух скриптов, вносящих изменения. Вопрос, как можно это разрулить, т.е. в скрипте перед любым внесением изменений нужно, наверное делать какую-то проверку или пропуск событий?
-
Offline
- Posts: 9
- Joined: Tue Feb 03, 2026 1:20 pm
Re: AkelPad и другие приложения
Выложил свои скрипты на гит. Немного переделал скрит для "shift + tab" и теперь прога не вылетает, если делать Shift + Tab аккуратней с небольшими паузами, но если делать очень быстро, можно нарваться на краш.
-
Offline
- Posts: 9
- Joined: Tue Feb 03, 2026 1:20 pm
Re: Scripts discussion (4)
Все, я вроде понял. Для Shift+Tab я переделал скрипт, вроде работает без сбоев, а вот для Tab, я не могу поменять действие, которое к нему привязано. Как я понимаю, скрипты, работающие синхронно не конфликтуют с ассинхронным резидентным скриптом. Но вот если в скрипте добавить ScriptNoMutex, то он уже конкурирует с другими NoMutex и это плохо. И, по видимому, стандартные фичи, тоже ассинхронные и они также конфликтуют с резидентным скриптом. Поэтму я решил сделать скрипт для действия Tab, но у меня не получилось поменять стандартное действие назначенное на клавишу Tab. Уважаемый Instructor, не подскажете, можно ли как-то это сделать?
-
Offline
- Site Admin
- Posts: 6430
- Joined: Thu Jul 06, 2006 7:20 am
Re: Scripts discussion (4)
testuser2
JScriptCodeProcessing.js - вызывать AkelPad.ReplaceSel в оповещении AEN_TEXTINSERTEND не лучшая идея. Используйте AEN_TEXTCHANGED для этого. Возможно этого будет достаточно для исправления проблем.
Если понадобятся примеры по работе с синхронизацией (запускаем TestEvent1.js и сразу TestEvent2.js):
JScriptCodeProcessing.js - вызывать AkelPad.ReplaceSel в оповещении AEN_TEXTINSERTEND не лучшая идея. Используйте AEN_TEXTCHANGED для этого. Возможно этого будет достаточно для исправления проблем.
Если понадобятся примеры по работе с синхронизацией (запускаем TestEvent1.js и сразу TestEvent2.js):
-
Offline
- Posts: 9
- Joined: Tue Feb 03, 2026 1:20 pm
Re: Scripts discussion (4)
К сожалению не помогает, но я думаю, поступить по иному, просто обходить в своем обработчике все изменения, произошедшие после Tab/Shift+Tab. Спс за пример с апишными эвентами, буду знать как их сдесь использовать.Instructor wrote: ↑Wed Mar 04, 2026 8:32 pm JScriptCodeProcessing.js - вызывать AkelPad.ReplaceSel в оповещении AEN_TEXTINSERTEND не лучшая идея. Используйте AEN_TEXTCHANGED для этого. Возможно этого будет достаточно для исправления проблем.
-
Offline
- Posts: 9
- Joined: Tue Feb 03, 2026 1:20 pm
Re: Scripts discussion (4)
Все нашел лекарство
А в событии AEN_TEXTCHANGED
И все работает без сбоев!
Code: Select all
function OnSelChanging(lParam){
/*PrintLog("Начало выделения");*/
if (oSys.Call("user32::GetAsyncKeyState", 9))
if (!IsTabPressed) IsTabPressed = true
else
if (IsTabPressed) IsTabPressed = false
}Code: Select all
function OnTextChanged(lParam){
//PrintLog("После изменения \n\n")
if (IsTabPressed) {
IsTabPressed = false
return
}
***