Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Andrey_A_A
Так ведь множественное выделение вообще не поддерживается.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Andrey_A_A wrote:Подскажите как можно выделить определённые строки одновременно. К примеру мне нужно выделить 1, 7, 11, 22... строку с помощью скрипта...
In AkelPad is not possible to select multiple noncontiguous ranges.
This possibility is, for example in Notepad++.
But using a script in AkelPad you can to process needed rows sequentially.
Write, what you want to do with lines of numbers 1, 7, 11, 22. I'll try to help you.

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

Post by Infocatcher »

getHash.js
Добавлена галочка для перевода в верхний регистр.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Changes in FileInfo.js:
1. Fixed algorithm for calculating the number of words. Gives a result, such as Stats plugin.
2. Indexes of empty lines, that contain spaces or tabs, labeled "-empty".
3. If you selected a piece of text - gives statistics of selected text. If not selected - statistics throughout the text.

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

В скриптах используется команда
SendMessage(hHandle, nMessage, wParam, lParam);
Подскажите, где можно на русском языке прочитать подробную информацию о всех возможных сообщениях (командах), которые можно послать окну (nMessage) и их параметрах. Просто не до конца понятны выражения типа:
273 /*WM_COMMAND*/
3087 /*AEM_SETMODIFY*/
0x400, //LOCALE_USER_DEFAULT
...
в справке, в Scripts-Rus.txt я этого не нашёл.

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

Post by FeyFre »

Andrey_A_A
SendMessage это просто упрощенный вызов AkelPad.SystemFunction().Call("user32::SendMessage"+_TCHAR, ....) т.е. работа в родном окружении ОС. Функция выполняет синхронную отправку сообщений указанному окну.
Взаимодействие программ с окнами в обеспечивается с помощью небольшого набора системных вызовов из модуля user32, в том числе с помощью т.н. оконных сообщений - дискретных запросов к так называемой оконной процедуре - подпрограмме которая целиком определяет поведение окна. Сообщение идентифицируется кодом(0-65535), а также двумя числовыми параметрами(условное обозначение wParam, lParam). Каждое окно имеет право обрабатывать сообщение собственным алгоритмом, не зависимо от других окон. И тем не менее, для унификации первые 1024 сообщения(0-1023) используются системой(служебные уведомления окнам), и каждое окно для обеспечения работоспособности обязано реагировать на них определенным образом(например, сообщение WM_NCDESTROY(130) последнее сообщение, которое получит окно перед самым его уничтожением, потому оконная процедура обязана освободить занятую в процессе существования окном память, если этого не сделала раньше).
Сообщения >1023 система не специфицирует и никогда не отправляет по собственно инициативе.
Если Вы новичек в программировании WIN32 то для начала Вам нужно бы познакомится у устройством ОС, например из книги Рихтера тут http://alexsoft.home.nov.ru/prog/index.htm

Более конкретно о каждом системном сообщении сможете прочесть в MSDN(гуглить), а также там есть всё что нужно знать о стандартных окна(поля ввода, кнопки, списки, диалоги, меню, прочее).
О сообщениях AkelPad-а, и AkelEdit-а, вы можете подробно узнать из исходников AkelDll.h, AkelEdit.h(и с MSDN о совместимой с RichEdit части)

ЗЫ: Не рекомендую искать русскоязычные справки/учебники. Легче Вам от этого не станет. Разве что у Вас над головой будет стаять специалист.

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

FeyFre большое спасибо за подробную информацию. Я понимаю что сразу всё не освоить. Я самообучаюсь, разбирая различные скрипты. Начал с vbs , и изначально я сделал собственную справку, куда вносил, и вношу новые освоенные функции, даже целые блоки скриптов, для дальнейшего использования, что позволяет быстро писать, беря нужные блоки. За 8 месяцев написано более 100 скриптов в основном для файловой с-мы в тотале... Появилась мысль оптимизировать AkelPad. Пишу, что-то получается что-то нет. Может кто-то из скринописателей для AkelPada тоже ведёт подобную справку, библиотеку функций, различных шаблонов на русском языке. Если поделитесь - это будет очень здорово.

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

