Scripts plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Добавлено: объект AkelPad.ScriptSettings() и его методы Begin, Read, Write, Delete, End.
Если это позволит сохранять не в реестре, то... YAAAAAHHHHOOOO ))

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Добавлено: объект AkelPad.ScriptSettings() и его методы Begin, Read, Write, Delete, End.
Отлично!

Но вот новый SearchReplace.js что-то не учитывает. При запуске без ini:

Code: Select all

Scripts плагин
---------------------------
Скрипт:	...\Scripts\SearchReplace.js
Строка:	291
Символ:	15
Ошибка:	'lpFindStrings' -  есть null или не является объектом
Код:	800A138F
Источник:	Ошибка выполнения Microsoft JScript
А вот когда (после игнорирования ошибок) создастся SearchReplace.ini (пустой), то в следующий раз будет уже все нормально.


Fr0sT
Позволит. :)


[Upd]
А, ну да:

Code: Select all

    if (oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
    {
      ...
      lpFindStrings=new Array(nSearchStrings);
      ...
      oSet.End();
    }
А об умолчаниях никто не подумал.

Code: Select all

var oSet=AkelPad.ScriptSettings();
if(oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/)) {
	WScript.Echo("Ok"); // Если ini-файл существует
	oSet.End();
}
else
	WScript.Echo("Fail");
Удобнее сделать как-то так:

Code: Select all

oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/);
bSensitive=oSet.Read("Sensitive", 1 /*PO_DWORD*/, false /*defaulr value*/);
bMultiline=oSet.Read("Multiline", 1 /*PO_DWORD*/, false /*defaulr value*/);
oSet.End();
– чтобы отсутствие файла и прочие ошибки просто игнорировались (и возвращалось значение по умолчанию).

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor wrote:...Кстати в разрабатываемой версии Scripts плагина -Path="C:\Dir 1" будет передаваться как один аргумент.
Мы ожидали метод GetArg в новой версии плага... :D Было бы здорово!
Или oSet.Read это оно и есть?!

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh
oSer.Read и иже с ним - по сути тот же интерфейс, которым пользуются плагины для сохранения настроек. Т.е. он сам решает куда писать и откуда читать настройки: реестр или файл. Только множества настроек(ну и хранилищ) плагинов и скриптов не пересекаются. Эквивалентно использованию

Code: Select all

AkelPad.SendMessage(AkelPad.GetMainWindow(),AKD_BEGINOPTION, POB_READ, "Scripts\\"+scriptname)

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Такая строка меню

Code: Select all

-"Тест" Call("Scripts::Main", 1, "test.js", `-Value="myValue"`)
и скрипт

Code: Select all

