Scripts plugin

Discuss and announce AkelPad plugins
Post Reply
  • Author
  • Message
Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Fr0sT wrote: Я и сам тоже в жабе особо не разбирался... зато сейчас есть стимул )).
100%!
Fr0sT wrote:Параметр по умолчанию, конечно, неплохая штука, но имхо в данной функции он будет выглядеть нелогично. Вот если ввести функцию SetSel(startIdx, length = 0) - это покрасивше будет.
IMHO нет, т.к. ситуаций, когда нужно именно такая запись гораздо меньше, чем теперешняя. Для обычной штатной ситуации, случаев (когда nSelStart != nSelEnd) придётся каждый раз вычислять длину, а это жуть как неудобно!
Т.е. запись, которую Вы предлагаете, в 90% случаев превращается в:

Code: Select all

AkelPad.SetSel(AkelPad.GetSelStart(), AkelPad.GetSelEnd() - AkelPad.GetSelStart());
:?

Я же предлагаю для установки выделения (т.е. когда nSelStart != nSelEnd):

Code: Select all

AkelPad.SetSel(AkelPad.GetSelStart(), AkelPad.GetSelEnd());
как, впрочем, есть и сейчас, т.е. ничего переделывать ненужно.

А для простой установки курсора (когда nSelStart = nSelEnd):

Code: Select all

AkelPad.SetSel(AkelPad.GetSelStart());
- это как раз и есть одно из прямых предназначений необязательных параметров, т.е. для чего они изначально задумывались.
---------------

P.S.
Fr0sT wrote:VladSh, вот, может, и займёшься описанием? Там вроде немного, Инструктор спасибо скажет ;).
Я, по мере возможностей, пытаюсь собрать всю инфу в теме Дополнения к FAQ.
Last edited by VladSh on Fri Aug 10, 2007 10:43 am, edited 1 time in total.

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

Всё, или почти всё, об AKD_WAITKEYBOARD

Post by VladSh »

Не в той ветке задал вопрос, потому переношу Ваши ответы сюда.
Instructor wrote:VladSh
Если есть другой путь, то лучше не использовать эмуляцию нажатия кнопок, чтобы избежать проблем с синхронизацией, а также возможности послать нажатие другому окну. Вместо

Code: Select all

WshShell.SendKeys("{ENTER}");
можно написать

Code: Select all

AkelPad.ReplaceSel("\r");
Но если всё-таки используется SendKeys, то в начале скрипта желательно:

Code: Select all

AkelPad.SendMessage(hMainWnd, 1178 /*AKD_WAITKEYBOARD*/, 0, 0);
VladSh wrote:Instructor
Спасибо за совет!

Эмуляцию нажатия ENTER использую только из-за того, что при обычном нажатии ENTER на новой строке создаётся нужный отступ (соответствующий предыдущей строке). AkelPad.ReplaceSel("\r") же просто переводит строку в самое начало, т.е. без отступа... можно конечно вычислять размер отступа и прибавлять его спереди, но это ещё больше замедлит скрипт, хотя... нужно пробовать.
Instructor wrote:Сообщение AKD_WAITKEYBOARD ждет пока пользователь отпустит все кнопки на клавиатуре. Если этого не сделать, то может возникнуть следующая ситуация: когда скрипт запускается горячими клавишами, и доходит до SendKeys пользователь может еще не успеть отпустить кнопки и скрипт пошлет нажатие, в результате получится множественное нажатие вместо предполагаемого.
Instructor в ЛС wrote:В AKD_WAITKEYBOARD нет необходимости если SendKeys не используется.
Instructor wrote:AkelPad.GetMainWnd() != AkelPad.GetEditWnd()
По последнему разбирался и уже дома сам допёр :)

Тогда следующий вопрос: когда следует использовать GetMainWnd, а когда GetEditWnd? Разъясните пожалуйста!
Я конечно предполагаю, что для всех действий, производимых в окне редактирования (например работа с выделением) нужно использовать GetEditWnd, а для всех диалогов, всплывающих окон GetMainWnd... или как?

