Scripts discussion (1)

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

Post by VladSh »

Получилось, что своё пред. сообщение я отредактировал раньше)

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

Post by Instructor »

VladSh
Насчет новой строки можно так:

Code: Select all

var nNewLine=AkelPad.GetEditNewLine(0);

...
AkelPad.Command(4101 /*IDM_FILE_NEW*/);
AkelPad.SendMessage(hMainWnd, 1230 /*AKD_SETNEWLINE*/, 0, nNewLine);
...
Возможно жалобы на падения программы как раз связаны с
некорректным форматом передаваемой переменной pFilter функции FileDialog

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

Post by VladSh »

Instructor
Подкорректировал CommonFunctions.js, спасибо за замечание!

Но формат новой строки всё равно от этого не зависит. Буду пользоваться nNewLine.. плохо, что оно ко всей проге относится (hWndMain), а не к определённой вкладке (hWndEdit).
Хотя неудобно это всё.. - часть параметров идёт в функциях, а часть отдельным месседжем. Лучше бы всё-таки при создании иметь возможность всё это задавать.
Instructor wrote:Возможно жалобы на падения программы как раз связаны
Нет, падает от совершенно разных скриптов. Несколько раз упало даже на простейшем FileNameCopyToCB.js, в котором нет вызовов WinAPI.
Last edited by VladSh on Thu Jun 23, 2011 1:42 pm, edited 2 times in total.

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

Post by Instructor »

VladSh wrote:...плохо, что оно ко всей проге относится (hWndMain), а не к определённой вкладке (hWndEdit).
Читаем AKD_SETNEWLINE.
VladSh wrote:Нет, падает от совершенно разных скриптов. Несколько раз упало даже на простейшем FileNameCopyToCB.js, в котором нет вызовов WinAPI.
Чего нет :) Если память испорчена неправильным вызовом, то в дальнейшем упасть может на совершенно безобидной операции.

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

Post by VladSh »

Вопрос в том, почему вдруг стало падать, хотя до этого работало (и вероятно "память портилась") несколько лет :)
Instructor wrote:Читаем AKD_SETNEWLINE.
Ясно. hMainWnd сбивает с толку ))

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

Post by Instructor »

VladSh
Это видимо вопрос к создателям скриптов, которые суют в них некорректные вызовы :)

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

Post by VladSh »

Instructor
То да... кроссавцы ещё те! :mrgreen:


Добавлено: можно ли получить nCodePage, bBOM, nNewLine для неоткрытого файла, например для файла из списка свежих?

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

Post by Instructor »

VladSh wrote:То да... кроссавцы ещё те! :mrgreen:

Code: Select all

#define true (Math.random()>0.5)
:)
VladSh wrote:можно ли получить nCodePage, bBOM, nNewLine для неоткрытого файла, например для файла из списка свежих?
Можно прочитать из записи реестра или определить кодировку файла чуть дописав IsFileBinary.js

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

Post by VladSh »

Instructor
То для меня сложновато.. оставлю пока как есть.


Andrey_A_A
Пара моментов по Descript.vbs:

Code: Select all

File = AkelPad.GetEditFile(0)
Файл может быть не сохранён...

Code: Select all

Call AkelPad.Include("Functions.vbs")
?

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

Post by Infocatcher »

Code: Select all

var oSys = AkelPad.SystemFunction();
var hWndEdit = AkelPad.GetEditWnd();
if(hWndEdit)
	undoableReopen();
function undoableReopen() {
	var file = AkelPad.GetEditFile(0);
	if(!file)
		return;

	var text = AkelPad.ReadFile(file);
	if(text == AkelPad.GetTextRange(0, -1, 4 - AkelPad.GetEditNewLine(0)))
		return;

	// Based on Instructor's code: http://akelpad.sourceforge.net/forum/viewtopic.php?p=13296#p13296
	var lpSel = AkelPad.MemAlloc(_X64 ? 56 : 28 /*sizeof(AESELECTION)*/);
	if(!lpSel)
		return;
	var lpCaret = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
	if(!lpCaret)
		return;
	AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, true);
	AkelPad.SendMessage(hWndEdit, 3125 /*AEM_GETSEL*/, lpCaret, lpSel);

	noScroll(function() {
		AkelPad.SetSel(0, -1);
		AkelPad.ReplaceSel(text);

		var dwFlags = AkelPad.MemRead(lpSel + (_X64 ? 48 : 24) /*AESELECTION.dwFlags*/, 3 /*DT_DWORD*/);
		AkelPad.MemCopy(lpSel + (_X64 ? 48 : 24) /*AESELECTION.dwFlags*/, dwFlags | 0x808 /*AESELT_LOCKSCROLL|AESELT_INDEXUPDATE*/, 3 /*DT_DWORD*/);
		AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel);
		AkelPad.SendMessage(hWndEdit, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, false);
	});
	AkelPad.SendMessage(hWndEdit, 3126 /*AEM_SETSEL*/, lpCaret, lpSel); // Needed for show caret
}
function noScroll(func, hWndEdit) {
	if(!hWndEdit)
		hWndEdit = AkelPad.GetEditWnd();
	var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true);
	if(!lpPoint)
		return;
	setRedraw(hWndEdit, false);
	AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

	func();

	AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
	setRedraw(hWndEdit, true);
	AkelPad.MemFree(lpPoint, true);
}
function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

Но с сохранением и восстановлением положения прокрутки и выделения происходит что-то странное. То есть оно работает, но код странный. :D

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

Post by Andrey_A_A »

Пара моментов по Descript.vbs:
Подправил Descript.vbs

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

Post by Instructor »

poma
Доработка добавлена к сообщению FeyFre при желании он может объединить изменения в AutoTag.js.

FeyFre
В скрипте AutoTag.js не совсем понятно для чего используются EM_EXGETSEL и EM_SETSEL, когда есть GetSelStart, GetSelEnd, SetSel.

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

Post by FeyFre »

Instructor
1. EM_EXGETSEL - всё-таки один вызов(SendMessage), а не два(GetSelStart, GetSelEnd)

2. Привычка. В C-коде у меня ведь только они и есть ;)

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

Post by Instructor »

FeyFre wrote:Instructor
1. EM_EXGETSEL - всё-таки один вызов(SendMessage), а не два(GetSelStart, GetSelEnd)
Можно посчитать:
1. AkelPad.MemAlloc, 2. EM_EXGETSEL, 3. MemRead, 4. MemRead, 5. EM_SETSEL, 6. MemFree.
1. GetSelStart, 2. GetSelEnd, 3. SetSel.

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

Post by FeyFre »

Instructor
Всё-таки пункт два перевешивает любые подсчеты. От привычки не убежишь.
Locked