Конечно изменилось, - переменной-то нет, значит память не занимается ))
Делается для того, чтобы понять:
- файл существует или нет;
- есть в файле что-то или нет.
ReadFile все эти проверки делает сам.
Если я буду создавать объект fso, а затем File, чтобы проверить его объём, то выйдет шило на мыло. + (вернее минус) лишние строки кода.
Вопрос по скрипту GetOffset.js.
В чём смысл строки
если nCaretPos возвращает то же самое, что и AkelPad.GetSelStart()?
Posted: Tue Jul 26, 2011 8:10 pm
by FeyFre
VladSh, насчет AkelPad.ReadFile
1. Сначала выполняется определение кодировки, для этого читается кусочек файла(тратим время на файловый I/O).
2. Потом выполняется полное чтение файла в память, при этом выделяется память под содержимое(сколько - зависит от кодировки, время на файловый I/O)
3. Потом заносится текст в скрипт: для этого выполняется выделение памяти опять, и копирование туда ранее прочитанного текста из п.2
4. Потом освобождаем выделенную память в п.2
5. Потом выполняется возврат из функции в скрипт, с преобразованием COM-прелставления строки в JScript/VBScript(освобождение памяти из п.3 и создание памяти под строчный объект, который создается несмотря на то что никто на него явно не держит ссылки - условный оператор держит)
6. Потом выполняется вычисление условного выражения - проверяется кол-во букв в строке.
7. И вот аж сейчас освобождается память из п.5
Самим содержимым памяти мы никогда не пользуемся, но как видите мы его читаем(время тратим, почитайте так с дискеты) и дважды копируем(одновременно дважды полностью выделяем под него память), да и ещё свопинг от этого страдает(но это уже на любителя). Не лучше ли напрямую спросить ФС о таком то файле, без лишних телодвижений? Будет и быстрее и меньше памяти скушаем.
Например делать выделение мы можем как с конца в начало (тогда GetSelStart будет совпадать), так и с начала в конец (тогда GetSelEnd будет совпадать).
Posted: Sat Jul 30, 2011 7:19 pm
by Fr0sT
FeyFre
ага, напутал с разрядами. Но принцип ведь такой же, да и логичнее выглядит. Если только в JS не возникнет траблы с целочисленными типами
Posted: Sat Jul 30, 2011 10:47 pm
by Xephon
В последнем SearchReplace.js высота диалогового окна не меняется, вне зависимости от того, какое число стоит в строке "ScaleY(200) + sizeNonClient.cy, //nHeight". На 120 dpi диалог получается обрезанным снизу.
Posted: Sun Jul 31, 2011 3:50 am
by Instructor
Xephon
Исправлено. Будет доступно после релиза.
Posted: Sun Jul 31, 2011 9:04 am
by Xephon
Спасибо. Еще пара пожеланий по SearchReplace.js:
- Текст поиска и замены сохраняется с использованием буфера в 256 байт. Иногда такого размера бывает недостаточно. Хотелось бы, чтобы длина текста определялась сначала через WM_GETTEXTLENGTH и память под буфер выделялась динамически. Или, хотя бы, чтобы в первых строчках файла появилась переменная, отвечающая за размер буфера.
- Из-за "AkelPad.GetSelText(2 /*\n*/);" регулярное выражение ".+" находит соответствие только до конца строки. Писать каждый раз "(.|\n)+" весьма неудобно. Было бы неплохо сделать опцию, определяющую аргумент GetSelText. Либо просто заменить везде "AkelPad.GetSelText(2 /*\n*/);" на "AkelPad.GetSelText();".
Posted: Sun Jul 31, 2011 3:34 pm
by Instructor
Xephon wrote:Хотелось бы, чтобы длина текста определялась сначала через WM_GETTEXTLENGTH и память под буфер выделялась динамически.
Реализовано.
- Из-за "AkelPad.GetSelText(2 /*\n*/);" регулярное выражение ".+" находит соответствие только до конца строки. Писать каждый раз "(.|\n)+" весьма неудобно.
MSDN wrote:. Matches any single character except the newline character \n.
Instructor, спасибо, я знаю, что "." не должна соответствовать "\n" и не утверждаю, что это ошибка в скрипте. Я говорю лишь о том, что было бы удобно исключить символ "\n" из текста, возвращаемого GetSelText, т.к. ".+" банально гораздо короче, чем "(.|\n)+" или чем предложенный Infocatcher-ом "[\s\S]+". А т.к. кому-то может быть удобно существующее поведение, я предложил сделать опцию, определяющую аргумент GetSelText, чтобы после каждого обновления не искать нужные строчки в файле и не исправлять их вручную.
Posted: Mon Aug 01, 2011 6:15 am
by Instructor
Xephon
Опцию конечно можно, но многострочные поиск/замена не будут работать.