P.S. Хотел сделать "выделить всё"... но ни этот вариант (хоть передавай GetEditWnd, хоть GetMainWnd):

Code: Select all

AkelPad.SendMessage(AkelPad.GetEditWnd(), 4157 /*IDM_EDIT_SELECTALL*/, 0, 0);
ни этот:

Code: Select all

var WshShell = new ActiveXObject("WScript.Shell");
WshShell.SendKeys("^(A)");
почему-то не работают :(
Last edited by VladSh on Fri Aug 10, 2007 2:57 pm, edited 1 time in total.

Offline
Posts: 63
Joined: Sun Jun 24, 2007 4:03 pm
Contact:

Post by wisgest »

VladSh

Code: Select all

WshShell.SendKeys("^a");
должно заработать.

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

Post by Instructor »

VladSh
Тогда следующий вопрос: когда следует использовать GetMainWnd, а когда GetEditWnd?
Основные варианты использования присутствуют в написанных скриптах.
Хотел сделать "выделить всё"...
см. Test.js "//Set selection"

Code: Select all

AkelPad.SendMessage(AkelPad.GetEditWnd(), 4157 /*IDM_EDIT_SELECTALL*/, 0, 0);
см. Test.js "IDM_FILE_NEW"

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

Post by VladSh »

wisgest
Спасибо огромное! Заработало!!! :D
Был уже написан весь скрипт, но вот этот затык мешал его использовать.

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

Post by VladSh »

Instructor
Спасибо! Всё работает.

Но по поводу hEditWnd и hMainWnd не совсем ясно.
В этом коде используется только hMainWnd:

Code: Select all

//Send message
AkelPad.SendMessage(hMainWnd, WM_COMMAND, IDM_FILE_NEW, 0);
WScript.Echo("New window has been created");
В этом коде используется и hMainWnd и hEditWnd, причём последний идёт 3-м параметром! (не понятно...):

Code: Select all

//Send message
var nResult=AkelPad.SendMessage(hMainWnd, AKD_PASTE, hEditWnd, false);
WScript.Echo("Text has been pasted from clipboard");
Ещё более непонятно - в этих двух примерах номера команд указываются в разных параметрах(!): в 1-м примере - 3-м параметром, а во 2-м - 2-м параметром... не видна закономерность. Нормальной доки в инете по этому поводу я не нашёл. Есть такое:
Функция SendMessage

Описание
function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Посылает сообщение оконной функции указанного окна. Возвpат из функции осуществляется только после обpаботки сообщения.

Паpаметpы
Wnd: Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
Msg: Тип сообщения.
wParam: Дополнительная инфоpмация о сообщении.
lParam: Дополнительная инфоpмация о сообщении.

Возвpащаемое значение
значение, возвpащенное пpинимающей оконной функцией.
но оно совершенно не "проливает свет"...

Есть предложение всем скриптописателям: имя этой переменной и соотв. параметр функций указывать явно:, т.е. var hEditWnd или var hMainWnd, чтобы не было путаницы.

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

Post by Instructor »

VladSh
SendMessage

AKD_* сообщения AkelPad'a. Посылаются главному окну. См. AkelDLL.h.
EM_* сообщения RichEdit'a. Посылаются окну редактирования. См. MSDN.
WM_* системные сообщения. Могут посылаться любому окну, зависит от конкретного сообщения. См. MSDN.

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

опять идея, куда ж без них :)

Post by VladSh »

Ага! Уже стало понятнее.