var oSet = AkelPad.ScriptSettings(); 
if (oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
{ 
   var pString = oSet.Read("Value", 3 /*PO_STRING*/);
   WScript.Echo(pString);
   oSet.End();
} 
else 
   WScript.Echo("Fail");
всегда дают "Fail"... Учитывая пред. сообщение я ожидал, что выдаст "myValue".

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

VladSh
Правильно, AkelPad.ScriptSettings не имеет никакого отношения к параметрам запуска. Это конфигурация. А Fail получаете потому что её ещё ни разу не записывали.
Предположим у Вас есть такой код

Code: Select all

var set = AkelPad.ScriptSettings();
set.Begin("qwerty_script",0x2 /*POB_SAVE*/);
set.Write("qwerty_param",3,"qwerty_value");
set.End();
В результате его работы получаете:
Если редактор настроен на сохранение в ini-файл, то у вас появится файл %AkelPadDir%\AkelFiles\Plugs\Scripts\qwerty_script.ini, содержимое которого

Code: Select all

[Options]
qwerty_param=qwerty_value
Если настроен на рееестр, то у вас появится ключ HKCU\SOFTWARE\AKELSOFT\AKELPAD\PLUGS\SCRIPTS\QWERTY_SCRIPT у которого есть значение с названием qwerty_param типа REG_SZ со значением qwerty_value

Теперь, если Вы поставите set.Begin("qwerty_script",0x1 /*POB_READ*/); и будете использовать функцию Read то получите обратно значение.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

FeyFre, это бесспорно круто, долго ждали :D

Я об этом:
VladSh wrote:
Instructor wrote:...Кстати в разрабатываемой версии Scripts плагина -Path="C:\Dir 1" будет передаваться как один аргумент.
Мы ожидали метод GetArg в новой версии плага... :D Было бы здорово!
Думал, что формат для разбора сложных агрументов будет унифицирован, и эта функцЕя будет встроена методом, чтобы её не тягать по скриптам.. Назвать бы её, например, ArgumentsParse, и чтобы она возвращала структуру со всеми аргументами. И обращаться к определённому аргументу по имени, типа:

Code: Select all

var oArgs = AkelPad.ArgumentsParse();
var arg1 = oArgs("arg1Name");
а так бы вообще бомба была:

Code: Select all

var oArgs = AkelPad.Parse(WScript.Arguments); 
var arg1 = oArgs("arg1Name");
:!:

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Instructor

Code: Select all

0x2  //POB_SAVE   Начать операции записи.
0x4  //POB_CLEAR  Начать операции записи с очисткой (POB_SAVE|POB_CLEAR).
Прошу к 0x2 добавить "или удаления", т.к. прочитав это, пытался для удаления использовать 0x4, а оно не работает...
И ещё более подробно расписать в доке, что означает "Начать операции записи с очисткой".

Добавлено: И ещё непонятно, после удаления в ini'шнике остаётся кусок... я так понимаю, что по умолчанию параметры записываются в секцию [Options].
Просьба в доке указать, как осуществлять записать в другую секцию.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Но вот новый SearchReplace.js что-то не учитывает.
Исправлено.
VladSh wrote:...т.к. прочитав это, пытался для удаления использовать 0x4, а оно не работает...
Там же везде примеры есть :)
VladSh wrote:Просьба в доке указать, как осуществлять записать в другую секцию.
Настройки могут быть записаны только в секцию Options.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

FeyFre wrote:Т.е. он сам решает куда писать и откуда читать настройки: реестр или файл.
Отсюда вытекает одно неудобство.
Если захотелось разделить код и настройки (чтобы было удобнее обновлять скрипт), то в случае с хранением настроек в реестре править их пользователю будет гораздо менее удобно, чем *.ini.

Соответственно, отсюда хотелка – возможность принудительно заполучить парсер *.ini.

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Infocatcher
+1

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Infocatcher
Я по моему уже не однократно писал:

Code: Select all

#define AKD_INIOPEN                (WM_USER + 342)
#define AKD_INIOPENA               (WM_USER + 343)
#define AKD_INIOPENW               (WM_USER + 344)
#define AKD_INIGETSECTION          (WM_USER + 345)
#define AKD_INIGETSECTIONA         (WM_USER + 346)
#define AKD_INIGETSECTIONW         (WM_USER + 347)
#define AKD_INICLEARSECTION        (WM_USER + 348)
#define AKD_INIDELETESECTION       (WM_USER + 349)
#define AKD_INIGETKEY              (WM_USER + 350)
#define AKD_INIGETKEYA             (WM_USER + 351)
#define AKD_INIGETKEYW             (WM_USER + 352)
#define AKD_INIDELETEKEY           (WM_USER + 353)
#define AKD_INIGETVALUE            (WM_USER + 354)
#define AKD_INIGETVALUEA           (WM_USER + 355)
#define AKD_INIGETVALUEW           (WM_USER + 356)
#define AKD_INISETVALUE            (WM_USER + 357)
#define AKD_INISETVALUEA           (WM_USER + 358)
#define AKD_INISETVALUEW           (WM_USER + 359)
#define AKD_INICLOSE               (WM_USER + 360)

Code: Select all

AKD_INIOPEN, AKD_INIOPENA, AKD_INIOPENW
___________  ____________  ____________

Opens ini file.

(DWORD)wParam                 == see POB_* defines.
(const unsigned char *)lParam == ini file.

Return Value
 HINIFILE.

