Page 26 of 74

Posted: Wed Dec 08, 2010 6:20 pm
by Infocatcher

Code: Select all

  GetSelText([nNewLine]);
    1    //"\r" формат новой строки (по умолчанию).
    2    //"\n" формат новой строки.
    3    //"\r\n" формат новой строки.

  GetTextRange(nRangeStart, nRangeEnd[, nNewLine]);
    1    //"\r" формат новой строки (по умолчанию).
    2    //"\n" формат новой строки.
    3    //"\r\n" формат новой строки.

  GetEditNewLine(hHandle);
Возвращаемое значение
  1  DOS/Windows (0Dh, 0Ah)
  2  Unix (0Ah)
  3  Mac (0Dh)
Почему не одинаково?

Code: Select all

AkelPad.GetSelText(AkelPad.GetEditNewLine(0));
AkelPad.GetSelText(4 - AkelPad.GetEditNewLine(0));
Сомнительное удобство.


При запуске несуществующего скрипта сообщения двоятся:
AkelPad
---------------------------
Невозможно открыть файл "...\fileName.js".
---------------------------
ОК
Scripts плагин
---------------------------
Не удается прочитать файл "...\fileName.js".
---------------------------
ОК

Posted: Wed Dec 08, 2010 7:26 pm
by FeyFre
Infocatcher, продолжают проявляться последствия
Исправлено: отсутствие сообщения при ошибке открытия/сохранения файла.
Я уже у себя исправил. Кстати, AkelPad.ReadFile() тоже будет неожиданно матерится.

Posted: Wed Dec 08, 2010 7:54 pm
by Infocatcher
FeyFre wrote:Кстати, AkelPad.ReadFile() тоже будет неожиданно матерится.
В смысле?
AkelPad
---------------------------
Невозможно открыть файл "c:\test".
---------------------------
ОК
Или раньше он вообще молчал?

[Upd]
А ведь и правда молчал. :)

Posted: Wed Dec 08, 2010 9:13 pm
by FeyFre
Infocatcher, Инструктор немножко не там материлку вставил. Вот и матерится теперь на всех и вся.

Posted: Thu Dec 09, 2010 5:27 am
by Infocatcher

Code: Select all

WScript.Echo(typeof AkelPad.ReadFile("xxx")); // "string"
Если возвращать undefined (и убрать сообщение об ошибке), то будет достаточно встроенных средств, чтобы узнать, есть ли файл.

Posted: Thu Dec 09, 2010 6:44 am
by Instructor
Infocatcher
А еще можно использовать FileExists :)

Posted: Thu Dec 09, 2010 8:17 am
by FeyFre
Instructor, файл может быть и Exists но вот если какая-нибудь гадость откроет его не разрешая совместное чтение, то всё-равно матернется. :)
(А в плагине функцию FileExists ещё нужно написать, что совсем не хочется делать. Я раньше полагал что AKD_DETECTCODEPAGE либо вернет EDT_SUCCESS, либо молча код ошибки, а я уде сам позабочусь об уведомлениии.. теперь приходится терпеть).

Posted: Thu Dec 09, 2010 9:01 am
by Instructor
FeyFre
Добавил флаг ADT_NOMESSAGES в AKD_DETECTCODEPAGE.

Posted: Thu Dec 09, 2010 4:50 pm
by Infocatcher

Code: Select all

AkelPad.MessageBox(hWndParent, "Text", "Caption", 0 /*MB_OK*/);
Специально центрируется не относительно hWndParent?

Как насчет чего-нибудь вроде

Code: Select all

AkelPad.log("Some message");
?
Чтобы, пока не появится какая-нибудь консоль, писало в «WScript.ScriptFullName + ".log"», примерно

Code: Select all

// Usage:
//   eval(AkelPad.ReadFile(AkelPad.GetAkelDir(5 /*ADTYPE_SCRIPTS*/) + "\\modules\\__log.js"));
//   _log("Message");

function _log() {
	var logFile = WScript.ScriptFullName + ".log";
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	_log = function() {
		var textStream = fso.OpenTextFile(logFile, 8 /*append*/, true /*create*/, -1 /*unicode*/);
		for(var i = 0, l = arguments.length; i < l; i++)
			textStream.WriteLine(arguments[i]);
		textStream.close();
	};
	return _log.apply(this, arguments);
}

Или AkelPad._log(), чтобы отделить отладочную функцию от остальных.

Posted: Sun Dec 19, 2010 12:38 am
by Infocatcher
В дополнение к
viewtopic.php?p=10177#p10177
Infocatcher wrote:Для случая, когда скрипт реализует немодальное окошко, очень хотелось бы возможность одновременного запуска нескольких скриптов.
Во-первых, очень неудобно, что скрипты ставятся в очередь. Можно «забыть» окошко от скрипта и выполнить что-нибудь пару раз – мол, вдруг не нажалось в первый раз, странно.
А хотелось бы, чтобы нельзя было запустить второй раз уже работающий скрипт. Если скрипт создал окошко, то при попытке запуска перевести фокус на это окошко. И, соответственно, чтобы разные скрипты запускались без всяких ограничений.

