Page 90 of 97

Posted: Thu Jun 23, 2011 12:58 pm
by VladSh
Получилось, что своё пред. сообщение я отредактировал раньше)

Posted: Thu Jun 23, 2011 1:09 pm
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

Posted: Thu Jun 23, 2011 1:17 pm
by VladSh
Instructor
Подкорректировал CommonFunctions.js, спасибо за замечание!

Но формат новой строки всё равно от этого не зависит. Буду пользоваться nNewLine.. плохо, что оно ко всей проге относится (hWndMain), а не к определённой вкладке (hWndEdit).
Хотя неудобно это всё.. - часть параметров идёт в функциях, а часть отдельным месседжем. Лучше бы всё-таки при создании иметь возможность всё это задавать.
Instructor wrote:Возможно жалобы на падения программы как раз связаны
Нет, падает от совершенно разных скриптов. Несколько раз упало даже на простейшем FileNameCopyToCB.js, в котором нет вызовов WinAPI.

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

Posted: Thu Jun 23, 2011 1:26 pm
by VladSh
Вопрос в том, почему вдруг стало падать, хотя до этого работало (и вероятно "память портилась") несколько лет :)
Instructor wrote:Читаем AKD_SETNEWLINE.
Ясно. hMainWnd сбивает с толку ))

Posted: Thu Jun 23, 2011 1:29 pm
by Instructor
VladSh
Это видимо вопрос к создателям скриптов, которые суют в них некорректные вызовы :)

Posted: Thu Jun 23, 2011 1:39 pm
by VladSh
Instructor
То да... кроссавцы ещё те! :mrgreen:


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

Posted: Thu Jun 23, 2011 1:55 pm
by Instructor
VladSh wrote:То да... кроссавцы ещё те! :mrgreen:

Code: Select all

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

Posted: Fri Jun 24, 2011 6:51 am
by VladSh
Instructor
То для меня сложновато.. оставлю пока как есть.


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

Code: Select all

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

Code: Select all

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

Posted: Fri Jun 24, 2011 11:40 am
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

Posted: Fri Jun 24, 2011 11:12 pm
by Andrey_A_A
Пара моментов по Descript.vbs:
Подправил Descript.vbs

Posted: Sun Jun 26, 2011 4:44 am
by Instructor
poma
Доработка добавлена к сообщению FeyFre при желании он может объединить изменения в AutoTag.js.

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

Posted: Sun Jun 26, 2011 10:32 am
by FeyFre
Instructor
1. EM_EXGETSEL - всё-таки один вызов(SendMessage), а не два(GetSelStart, GetSelEnd)

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

Posted: Sun Jun 26, 2011 3:35 pm
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.

Posted: Sun Jun 26, 2011 7:56 pm
by FeyFre
Instructor
Всё-таки пункт два перевешивает любые подсчеты. От привычки не убежишь.