Example read (bOldWindows == TRUE):
 INIVALUEA iv;
 HINIFILE hIniFile;
 char szDir[MAX_PATH];

 if (hIniFile=(HINIFILE)SendMessage(pd->hMainWnd, AKD_INIOPEN, POB_READ, (LPARAM)"C:\\File.ini"))
 {
   iv.pSection="Options";
   iv.pKey="SaveDir";
   iv.dwType=INI_STRINGANSI;
   iv.lpData=(LPBYTE)szDir;
   iv.dwData=MAX_PATH;
   SendMessage(pd->hMainWnd, AKD_INIGETVALUE, (WPARAM)hIniFile, (LPARAM)&iv);

   SendMessage(pd->hMainWnd, AKD_INICLOSE, (WPARAM)hIniFile, 0);
 }

Example read (bOldWindows == FALSE):
 INIVALUEW iv;
 HINIFILE hIniFile;
 wchar_t wszDir[MAX_PATH];

 if (hIniFile=(HINIFILE)SendMessage(pd->hMainWnd, AKD_INIOPEN, POB_READ, (LPARAM)L"C:\\File.ini"))
 {
   iv.pSection=L"Options";
   iv.pKey=L"SaveDir";
   iv.dwType=INI_STRINGUNICODE;
   iv.lpData=(LPBYTE)wszDir;
   iv.dwData=MAX_PATH * sizeof(wchar_t);
   SendMessage(pd->hMainWnd, AKD_INIGETVALUE, (WPARAM)hIniFile, (LPARAM)&iv);

   SendMessage(pd->hMainWnd, AKD_INICLOSE, (WPARAM)hIniFile, 0);
 }

Example save (bOldWindows == TRUE):
 INIVALUEA iv;
 HINIFILE hIniFile;
 char szDir[MAX_PATH]="C:\\Temp";

 if (hIniFile=(HINIFILE)SendMessage(pd->hMainWnd, AKD_INIOPEN, POB_SAVE, (LPARAM)"C:\\File.ini"))
 {
   iv.pSection="Options";
   iv.pKey="SaveDir";
   iv.dwType=INI_STRINGANSI;
   iv.lpData=(LPBYTE)szDir;
   iv.dwData=lstrlenA(szDir) + 1;
   SendMessage(pd->hMainWnd, AKD_INISETVALUE, (WPARAM)hIniFile, (LPARAM)&iv);

   SendMessage(pd->hMainWnd, AKD_INICLOSE, (WPARAM)hIniFile, 0);
 }

Example save (bOldWindows == FALSE):
 INIVALUEW iv;
 HINIFILE hIniFile;
 wchar_t wszDir[MAX_PATH]=L"C:\\Temp";

 if (hIniFile=(HINIFILE)SendMessage(pd->hMainWnd, AKD_INIOPEN, POB_SAVE, (LPARAM)L"C:\\File.ini"))
 {
   iv.pSection=L"Options";
   iv.pKey=L"SaveDir";
   iv.dwType=INI_STRINGUNICODE;
   iv.lpData=(LPBYTE)wszDir;
   iv.dwData=(lstrlenW(wszDir) + 1) * sizeof(wchar_t);
   SendMessage(pd->hMainWnd, AKD_INISETVALUE, (WPARAM)hIniFile, (LPARAM)&iv);

   SendMessage(pd->hMainWnd, AKD_INICLOSE, (WPARAM)hIniFile, 0);
 }


AKD_INIGETSECTION, AKD_INIGETSECTIONA, AKD_INIGETSECTIONW
_________________  __________________  __________________

Retrieve ini section handle.

(HINIFILE)wParam              == ini file handle.
(const unsigned char *)lParam == section name.

Return Value
 HINISECTION.

Example (bOldWindows == TRUE):
 HINISECTION hIniSection;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)"Options"))
   SendMessage(pd->hMainWnd, AKD_INICLEARSECTION, (WPARAM)hIniFile, (LPARAM)hIniSection);

Example (bOldWindows == FALSE):
 HINISECTION hIniSection;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)L"Options"))
   SendMessage(pd->hMainWnd, AKD_INICLEARSECTION, (WPARAM)hIniFile, (LPARAM)hIniSection);


AKD_INICLEARSECTION
___________________

Removes all keys in ini section.

(HINIFILE)wParam    == ini file handle.
(HINISECTION)lParam == ini section handle.

Return Value
 Zero.

Example:
 See AKD_INIGETSECTION example


AKD_INIDELETESECTION
____________________

Deletes ini section.

