Page 26 of 97

Posted: Wed Aug 04, 2010 2:27 pm
by Fr0sT
Вообще в доках по WSH есть такой пример (басик):

Code: Select all

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("C:\boot.ini")
Set TextStream = File.OpenAsTextStream(1)
MsgBox TextStream.ReadAll()
TextStream.Close
но из Акеля, как ни бился, ни черта не выходит :(

А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.

Posted: Wed Aug 04, 2010 2:28 pm
by VladSh
[Yustas.NeO]
Проверить на существование файла:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var bIsFileExist = fso.FileExists(pFile);
FileSystemObject

Posted: Wed Aug 04, 2010 4:00 pm
by Fr0sT
Обновил Base64 скрипт.
* Полностью переделал логику, теперь строки конвертируются из WideChar в Multibyte перед кодированием, и наоборот. Используется текущая кодировка документа.
* Удалён параметр dec16
* Обработанный текст остаётся выделенным
* При ошибках конвертирования widechar <-> multibyte выдаётся код ошибки.

Posted: Wed Aug 04, 2010 6:51 pm
by [Yustas.NeO]
FeyFre wrote:на MSDN
Уш пошлала, так пошлала (с) :)
Я пока еще только с "вашим" Сообщения главному окну пытаюсь разобраться, и никак не могу :) Тут не все такие "уверенные программисты" как вы ;)
Видать придется писать свой скрипт...
FeyFre wrote:А его не было когда я писал ответы, а потом ещё трижды исправлял пост. :P
Ага, то-то в том моем сообщении стоит пометка "редактировалось" ;)
FeyFre wrote:AkelPad.ReadFile() Вас чем не устраивает? Документацию читать нужно.
Это просто какая-то беда стала :( Смотрю в книгу вижу фигу :(


Fr0sT wrote:А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.
И мне :(


VladSh wrote:[Yustas.NeO]
Проверить на существование файла:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var bIsFileExist = fso.FileExists(pFile);
FileSystemObject
Шикарно!

Posted: Wed Aug 04, 2010 8:07 pm
by Deim0s
Fr0sT,
Обновил Base64 скрипт.
Скрипт теперь отлично работает, погонял его и так и сяк, работает как часы :).
В планах поддержка других инет-кодировок, если запал не пройдёт
Вот бы здорово было, подобный скрипт для Quoted-printable 8).

Instructor,

Если можно пару просьб по Вашим скриптам:

UrlEncode.js и UrlDecode.js - Не корректно работают с последним символом "?" (3F). Это ограничение какое-то или можно поправить?

DuplicateLines.js - Сейчас дублирует выделение, можно ли сделать так:
Если нет выделения - полностью дублировать строку на которой находиться курсор
Если есть выделение, дублировать строки, в которых есть выделение - полностью, не зависимо от выделенного текста?

Posted: Wed Aug 04, 2010 8:28 pm
by KDJ
Deim0s wrote:DuplicateLines.js - Сейчас дублирует выделение, можно ли сделать так:
Если нет выделения - полностью дублировать строку на которой находиться курсор
Если есть выделение, дублировать строки, в которых есть выделение - полностью, не зависимо от выделенного текста?
This is done in the script: LinesMoveDuplicateSelect.js. Try it.

Posted: Wed Aug 04, 2010 8:40 pm
by Deim0s
KDJ,
Sorry, I don't like multi-scripts. I like: one function - one script.

Posted: Wed Aug 04, 2010 9:10 pm
by VladSh
[Yustas.NeO] wrote:
FeyFre wrote:AkelPad.ReadFile() Вас чем не устраивает? Документацию читать нужно.
Это просто какая-то беда стала :( Смотрю в книгу вижу фигу :(
Scripts-Rus.txt
Для справки по выделенному слову можно заюзать OpenScriptsHelp.js (работает с OpenHelpString.js), в них как раз есть пример ReadFile.
Ну и см. в теме "Сборник скриптов", за много лет кой-чего наворотили )) - много хороших идей и готового кода ;)

[Yustas.NeO] wrote:
Fr0sT wrote:А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.
И мне :(
Пока можно сделать такой изврат:

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var pContent = "";
var pFile = "";

//Код

//Получаем программно, а как же ещё ))
pContent = "sfhasdfj";
pFile = AkelPad.GetAkelDir() + "\\AkelFiles\" + "...";

AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);		//Создание (закладки) нового файла

AkelPad.ReplaceSel(pContent);

AkelPad.SaveFile(AkelPad.GetEditWnd(), pFile);				//Сохраняем файл по пути и с именем pFile

AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4318 /*IDM_WINDOW_FRAMECLOSE*/, 0);		//Закрываем закладку только что созданного файла
Всё это будет так быстро, что на мощных компах даже не будет видно, что закладка мигает :)
Можно попробовать отключать прорисовку, но я не думаю, что это поможет, т.к. она отключает не прорисовку текущего окна редактирования (туда hEditWnd передаётся), а не всей проги.

