Scripts плагин
---------------------------
Скрипт: [...]\AkelFiles\Plugs\Scripts\Test.vbs
Строка: 17
Символ: 1
Ошибка: Переменная использует не поддерживаемый в VBScript тип программирования объектов
Код: 800A01CA
Источник: Ошибка выполнения Microsoft VBScript
Posted: Sat Jan 08, 2011 5:08 pm
by KDJ
Methods AkelPad.GetMainWnd and AkelPad.GetEditWnd returns values, which VBS does not understand.
Все оказалось весьма просто – к счастью, для BT_FINDNEXT делается lpArray=pSelText.match(oPattern), а то там много хитрого кода, моя не понимать.
Ну, и AkelPad.GetTextRange() теперь есть.
if (nButton == BT_REPLACE)
{
if (nInitialSelStart != nInitialSelEnd)
{
...
if (/\(\?[=!].*\)/.test(pFindIt)) // Lookahead assertions: x(?=y) or x(?!y)
{
var pEndText=AkelPad.GetTextRange(AkelPad.GetSelStart(), -1, 2 /*\n*/);
if (!bAkelEdit)
pEndText=pEndText.replace(/\r/g, "\n");
if (oPattern.test(pEndText) && RegExp.lastMatch == pSelText)
{
pResult=pEndText.replace(oPattern, pReplaceWithEsc);
pResult=pResult.substr(0, pResult.length - (pEndText.length - pSelText.length));
AkelPad.ReplaceSel(pResult);
nInitialSelStart=AkelPad.GetSelStart();
nInitialSelEnd=AkelPad.GetSelEnd();
}
}
else
{
// старый код
...
}
[Upd]
Идея: SearchReplace.js в виде панельки, как QSearch. Можно даже поиск по мере набора попробовать сделать (и посмотреть, <del>как он будет тормозить</del> не будет ли он излишне тормозить). Можно засекать время и отключать, если предыдущий запрос слишком долго обрабатывался.
Posted: Tue Jan 11, 2011 2:31 pm
by DV
Приблизительный скрипт OpenInNewInstance.js.
Известные проблемы: новая копия AkelPad (MDI) открывает все те же вкладки, открытые в первой копии. И не дружит с плагином Sessions.
var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var hMainMenu = oSys.Call("user32::GetMenu", hMainWnd);
// constants
var WM_COMMAND = 273;
var MF_BYCOMMAND = 0x00;
var MF_UNCHECKED = 0x00;
var MF_CHECKED = 0x08;
var IDM_FILE_TWICE = 4255;
var IDM_PROGRAM_TWICE = 4256;
// uncheck menu item if checked
var nFileTwiceChanged = MenuItemState(IDM_FILE_TWICE);
// uncheck menu item if checked
var nProgramTwiceChanged = MenuItemState(IDM_PROGRAM_TWICE);
var pAkelDir = AkelPad.GetAkelDir();
var pEditFile = AkelPad.GetEditFile(0)
var WshShell = new ActiveXObject("WScript.shell");
// run new AkelPad.exe
WshShell.Run("\"" + pAkelDir + "\\AkelPad.exe\" \"" + pEditFile + "\"");
// wait for a second
oSys.Call("kernel32::Sleep", 1000);
// restore menu item's checked state
if ( nFileTwiceChanged )
{
ChangeMenuItemState(IDM_FILE_TWICE);
}
// restore menu item's checked state
if ( nProgramTwiceChanged )
{
ChangeMenuItemState(IDM_PROGRAM_TWICE);
}
function MenuItemState(id)
{
var state = oSys.Call("user32::GetMenuState", hMainMenu, id, MF_BYCOMMAND);
if ( state != -1 )
{
if ( state & MF_CHECKED )
{
ChangeMenuItemState(id);
return 1;
}
}
return 0;
}
function ChangeMenuItemState(id)
{
AkelPad.SendMessage(hMainWnd, WM_COMMAND, id, 0);
}
Posted: Tue Jan 11, 2011 3:40 pm
by FeyFre
Известные проблемы: новая копия AkelPad (MDI) открывает все те же вкладки, открытые в первой копии.
ЕМНИП Акел сам не открывает ничего. Это Sessions делает.
Ну и сразу же предложения/подсказки:
1. В скрипте зашито имя файла. Нужно "расшить", т.е. запускать то что запущено сейчас. Для этого пользуемся функцией kernel32::GetModuleFileName(NULL)
2. Естественно желательно запустить как-бы копию(хотя в принципе не обязательно). Это касается ключей запуска, в первую очередь выделенных(остальные процитированные нужно обдумать):
#define CLO_MSGOPENCREATEYES 0x04 //Silently create new file, if doesn't exist.
#define CLO_MSGOPENCREATENO 0x08 //Don't create new file, if doesn't exist. #define CLO_MSGOPENBINARYYES 0x10 //Silently open file, if binary.
#define CLO_MSGOPENBINARYNO 0x20 //Don't open file, if binary.
#define CLO_MSGSAVELOSTSYMBOLSYES 0x40 //Silently save file, even if symbols will be lost.
#define CLO_MSGSAVELOSTSYMBOLSNO 0x80 //Don't save file, if symbols will be lost.
Значит AKD_GETCMDLINEOPTIONS нужен.
3. Насчет проблемы с Sessions. Думаю при запуске следует временно запретить автозагрузку файлов, а потом разрешить.(Схема такова: анализируем настройки плагина, а именно OpenOnStartEnable и OpenOnStartSession. Либо мы временно настройку разрешение меняем, а потом возвращаем назад, либо временно убираем файл сессий. Конечно есть шанс что можем напороться на read-only file-system, но тут случай особый(и вообще неюзабельный).
Posted: Thu Jan 13, 2011 6:42 am
by Instructor
Infocatcher wrote:...фикс для опережающих проверок...
Добавил.
Posted: Thu Jan 13, 2011 11:08 am
by VladSh
Авторам скриптов: возможно нужно откорректировать:
- Calculator.js (из дистрибутива плага);
- NeO.Sort.js: if (sInput == undefined) WScript.Quit();
на предмет возвращения InputBox'ом undefined'а.
Свои скрипты я откорректировал.
lexa
По поводу SmartBackspace.
1. Идея хорошая, но работает криво. Ожидалось, что будет стирать по количеству пробелов, указанных в настройках. Я настроил скрипт на Ctrl+Backspace, но происходит какая-то чепуха...
2. Лучше переписать алгоритм скрипта так, чтобы не было SendKeys'ов, это затупляет скрипт. Негативный опыт их использования уже большой, поэтому во всех своих скриптах я от этого избавился.
3. В самом скрипте, в комментах (вверху) лучше ставить:
///Краткий коммент
// URL сообщения на форуме, куда выложен скрипт (чтобы людям было удобно находить этот скрипт на странице и обновлять при необходимости).
// Version x.x (гггг.мм.дд)
Posted: Fri Jan 14, 2011 10:10 am
by VladSh
Instructor & all
Подскажите пожалуйста, можно ли в диалог (так как он создаётся в InsertFile.js) как-то изменить начальную дирректорию? Неудобно то, что используется текущая из AkelPad'а, а чаще нужна дирректория текущего файла.
как ни странно, работает правильно.
Может и в диалог, создаваемый в скрипте, можно как-то подсунуть InitialDir?
P.S. Ух, лучше бы в плаге был нормальный FileDialog...
Posted: Fri Jan 14, 2011 11:03 am
by FeyFre
VladSh
что-то я не совсем понял о каком именно диалоге идет речь. В файлк который в коллекции InsertFile.js никакого диалога не наблюдаю(видать устаревший), а то что у меня - там стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.
Posted: Fri Jan 14, 2011 11:54 am
by VladSh
FeyFre wrote:стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.
Да, FileDialog, который там - это стандартный виндовый.
Не подскажете, как подменить там InitialDir?
Posted: Fri Jan 14, 2011 3:18 pm
by FeyFre
Там есть переменная lpStructure - указатель на структуру OPENFILENAME
Вот тут http://msdn.microsoft.com/en-us/library ... 85%29.aspx описаны её поля.
Вас интересует поле lpstrInitialDir - заполняйте его(и вообще почитайте о ней)