Post by Infocatcher »

Instructor wrote:Added: method ScriptNoMutex - allow other scripts running with this script at the same time.
Updated:
goToLongestLine.js
AESCrypt.js
converter.js
getHash.js
LinesFilter_mod2.js
Last edited by Infocatcher on Wed Jan 05, 2011 2:51 pm, edited 1 time in total.

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

Post by Infocatcher »

Updated again. :)
Now second launch move focus to already opened dialog window, based on SetCoderExt.js code.

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

Post by FeyFre »

Infocatcher

Code: Select all

function findWindow(lpszClassName, hWndParent)
{
  var memClass = AkelPad.MemAlloc((lpszClassName.length + 1)*_TSIZE);
  if (!memClass)
    return 0;
  AkelPad.MemCopy(memClass, lpszClassName, _TSTR);
  var hWnd = oSys.Call("user32::FindWindowEx" + _TCHAR, hWndParent || 0, 0, memClass, 0);
  AkelPad.MemFree(memClass);
  return hWnd;
}
Ооооочень плохая идея. Гляньте опять в мой скрипт. Я первым аргументом передаю главное окно, а у Вас только ноль. Это не правильно. FindWindowEx перебирает детей указанного родителя, и только прямых детей, а не всех потомков. В случае 0 - детей рабочего стола. Диалог же, который Вы пытаетесь найти - не дочерний рабочему столу, а дочерний главному окну акела. И найден не будет.(И даже если я ошибся, то вот второй пункт) Также если запущено два акела, и два таких скрипта с таким окном, то где Вы прочитали что будет найдено именно нужное Вам окно - принадлежащее тому Акелу, из которого его ищут?

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

Post by Infocatcher »

FeyFre
Это понятно, но у меня ничего не вышло:

Code: Select all

	var hWndDialog = findWindow(windowClass);
	WScript.Echo(findWindow(windowClass, hMainWnd)); // Всегда 0
И в текущем виде работает. Все же это лучше, чем не делать при повторном запуске вообще ничего.

Видимо, что-то не так где-то здесь:

Code: Select all

	hWndDialog = oSys.Call(
		"user32::CreateWindowEx" + _TCHAR,
		0,             //dwExStyle
		windowClass,   //lpClassName
		0,             //lpWindowName
		0x90CA0000,    //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
		0,             //x
		0,             //y
		420,           //nWidth
		360,           //nHeight
		hMainWnd,      //hWndParent
		0,             //ID
		hInstanceDLL,  //hInstance
		dialogCallback //Script function callback. To use it class must be registered by WindowRegisterClass.
	);
, в hWndParent.

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

Post by FeyFre »

Infocatcher
Это понятно, но у меня ничего не вышло:
oSys.GetLastError() всегда есть. Что он возвращает?

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

Post by FeyFre »

SetCoderExt.js
Improved reaction on AkelPad shutdown sequence.

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

Post by Infocatcher »

FeyFre wrote:oSys.GetLastError() всегда есть. Что он возвращает?
0 возвращает.
Оно и понятно: окна.

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

Post by Infocatcher »

FeyFre wrote:Также если запущено два акела, и два таких скрипта с таким окном, то где Вы прочитали что будет найдено именно нужное Вам окно - принадлежащее тому Акелу, из которого его ищут?
На первый взгляд, проще всего вот так:

Code: Select all

	var hInstanceDLL = AkelPad.GetInstanceDll();
	var windowClass = "AkelPadScript:" + hInstanceDLL + ":" + WScript.ScriptName;

	var hWndDialog = findWindow(windowClass);
	if(hWndDialog) {
		AkelPad.SendMessage(hWndDialog, 7 /*WM_SETFOCUS*/, 0, 0);
		return;
	}
Вроде, работает правильно.
Locked