Deim0s wrote:Sorry, I don't like multi-scripts. I like: one function - one script.
Это не всегда хорошо, особенно когда есть много общего кода: трудно поддерживать такой код...
Я использую несколько общих скриптов, как библиотеки функций, считаю, что это хорошим решением. Лучшим, чем копипаст. Копипаст хорош, когда одна меленькая функцейка, и только.

Posted: Thu Aug 05, 2010 8:36 am
by FeyFre
VladSh
Насчет WinHelp/HtmlHelp.
У MS действительно есть проблемы с ними.
1. Их вызов часто сопровождается утечками ресурсов.
2. В зависимости от способа их вызова, они могу блокировать/не блокировать окна приложений, вызываться/не вызываться дважды, завершаться/не завершаться после завершения родительского процесса.
3. У HtmlHelp есть свои заморочки по работе с InternetExpoler

Насчет "прорисовки окна редактирования"
WshShell.Run("%COMSPEC% /c " + "\"" + pChmKwPath + " " + pHelpPath + "\"", 0, true);
true означает "ждать пока порожденный процесс не завершится", т.е. Вы не закончите работать со справкой. А так как AkelPad у нас однопоточный, что автоматически означает что всё делается в GUI-потоке, то это означает что ни о каком взаимодействии с AkelPad не может идти речи(ни ввод/вывод, ни очередь сообщений, ни COM).
Поменяйте это флаг на false

Posted: Thu Aug 05, 2010 9:46 am
by VladSh
FeyFre
Спасибо огромное за чёткий ответ!
Хоть процесс cmd всё равно висит от AkelPad'а, но зато теперь можно продолжать работать в Akel'е.
8)

Posted: Thu Aug 05, 2010 10:20 am
by se7h
LanguageHelp.js v1.6

1.6: corrected call-method

Log() snippet

Posted: Thu Aug 05, 2010 10:39 am
by Fr0sT
Чудеса, но сегодня методика вывода в файл заработала! Встречайте - Log() snippet. Также, разумеется, можно применять для любых других текстовых операций.
Файл создаётся рядом с Akelpad.exe и называется по имени вызывающего скрипта, также пишется время, правда, в дефолтном формате.

Re: Log() snippet

Posted: Thu Aug 05, 2010 12:23 pm
by VladSh
Fr0sT wrote:Чудеса, но сегодня методика вывода в файл заработала!
Там имена функций (и всё такое) регистрозависимые, у меня когда-то тоже долго подобные траблы были...


Несколько замечаний по Log.js, не сочти за наезд :)

1. Очень плохо мусорить, тем более рядом с exe'шником. Файлы лучше ложить сюда:

Code: Select all

..:\Documents and Settings\USER\Local Settings\Temp\AkelPad\Logs\
либо в крайнем случае туда, куда сохраняет Sessions-плагин, т.е.:

Code: Select all

..:\Documents and Settings\USER\Application Data\AkelPad\Logs\
2. Формат времени можно вытягивать из настроек или прямо из AkelPad.ini, параметр DateLogFormat.

3. Сорри, но без отображения записей лога в отдельном окошке (внизу) онлайн, особого смысла в этом я не увидел. Может быть пока.

Posted: Thu Aug 05, 2010 12:47 pm
by FeyFre
1. Очень плохо мусорить, тем более рядом с exe'шником. Файлы лучше ложить сюда:
В нашем случае лучше именно у екзешника:
1. Достаточно большой процент(хоть и по сути маленький) имеют по несколько копий Акела в системе(У меня лично три штуки). Если они будут пихать логи в одну дырку одновременно, они в конце концов поругаются, и пользователь просто ничего не сможет прочесть в них.
2. Чем дальше лог от приложения, тем хуже для сопровождения.
3. У нас лог не постоянный, а отладочный. Т.е. создается когда нужно. А не за два с половиной час 20-метровый лог(и так круглосуточно накапливается история до 20-метровых 10 логов).

В крайнем случае можете себе изменить путь сами.
3. Сорри, но без отображения записей лога в отдельном окошке (внизу) онлайн, особого смысла в этом я не увидел. Может быть пока.
Запускаем второй АкелПад, открываем файл лога, запускаем плаг просмотра лога и смотрим как прокручивается :)

Posted: Thu Aug 05, 2010 1:32 pm
by Fr0sT
VladSh
да вроде всё копипастил из мануала, причем ошибка какая-то странная была... к тому же, когда не из Акеля запускал, всё срабатывало! Не знаю, мистика...

1. Ой, я фанат portable концепции и дико ненавижу раскидывать файлы и настройки по системе. Хотя на 7ке или под ограниченным юзером будут траблы... в этом случае можно сваливать логи в %TEMP%
2. Да, я смотрел InsertDate, но мне не показалось продуктивным в каждый вызов лога дёргать две системные функции. Так что сделал самое простое, что есть. Иначе код раздуется до сотни строк)
3. Да, действительно, можно сделать как сказал FeyFre, а можно и потом смотреть - меня лично на поиски способа вывода в лог натолкнул неприятный баг, который происходил в цикле на примерно 10ю итерацию (да ещё не каждый раз!) и рушил Акель. Для этих целей вывод в файл лучше всего.

В любом случае, это только набросок, и каждый волен переделать его по собственному желанию ;)