(HINIFILE)wParam    == ini file handle.
(HINISECTION)lParam == ini section handle.

Return Value
 Zero.

Example (bOldWindows == TRUE):
 HINISECTION hIniSection;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)"Options"))
   SendMessage(pd->hMainWnd, AKD_INIDELETESECTION, (WPARAM)hIniFile, (LPARAM)hIniSection);

Example (bOldWindows == FALSE):
 HINISECTION hIniSection;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)L"Options"))
   SendMessage(pd->hMainWnd, AKD_INIDELETESECTION, (WPARAM)hIniFile, (LPARAM)hIniSection);


AKD_INIGETKEY, AKD_INIGETKEYA, AKD_INIGETKEYW
_____________  ______________  ______________

Retrieve key handle.

(HINISECTION)wParam           == ini section handle.
(const unsigned char *)lParam == key name.

Return Value
 HINIKEY.

Example (bOldWindows == TRUE):
 HINISECTION hIniSection;
 HINIKEY hIniKey;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)"Options"))
   if (hIniKey=(HINIKEY)SendMessage(pd->hMainWnd, AKD_INIGETKEY, (WPARAM)hIniSection, (LPARAM)"SaveDir"))
     SendMessage(pd->hMainWnd, AKD_INIDELETEKEY, (WPARAM)hIniSection, (LPARAM)hIniKey);

Example (bOldWindows == FALSE):
 HINISECTION hIniSection;
 HINIKEY hIniKey;

 if (hIniSection=(HINISECTION)SendMessage(pd->hMainWnd, AKD_INIGETSECTION, (WPARAM)hIniFile, (LPARAM)L"Options"))
   if (hIniKey=(HINIKEY)SendMessage(pd->hMainWnd, AKD_INIGETKEY, (WPARAM)hIniSection, (LPARAM)L"SaveDir"))
     SendMessage(pd->hMainWnd, AKD_INIDELETEKEY, (WPARAM)hIniSection, (LPARAM)hIniKey);


AKD_INIDELETEKEY
________________

Deletes ini key.

(HINISECTION)wParam == ini section handle.
(HINIKEY)lParam     == key handle.

Return Value
 Zero.

Example:
 See AKD_INIGETKEY examples


AKD_INIGETVALUE, AKD_INIGETVALUEA, AKD_INIGETVALUEW
_______________  ________________  ________________

Retrieve ini value.

(HINIFILE)wParam   == ini file handle.
(INIVALUE *)lParam == pointer to a INIVALUE structure.

Return Value
 Size of the data copied to the buffer.

Example:
 See AKD_INIOPEN examples


AKD_INISETVALUE, AKD_INISETVALUEA, AKD_INISETVALUEW
_______________  ________________  ________________

Set ini value.

(HINIFILE)wParam   == ini file handle.
(INIVALUE *)lParam == pointer to a INIVALUE structure.

Return Value
 TRUE   success.
 FALSE  failed.

Example:
 See AKD_INIOPEN examples


AKD_INICLOSE
____________

Close ini file handle.

(HINIFILE)wParam == ini file handle.
lParam           == not used.

Return Value
 TRUE   success.
 FALSE  failed.

Example:
 See AKD_INIOPEN examples

Для кого это всё Инструктор добросовестно прописал? Используйте.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

FeyFre
Теперь уже логичнее будет куда-нибудь в Begin() добавить флаг для выбора местоположения настроек.

Code: Select all

if(oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/ | 0x8 /*INI*/)) { ... }
Все же уже есть. Всяко удобнее, чем с INIVALUEW/INIVALUEA ручками возиться.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Отсюда вытекает одно неудобство.
Если пользователь решил сохранять в реестре, то ScriptSettings будет сохранять в реестре. Тоже верно и для плагинов. Конечно это не исключает работы с ini см. сообщение FeyFre.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:в случае с хранением настроек в реестре править их пользователю будет гораздо менее удобно, чем *.ini.
Instructor wrote:...это не исключает работы с ini см. сообщение FeyFre.
Тогда можно сделать, чтобы ini был нормального читабельного формата, чтобы его действительно можно было править вручную? А то эта ерунда как-то не способствует правке:

Code: Select all

яю[и куча каких-то квадратиков (почему-то образец не вставился в форум)]
Post Reply