Page 27 of 97

Posted: Thu Aug 05, 2010 1:56 pm
by VladSh
FeyFre wrote:В нашем случае лучше именно у екзешника:
1. Достаточно большой процент(хоть и по сути маленький) имеют по несколько копий Акела в системе(У меня лично три штуки). Если они будут пихать логи в одну дырку одновременно, они в конце концов поругаются, и пользователь просто ничего не сможет прочесть в них.
Редкая ситуация, но логично.
Сейчас, когда сессии могут храниться у пользователя в настройках, несколько Акелов разве имеют смысл?
FeyFre wrote:Запускаем второй АкелПад, открываем файл лога, запускаем плаг просмотра лога и смотрим как прокручивается
Спасибо за вариант, но... "Настроение у меня упало" (c) Панкратов-Чёрный :)


Fr0sT wrote:1. Ой, я фанат portable концепции и дико ненавижу раскидывать файлы и настройки по системе.
Portable может работать с флэшки.. создавать лог на ней??
Fr0sT wrote:2. Да, я смотрел InsertDate, но мне не показалось продуктивным в каждый вызов лога дёргать две системные функции. Так что сделал самое простое, что есть. Иначе код раздуется до сотни строк)
Также непродуктивно каждый раз внутри функции перепроверять на инициализацию.
Лучше так:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var logFile = fso.OpenTextFile(WScript.ScriptName + ".log", 8, true); // open for append, create if not exist;

function log(msg)
{
	logFile.WriteLine(Date() + "\t" + msg);
}
И подключать этот файл с помощью eval(ReadFile(...))



Instructor

Есть функция вставки даты, но жаль, нет функции её получения...

Code: Select all

AkelPad.SendMessage(AkelPad.GetMainWnd(), 273 /*WM_COMMAND*/, 4183, 0)
вставляет дату.
А можно сделать так, что если 2-м параметром идёт 0, то возвращать?
Типа вот так:

Code: Select all

var pDate = AkelPad.SendMessage(AkelPad.GetMainWnd(), 0, 4183, 0);
?

Posted: Thu Aug 05, 2010 2:19 pm
by FeyFre
VladSh
Очень и очень не рекомендовано запрашивать/отправлять данные размером больше машинного слова через WM_COMMAND(как и через многие другие), ибо междупроцессный барьер, и автоматического маршалинга для этого сообщения не выполняется.

Code: Select all

function GetLocalTime()
{
	var mem = AkelPad.MemAlloc(16/*sizeof(SYSTEMTIME)*/);
	if(!mem) return false;
	AkelPad.SystemFunction().Call("kernel32::GetLocalTime",mem);
	var res ={
	"Year":       AkelPad.MemRead(mem, 4/*DT_WORD*/),
	"Month":      AkelPad.MemRead(mem+2, 4/*DT_WORD*/),
	"DayOfWeek":  AkelPad.MemRead(mem+4, 4/*DT_WORD*/),
	"Day":        AkelPad.MemRead(mem+6, 4/*DT_WORD*/),
	"Hour":       AkelPad.MemRead(mem+8, 4/*DT_WORD*/),
	"Minute":     AkelPad.MemRead(mem+10, 4/*DT_WORD*/),
	"Second":     AkelPad.MemRead(mem+12, 4/*DT_WORD*/),
	"Millisecond":AkelPad.MemRead(mem+14, 4/*DT_WORD*/)
	};
	AkelPad.MemFree(mem);
	return res;
}

Posted: Thu Aug 05, 2010 2:51 pm
by VladSh
FeyFre
Спасибо, здорово.
Но это будет почти тоже, что и Date(), а хотелось бы дату в формате, настроеном в AkelPad'е, т.е. из DateLogFormat или DateInsertFormat.

Posted: Thu Aug 05, 2010 3:17 pm
by Fr0sT
Влад,
Portable может работать с флэшки.. создавать лог на ней??
1) Я не думаю, что кто-то будет отлаживать скрипты с флешки
2) Даже если это так, то не зря Акель запускается с флешки, и в этом случае мусорить логами в систему - еще более некошерно.
Также непродуктивно каждый раз внутри функции перепроверять на инициализацию
Лучше так:
Проверка строк - очень быстрый процесс по сравнению с запуском системной функции через Акелевскую обёртку (имхо: не замерял). Конечно, проверка на null была бы ещё быстрее, но изначально обнулять объекты не получается в выбранной структуре.
А твой вариант я конечно же рассматривал, и решил, что самодостаточная функция, все свои потроха содержащая внутри себя, - это очень хорошо, и ради этого можно пожертвовать небольшой потерей производительности при проверке на инициализированность.

Posted: Thu Aug 05, 2010 3:38 pm
by VladSh
Fr0sT wrote:проверка на null была бы ещё быстрее, но изначально обнулять объекты не получается в выбранной структуре.
У меня
:

Code: Select all

var FSO = null;
var logFile = null;

function log(msg)
{
   if (FSO == null)
      FSO = new ActiveXObject("Scripting.FileSystemObject");
   if (logFile == null)
      logFile = FSO.OpenTextFile(WScript.ScriptName+".log", 8, true); // open for append, create if not exist
   logFile.WriteLine(Date()+"\t" + msg);
}