:idea: Ещё предложение, не знаю, можно ли будет это реализовать...
Короче хочется функцию, отключающую/включающую автообновление окна редактирования. К примеру когда я писал на Delphi, то так можно было его отключить и для Canvas и для таблиц...
Во-1 скорость выполнения скриптов/плагинов повысится в разы!
Во-2 пользователь не будет видеть "дёрганья", мелькания выделения текста, перемещения курсора и т.п...
В идеале было бы в начале скрипта передал в функцию false (отключить), а в конце скрипта - true (включить), т.е. пользователь при нажатии комбинации клавиш скразу бы увидел результат.

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

Post by Instructor »

Code: Select all

/// Stop and start redraw window.

var AkelPad=new ActiveXObject("AkelPad.document");

var hEditWnd=AkelPad.GetEditWnd();
var oFunction=AkelPad.SystemFunction();

SetRedraw(hEditWnd, false);
//...
SetRedraw(hEditWnd, true);


//Function
function SetRedraw(hWnd, bRedraw)
{
  if (bRedraw == false)
  {
    AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, false, 0);
  }
  else if (bRedraw == true)
  {
    AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, true, 0);

    oFunction.AddParameter(hWnd);
    oFunction.AddParameter(0);
    oFunction.AddParameter(false);
    oFunction.Call("user32::InvalidateRect");
  }
}

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

Re: SetRedraw

Post by VladSh »

8) Клас! Как я и предполагал, работает без дёрганий и заметно быстрей!
Только опять вставлять в SelCompleteLine.js...
А может всё-таки отдельный метод в AkelPad ActiveX? Ну пожа-а-алуйста! :D
Last edited by VladSh on Fri Nov 06, 2009 10:14 am, edited 1 time in total.

Offline
Posts: 63
Joined: Sun Jun 24, 2007 4:03 pm
Contact:

Post by wisgest »

В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Например, так обязательно происходит при повторном вызове InsertFile.js, что так же неуместно, как выводить подобное сообщение при каждой вставке из буфера обмена.
----------
В Calculator.js пример Trace(34+56)+26 не работает - надо в ф-цию Trace() добавить "return pResult;", хотя даже не pResult (как я понял префикс "p" означает строку). Также в Вашем варианте не нужно создавать объект WshShell.

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

Post by VladSh »

wisgest wrote:В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Например, так обязательно происходит при повторном вызове InsertFile.js, что так же неуместно, как выводить подобное сообщение при каждой вставке из буфера обмена.
Да, это обидно... я пробовал обойти, но не смог... был вариант самому программно сохранять документ перед ReadFile, но это извращение, поэтому бросил как есть :(


Во многих скриптах встречаются недоделки, например почему я вначале вделал в JCommentDel и др. проверку на нажатие клавиш (хоть она там и не была нужна)? Я хотел, чтобы при нажатии комбинации клавиш и держа, их второе нажатие срабатывало бы только после полной отработки скрипта. Отлов события "нажаты ли всё ещё клавиши" - это не то, т.к. я могу их отпустить, а потом быстро нажать и получится чепуха... Это очень видно если с помощью гарячих клавиш вызвать ShiftRight и держать их не отпуская - получается бред полный.

Есть функция GetSelText, которая работает по выделению. Если бы была просто GetText, которая работала бы по всему окну, а не по выделению - это была бы супер бомбочка! А то дёргать выделение по мелочам туда-сюда - imho не дело...

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

Post by Instructor »

wisgest
В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Исправлено (тестовая версия).
В Calculator.js пример Trace(34+56)+26 не работает - надо в ф-цию Trace() добавить "return pResult;", хотя даже не pResult (как я понял префикс "p" означает строку). Также в Вашем варианте не нужно создавать объект WshShell.
Поправил. Также сейчас можно изменять промежуточный результат.
Last edited by Instructor on Mon Aug 13, 2007 4:54 pm, edited 1 time in total.

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

Post by Instructor »

Fixed: unnecessary LoadLibrary in ReadFile method.


Scripts plugin v1.9

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

Post by Instructor »

Added: CreateMutex, OpenMutex, ReleaseMutex methods.


Scripts plugin v2.0
Post Reply