Scripts plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

yozhic wrote:Подскажите, пожалуйста. Строка

Code: Select all

AkelPad.TextReplace(hEditWnd, "abc", "123", 0x00000001, false);
просто выделяет текст "abc", ничего не заменяя.
А если так

Code: Select all

AkelPad.TextReplace(0, "abc", "123", 0x00200001, true);
?
В стандартном окне замены есть кнопка "Найти далее" и "Заменить" - для пошаговой замены (т.е. для неё необходимо ещё действие/функция), а также кнопка "Заменить всё".

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »


YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

KDJ wrote:yozhic
About TextReplace:
Спасибо! Так, гораздо понятнее.

yozhic,
Другими словами, для Вашего примера, должно быть так:

Code: Select all

var hEditWnd= AkelPad.GetEditWnd();

var v=AkelPad.TextReplace(hEditWnd, "sio", "123", 0x00000001, false);
if (v > -1)
	AkelPad.TextReplace(hEditWnd, "sio", "123", 0x00400001, false);
А ещё есть такой скрипт "AkelPadMethodsView.js" от KDJ, очень полезная штука.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

The effect of TextReplace() with bAll==false, depends on whether matching text is selected in edit window.

1. If matching text is selected, TextReplace() replaces it and searches for the next occurrence,
- if the next was found, it will be selected and TextReplace() returns position of this next match,
- else -1 is returned.

2. If matching text isn't selected, TextReplace() don't replace, only searches for the next occurrence (so it works as TextFind()),
- if the next was found, it will be selected and TextReplace() returns position of this next match,
- else -1 is returned.

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

KDJ
Спасибо, это даже на несколько миллисекунд быстрее, чем

Code: Select all

AkelPad.TextFind(hEditWnd, "abc", 0x00000001);
AkelPad.ReplaceSel("");
YuS
Дык, как же без AkelPadMethodsView.js. Пользуюсь со дня публикации. Я в описании «bAll false одна замена.» немного неразобрался. Читаю «замена», значит должон заменять, а он не заменяет.
т.е. для неё необходимо ещё действие/функция
Вот эта мысль у меня смутно брезжила, но не был уверен. Теперь всё ясно, спасибо.

Offline
Posts: 53
Joined: Wed Dec 09, 2015 6:33 pm

Post by beotiger »

KDJ wrote:The effect of TextReplace() with bAll==false, depends on whether matching text is selected in edit window.
...
KDJ! May be it should be added to AkelPadMethodsView.js, for there is no informationa of such behaviour of TextReplace with bAll == false and I got same misuse as previous authors did.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

beotiger, этот скрипт в удобной форме показывает разделы содержимого файлов Script-Eng.txt/Script-Rus.txt.
В общем, это надо к Instructor-у обращаться, чтобы дополнить описание (наверное, лучше с готовыми вариантами), либо локально файл корректировать...

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Instructor
When I try to close any modified document (from the script), then displays message box "Document was modified. Do you want to save it?" and AkelPad hangs. On Win-XP sometimes, and on Win-7 always.
Try this test:

Code: Select all

var oSys     = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
var hInstDLL = AkelPad.GetInstanceDll();
var sClass   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hWndOwner;
var hButton;

hWndOwner = hMainWnd;
//or
//hWndOwner = 0;

AkelPad.WindowRegisterClass(sClass);
oSys.Call("User32::CreateWindowExW",
          0,                  //dwExStyle
          sClass,             //lpClassName
          WScript.ScriptName, //lpWindowName
          0x90CA0000,         //dwStyle=WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
          200,                //x
          200,                //y
          235,                //nWidth
          120,                //nHeight
          hWndOwner,          //hWndParent
          0,                  //hMenu
          hInstDLL,           //hInstance
          DialogCallback);
AkelPad.WindowGetMessage();
AkelPad.WindowUnregisterClass(sClass);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1 /*WM_CREATE*/)
    hButton =
      oSys.Call("User32::CreateWindowExW",
                0,                //dwExStyle
                "BUTTON",         //lpClassName
                "Close document", //lpWindowName
                0x50000001,       //dwStyle=WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON
                40,               //x
                40,               //y
                150,              //nWidth
                25,               //nHeight
                hWnd,             //hWndParent
                1000,             //ID
                hInstDLL,         //hInstance
                0);               //lpParam

  else if (uMsg == 7 /*WM_SETFOCUS*/)
    oSys.Call("User32::SetFocus", hButton);

  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    if (LoWord(wParam) == 1000)
      AkelPad.Command(4318 /*IDM_WINDOW_FRAMECLOSE*/);
    else if (LoWord(wParam) == 2 /*IDCANCEL*/)
      oSys.Call("User32::PostMessageW", hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16 /*WM_CLOSE*/)
  {
    oSys.Call("User32::DestroyWindow", hWnd);
    oSys.Call("User32::PostQuitMessage", 0);
  }

  return 0;
}