Fr0sT wrote:решил, что самодостаточная функция, все свои потроха содержащая внутри себя, - это очень хорошо
Дык потроха-то не все внутри..

Code: Select all

var FSO;
var logFile;
всё равно ведь снаружи)

Posted: Thu Aug 05, 2010 8:17 pm
by Fr0sT
VladSh
мдя, действительно... собирался ведь засунуть внутрь, но позабыл... завтра проверю, работает ли, если объявить внутри. Если нет, то в самом деле сделаю проверку на null

Posted: Thu Aug 05, 2010 8:49 pm
by Infocatcher
Внутри:

Code: Select all

function log(msg) {
	(
		log.logFile
		|| (
			log.logFile = new ActiveXObject("Scripting.FileSystemObject")
				.OpenTextFile(WScript.ScriptName+".log", 8, true)
		)
	).WriteLine(Date()+"\t" + msg);
}
Совсем внутри:

Code: Select all

var log = (function() {
	var FSO = new ActiveXObject("Scripting.FileSystemObject");
	var logFile = FSO.OpenTextFile(WScript.ScriptName+".log", 8, true);
	return function(msg) {
		logFile.WriteLine(Date()+"\t" + msg);
	};
})();
Только вот зачем... :D

Posted: Fri Aug 06, 2010 7:45 am
by VladSh
Infocatcher
Варианты понятны и интересны.
Особенно второй. Это реально круто! 8)

Чтобы легче было копировать в свой код, наверное. Но я этим точно заниматься не буду /по моему лучше подключать чем копипасты разводить.../

Posted: Fri Aug 06, 2010 10:19 am
by Fr0sT
Infocatcher
мощные способ! Однако можно всё сделать гораздо проще: убрать
var FSO;
var logFile;
и всё))

Posted: Fri Aug 06, 2010 11:45 am
by VladSh
Изменился скрипт selCompleteLine.js.
В классе-объекте ch реализована логика обработки текста (выделения либо всего текста файла). Теперь достаточно описать в своём скрипте функцию process и вызвать один из двух методов: ch.run() или ch.runWithRedraw(). Всё просто и надёжно как старый советский табурет.
Подробности см. в самом скрипте - комментариев навалом.

Вследствие этих изменений откорректированы, а большинство полностью переписаны:
CtrlDown.js
CommentsAdd.js, CommentsDel.js, CommentsExt.js
HTMLlinefeed.js
InsertInetStyleQuote.js
HTMLDelRow.js, HTMLDelUselessTags.js, HTMLDelAllTags.js
DelLineFeed.js и альтернативная реализация скриптов DelEmptyLines.js, DelLeadTrailSpaces.js
CreateSubParagraph.js
DelInsideSpaces.js

Структуру скриптов и как используется класс-объект ch можно посмотреть в этих скриптах.

Добавлено:
Также в selCompleteLine.js имеется класс-объект strExt с некоторыми дополнительными функциями по работе со строками.

Posted: Fri Aug 06, 2010 11:54 am
by VladSh
Fr0sT wrote:Однако можно всё сделать гораздо проще: убрать var FSO; var logFile; и всё))
Без var переменная сразу же попадает из локальной области видимости в глобальную.
Для AkelPad'а я не знаю, чем это "грозит" (вероятно ничем )) ), но вообще (для браузеров) это нехорошая практика.

Posted: Fri Aug 06, 2010 12:15 pm
by FeyFre
VladSh
Дело конечно не моё, но Вы немножко неудачно обозвали Helper-объекты ch strExt.
Такие имена очень часто используют для временных переменных а значит объекты будут недоступны.

Posted: Fri Aug 06, 2010 12:24 pm
by Fr0sT
VladSh
Этого и добивался) Да и var, описанная вне функции, и так имеет область видимости на всё пространство скрипта...

Posted: Fri Aug 06, 2010 12:29 pm
by VladSh
FeyFre
Спасибо за замечание. Я тоже долго думал, как их назвать... :)

Исходил из того, чтобы название было:
- короткое;
- "органично", т.е. вписывалось в код, чтобы он не "рябил";
- подходило по смыслу;
- редко использовалось в других местах (уникальное) /просто мной такие идентификаторы переменных ещё не использовались ))/

Варианты вместо ch: TextChanger, TCh, и т.п. не подошли, т.к. первая буква T неорганично смотрится. А вместо strExt: я рассматривал Str, но это действительно часто используется.

to All
Предложите свои варианты, если они подойдут по "принципам", то конечно же переименую - не проблема (всем же пользоваться, не только мне).
Особенно легко это сделать сейчас, пока ещё никто не пользуется в своих скриптах.

Posted: Fri Aug 06, 2010 2:09 pm
by Fr0sT
Влад, можешь уникальный префикс добавить. Например, SCL_strExt. А то и namespace сымитировать:
var selCompleteLines {
var ch
var strExt
}

selCompleteLines.strExt.someMethod()