Page 68 of 74

Posted: Mon Dec 28, 2015 4:49 pm
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);
?
В стандартном окне замены есть кнопка "Найти далее" и "Заменить" - для пошаговой замены (т.е. для неё необходимо ещё действие/функция), а также кнопка "Заменить всё".

Posted: Mon Dec 28, 2015 6:40 pm
by KDJ

Posted: Mon Dec 28, 2015 7:38 pm
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, очень полезная штука.

Posted: Mon Dec 28, 2015 8:19 pm
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.

Posted: Mon Dec 28, 2015 8:55 pm
by yozhic
KDJ
Спасибо, это даже на несколько миллисекунд быстрее, чем

Code: Select all

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

Posted: Wed Dec 30, 2015 3:34 am
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.

Posted: Wed Dec 30, 2015 5:43 am
by YuS
beotiger, этот скрипт в удобной форме показывает разделы содержимого файлов Script-Eng.txt/Script-Rus.txt.
В общем, это надо к Instructor-у обращаться, чтобы дополнить описание (наверное, лучше с готовыми вариантами), либо локально файл корректировать...

Posted: Thu Jan 21, 2016 6:49 pm
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?

Posted: Sat Jan 23, 2016 2:26 pm
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.

Posted: Sat Jan 30, 2016 10:10 am
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"...", все работает прекрасно.
Выложу полный код скрипта и попрошу помощи (наверное), только если у Вас ошибка не воспроизведется :)

Posted: Sun Feb 21, 2016 5:04 pm
by Instructor
Kley
Выложите минимальный код для воспроизведения ошибки.

Posted: Mon Feb 22, 2016 5:08 am
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;
}

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

Posted: Mon Feb 22, 2016 9:20 am
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);
...

Posted: Mon Feb 22, 2016 10:11 am
by Kley
Instructor,
спасибо. Сам бы и не подумал об этом.

Posted: Tue Mar 01, 2016 4:14 pm
by VladSh
Погоже баг нарисовался. И раньше такое случалось, но думал, что случайность.

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

Code: Select all

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

Code: Select all

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