function LoWord(nParam)
{
  return nParam & 0xFFFF;
}

If hWndOwner = hMainWnd - AkelPad hangs, and if hWndOwner = 0 - works properly.
Is this a bug in the script or in AkelPad?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Instructor
Could you add optional parameter bAll for AkelPad.TextFind:
AkelPad.TextFind(hHandle, pFindIt, nFlags, bAll);
Return Value
- if bAll is true, the return value is count of occurences.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Instructor
Пытаюсь создать, с помощью функции AkelPad.CreateDialog(), диалог с главным меню. Не получается. AkelPad постоянно вылетает.

Code: Select all

var hMainMenu = CreateMainMenu();
...
//dwStyle=DS_SETFONT|WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
...
AkelPad.CreateDialog(...)
В качестве эксперимента попробовал код отсюда (второй пример). Тот же результат.
Хотя так: "oSys.Call("user32::CreateWindowEx"...", все работает прекрасно.
Выложу полный код скрипта и попрошу помощи (наверное), только если у Вас ошибка не воспроизведется :)

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Kley
Выложите минимальный код для воспроизведения ошибки.

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Instructor

Code: Select all

var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hWndDialog=0;
var wCommand;
var dwFlags=0x2 /*CDF_PIXELS*/;

//Control IDs
var IDC_BUTTON1=1001;

var IDM_EXIT = 2001;
var hMainMenu = CreateMainMenu();

if (AkelPad.WindowRegisterClass("My Class"))
{
  AkelPad.CreateDialog(0, "My Class", "My Title",  0x90CF0040 /*DS_SETFONT|WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX*/, 10, 10, 300, 200, hMainWnd, DialogCallback, dwFlags, hMainMenu, "|",
                       0, "BUTTON", "Button text 1", 0x50010001 /*WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON*/, 10, 10, 200, 20, IDC_BUTTON1);

  if (hWndDialog)
  {
    AkelPad.ScriptNoMutex();
    AkelPad.WindowGetMessage();
  }
  AkelPad.WindowUnregisterClass("My Class");
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x110 /*WM_INITDIALOG*/)
  {
    hWndDialog=hWnd;
  }
  else if (uMsg == 273 /*WM_COMMAND*/)
  {
    wCommand=LOWORD(wParam);

    if (wCommand == 2 /*IDCANCEL*/)
    {
      //Destroy dialog
      //Exit message loop
      oSys.Call("user32::PostQuitMessage", 0);
      oSys.Call("user32::DestroyWindow", hWnd);
    }
  }
  return 0;
}

function LOWORD(dwNumber)
{
  return (dwNumber & 0xffff);
}

function CreateMainMenu()
{
  var hMenu  = oSys.Call("User32::CreateMenu");
  var hMnuFile = oSys.Call("User32::CreatePopupMenu");

  oSys.Call("User32::AppendMenuW", hMenu, 0x0010 /*MF_POPUP*/, hMnuFile, "File");
    oSys.Call("User32::AppendMenuW", hMnuFile, 0x0000 /*MF_STRING*/, IDM_EXIT, "Exit");

  return hMenu;
}

Скорее, код с ошибкой :)

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Kley
Исправлено описание hMenu. Используйте SetMenu:

Code: Select all

...
  AkelPad.CreateDialog(0, "My Class", "My Title",  0x90CF0040 /*DS_SETFONT|WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX*/, 10, 10, 300, 200, hMainWnd, DialogCallback, dwFlags, 0 /*hMainMenu*/, "|",
...
    hWndDialog=hWnd;
    oSys.Call("user32::SetMenu", hWnd, hMainMenu);
...

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

Instructor,
спасибо. Сам бы и не подумал об этом.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Погоже баг нарисовался. И раньше такое случалось, но думал, что случайность.

В GetArgValue не берётся значение по умолчанию при передаче пустой строки.
Строка вызова:

Code: Select all

"test" Call("Scripts::Main", 1, "test.js", `-arg=""`)
Строка проверки:

Code: Select all

WScript.Echo(AkelPad.GetArgValue("arg", "default_text"));
От вида кавычек в аргументе не зависит.
Post Reply