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
То да...
кроссавцы ещё те!
Добавлено : можно ли получить
nCodePage ,
bBOM ,
nNewLine для неоткрытого файла, например для файла из списка свежих?
Posted: Thu Jun 23, 2011 1:55 pm
by Instructor
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
Call AkelPad.Include("Functions.vbs")?
Posted: Fri Jun 24, 2011 11:40 am
by Infocatcher
undoableReopen.js undoableReopen.js 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);
}
Но с сохранением и восстановлением положения прокрутки и выделения происходит что-то странное. То есть оно работает, но код странный.
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
Всё-таки пункт два перевешивает любые подсчеты. От привычки не убежишь.