Posted: Sun Dec 19, 2010 9:20 am
by FeyFre
Infocatcher, у меня вообще все скрипты стают в очередь, и не важно, один и тот же запускается, или разные.
Насчет второго запуска: пусть скрипт сам беспокоится о втором запуске. Точно также каждая программа сама заботится что-бы дважды не запустится(причем дважды - ещё с какой стороны посмотреть).

А вот с очередью проблема:
1. Запускаем скрипт, который работает достаточно долго.
2. Запускаем второй, стает в очередь.
3. Выходим из АП. Первый видит АП закрывают и завершается, тут второй и запускается начинает работать, ну и в результате access violation с предложение отправить посылку на Редмонд.

Posted: Fri Dec 24, 2010 4:26 pm
by Infocatcher
Какой-то странный баг с восстановлением выделения при отключении перерисовки окна, если прокрутка не на самом верху – каретка отрисовывается совсем не там, где она находится (после перерисовки окна становится нормально).
Пример:

Code: Select all

/// Rename current editing file

//Variables
var fso=new ActiveXObject("Scripting.FileSystemObject");
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var pScriptName=WScript.ScriptName;
var pFileFullName=AkelPad.GetEditFile(0);
var pFileName=fso.GetFileName(pFileFullName);
var pFileDir=GetParent(pFileFullName);
var pText="";

if (hMainWnd)
{
  pText=AkelPad.InputBox(hMainWnd, pScriptName, GetLangString(0), pFileName);

  if (pText)
  {
    var OD_ADT_BINARY_ERROR    =1
    var OD_ADT_REG_CODEPAGE    =2
    var OD_ADT_DETECT_CODEPAGE =4
    var OD_ADT_DETECT_BOM      =8

    var pNewFileFullName=pFileDir + "\\" + pText;
    var nFlags=OD_ADT_BINARY_ERROR|OD_ADT_DETECT_CODEPAGE|OD_ADT_DETECT_BOM;
    var nCodePage=0;
    var nBOM=0;

    var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/, true);
    if(lpPoint) {
      var hWndEdit = AkelPad.GetEditWnd();
      AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
      var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
      var ss = AkelPad.GetSelStart();
      var se = AkelPad.GetSelEnd();

      //Close editing file
      if(AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4324 /*IDM_WINDOW_FILECLOSE*/, 0)) {
        //Rename file
        fso.MoveFile(pFileFullName, pNewFileFullName);
  
        //Open file
        AkelPad.OpenFile(pNewFileFullName, nFlags, nCodePage, nBOM);
  
        hWndEdit = AkelPad.GetEditWnd();
        setRedraw(hWndEdit, false);
        AkelPad.SetSel(ss, se);
        columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);
        AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
        setRedraw(hWndEdit, true);
      }      
      AkelPad.MemFree(lpPoint, true);
    }
  }
}


//Functions
function GetParent(pFile)
{
  var i;

  for (i=pFile.length - 1; i >= 0; --i)
  {
    if (pFile.charAt(i) == '\\')
      return pFile.substr(0, i);
  }
  return "";
}

function setRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

function GetLangString(nStringID)
{
  var nLangID;

  nLangID=oSys.Call("kernel32::GetUserDefaultLangID");
  nLangID=nLangID & 0x3ff; //PRIMARYLANGID

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041D\u043E\u0432\u043E\u0435\u0020\u0438\u043C\u044F\u003A";
  }
  else
  {
    if (nStringID == 0)
      return "New name:";
  }
  return "";
}


Без отключения перерисовки уже нормально – см. viewtopic.php?p=10561#p10561.


Заодно хотелось бы как-нибудь восстанавливать еще и закладки. Точнее, лучше бы можно было позвать для этого дела Sessions.

Posted: Sun Jan 02, 2011 9:00 pm
by Infocatcher
Для тестирования скриптов было бы очень удобно при открытии диалога выбирать последний использовавшийся скрипт.
Плюс было бы удобнее с немодальным диалогом.

Posted: Mon Jan 03, 2011 3:25 pm
by Instructor
Infocatcher wrote:Для тестирования скриптов было бы очень удобно при открытии диалога выбирать последний использовавшийся скрипт.
Реализовано.

Posted: Mon Jan 03, 2011 5:56 pm
by Instructor
Добавлено: метод ScriptNoMutex - разрешить одновременную работу других скриптов во время работы данного скрипта.
Добавлено: константа _X64, определяющая тип операционной системы - x86 или x64.
Добавлено: DT_QWORD для копирования/чтения восьмибайтового числа из памяти на x64 (QWORD) или четырехбайтового числа на x86 (DWORD).
Добавлено: локально запоминается последний использованный скрипт.

Added: method ScriptNoMutex - allow other scripts running with this script at the same time.
Added: constant _X64, which determines the type of operating system - x86 or x64.
Added: DT_QWORD to copy/read QWORD number from memory on x64 or DWORD number in x86.
Added: locally remembered the last used script.


Scripts plugin v7.5