Page 6 of 74
Posted: Fri Aug 10, 2007 9:55 am
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.
Всё, или почти всё, об AKD_WAITKEYBOARD
Posted: Fri Aug 10, 2007 10:16 am
by VladSh
Не в той ветке задал вопрос, потому переношу Ваши ответы сюда.
Instructor wrote:VladSh
Если есть другой путь, то лучше не использовать эмуляцию нажатия кнопок, чтобы избежать проблем с синхронизацией, а также возможности послать нажатие другому окну. Вместо
можно написать
Но если всё-таки используется 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)");
почему-то не работают

Posted: Fri Aug 10, 2007 12:52 pm
by wisgest
VladSh должно заработать.
Posted: Fri Aug 10, 2007 1:02 pm
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"
Posted: Fri Aug 10, 2007 1:03 pm
by VladSh
wisgest
Спасибо огромное! Заработало!!!
Был уже написан весь скрипт, но вот этот затык мешал его использовать.
Posted: Fri Aug 10, 2007 1:40 pm
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, чтобы не было путаницы.
Posted: Fri Aug 10, 2007 3:10 pm
by Instructor
VladSh
SendMessage
AKD_* сообщения AkelPad'a. Посылаются главному окну. См. AkelDLL.h.
EM_* сообщения RichEdit'a. Посылаются окну редактирования. См. MSDN.
WM_* системные сообщения. Могут посылаться любому окну, зависит от конкретного сообщения. См. MSDN.
опять идея, куда ж без них :)
Posted: Fri Aug 10, 2007 3:26 pm
by VladSh
Ага! Уже стало понятнее.

Ещё
предложение, не знаю, можно ли будет это реализовать...
Короче хочется функцию, отключающую/включающую автообновление окна редактирования. К примеру когда я писал на Delphi, то так можно было его отключить и для Canvas и для таблиц...
Во-1 скорость выполнения скриптов/плагинов повысится в разы!
Во-2 пользователь не будет видеть "дёрганья", мелькания выделения текста, перемещения курсора и т.п...
В идеале было бы в начале скрипта передал в функцию false (отключить), а в конце скрипта - true (включить), т.е. пользователь при нажатии комбинации клавиш скразу бы увидел результат.
Posted: Fri Aug 10, 2007 3:39 pm
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");
}
}
Re: SetRedraw
Posted: Fri Aug 10, 2007 4:42 pm
by VladSh

Клас! Как я и предполагал, работает без дёрганий и заметно быстрей!
Только опять вставлять в SelCompleteLine.js...
А может всё-таки отдельный метод в AkelPad ActiveX? Ну пожа-а-алуйста!

Posted: Mon Aug 13, 2007 3:23 pm
by wisgest
В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Например, так обязательно происходит при повторном вызове InsertFile.js, что так же неуместно, как выводить подобное сообщение при каждой вставке из буфера обмена.
----------
В Calculator.js пример Trace(34+56)+26 не работает - надо в ф-цию Trace() добавить "return pResult;", хотя даже не pResult (как я понял префикс "p" означает строку). Также в Вашем варианте не нужно создавать объект WshShell.
Posted: Mon Aug 13, 2007 4:18 pm
by VladSh
wisgest wrote:В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Например, так обязательно происходит при повторном вызове InsertFile.js, что так же неуместно, как выводить подобное сообщение при каждой вставке из буфера обмена.
Да, это обидно... я пробовал обойти, но не смог... был вариант самому программно сохранять документ перед ReadFile, но это извращение, поэтому бросил как есть
Во многих скриптах встречаются недоделки, например почему я вначале вделал в JCommentDel и др. проверку на нажатие клавиш (хоть она там и не была нужна)? Я хотел, чтобы при нажатии комбинации клавиш и держа, их второе нажатие срабатывало бы только после полной отработки скрипта. Отлов события "нажаты ли всё ещё клавиши" - это не то, т.к. я могу их отпустить, а потом быстро нажать и получится чепуха... Это очень видно если с помощью гарячих клавиш вызвать ShiftRight и держать их не отпуская - получается бред полный.
Есть функция GetSelText, которая работает по выделению. Если бы была просто GetText, которая работала бы по всему окну, а не по выделению - это была бы супер бомбочка! А то дёргать выделение по мелочам туда-сюда - imho не дело...
Posted: Mon Aug 13, 2007 4:46 pm
by Instructor
wisgest
В однооконном режиме при вызове AkelPad.ReadFile(), если перед этим были внесены изменения в редактируемый текст, выскакивает сообщение "Документ был изменён. Сохранить?".
Исправлено (
тестовая версия).
В Calculator.js пример Trace(34+56)+26 не работает - надо в ф-цию Trace() добавить "return pResult;", хотя даже не pResult (как я понял префикс "p" означает строку). Также в Вашем варианте не нужно создавать объект WshShell.
Поправил. Также сейчас можно изменять промежуточный результат.
Posted: Mon Aug 13, 2007 4:53 pm
by Instructor
Fixed: unnecessary LoadLibrary in ReadFile method.
Scripts plugin v1.9
Posted: Tue Aug 14, 2007 2:35 pm
by Instructor
Added: CreateMutex, OpenMutex, ReleaseMutex methods.
Scripts plugin v2.0