Page 2 of 2

Posted: Wed May 11, 2011 8:33 am
by VladSh
Хотелось бы дополнительный параметр в строку состояния, показывающий количество вхождений выделенного текста (возможно подсвеченного) в файле. Не знаю, возможно это слишком.. но было бы очень удобно.
Идея такова: выделяю текст и наглядно вижу (в виде количества вхождений), встречается он в тексте или нет. При рефакторинге кода, а это бывает чуть менее, чем постоянно :), это было бы очень полезно.

Posted: Fri May 13, 2011 10:36 am
by Fr0sT
пока не узнал о "суррогатных" символах, которые в UTF-8 представляются 4 байтами
Китайские иероглифы как раз 4 байта в UTF8 )

Posted: Fri May 13, 2011 11:50 am
by DrakonHaSh
Fr0sT wrote:
пока не узнал о "суррогатных" символах, которые в UTF-8 представляются 4 байтами
Китайские иероглифы как раз 4 байта в UTF8 )
http://ru.wikipedia.org/wiki/UTF-8
=>
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - музыкальные символы, редкие китайские иероглифы, вымершие формы письменности
а так весь китайский в 3-х байтах.

Posted: Sun Jul 24, 2011 1:15 pm
by Andrey_A_A
Возможно ли отображения размера файла в строке состояния?

Posted: Sun Jul 24, 2011 5:05 pm
by Instructor
Andrey_A_A
Макет как можно изменить строчку в строке состояния:

Code: Select all

//// Change user statusbar string.

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var hWndStatus;
var nParts;
var lpTextBuffer;
var pStatusText;
var nTextLength;

if (hWndStatus=oSys.Call("user32::GetDlgItem", hMainWnd, 10002 /*ID_STATUS*/))
{
  if (oSys.Call("user32::IsWindowVisible", hWndStatus))
  {
    if ((nParts=AkelPad.SendMessage(hWndStatus, 1030 /*SB_GETPARTS*/, 0, 0)) > 5)
    {
      if (lpTextBuffer=AkelPad.MemAlloc(1024 * _TSIZE))
      {
        //Get user status string
        AkelPad.SendMessage(hWndStatus, _TSTR?1037 /*SB_GETTEXTW*/:1026 /*SB_GETTEXTA*/, nParts - 1, lpTextBuffer);
        pStatusText=AkelPad.MemRead(lpTextBuffer, _TSTR);

        //Modify string
        nTextLength=AkelPad.SendMessage(hWndEdit, 0xE /*WM_GETTEXTLENGTH*/, 0, 0);
        pStatusText+=" Bytes:" + nTextLength;

        //Set user status string
        AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
        AkelPad.SendMessage(hWndStatus, _TSTR?1035 /*SB_SETTEXTW*/:1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
        AkelPad.MemFree(lpTextBuffer);
      }
    }
  }
}

Posted: Sun Jul 24, 2011 6:30 pm
by VladSh
Instructor
> StatusUserFormat.js
Здорово!
А можно ли это завернуть в скрипт-функцию, который положить в "Коллекцию скриптов"?
В функцию передавать:
- текст;
- булевый параметр "заменять или добавлять" (из агрументов).
Желательно назвать Print.js и функцию Print, чтобы меньше писать было.. Вот и удобный метод для отладки и вспомогательной информации для пользователя, не нуждающейся в выводе окна MsgBox'а! :)

Posted: Wed Nov 13, 2019 4:50 pm
by Eskander88
Интересный принцип работы скрипта. Для человека плохо знакомого с низкоуровневым программированием подскажите пожалуйста, - я так понимаю, - отсутствия некоторых конструкций кода или неправильные числовые значения могут повлиять на работу других запущенных программ?

Это в принципе то что нужно, как раз искал возможность для вывода доп.информации в статусной строке через скрипт. Сделать вывод текста значений под свои нужды не составит труда, но просто хочется понимать что в общем происходит в работе скрипта? :roll:

И такой ещё вопрос по строке состояния. Существует ли возможность вставки в текст управляющих символов, на подобии как bash скриптах, для изменения цвета текста и фона?

Posted: Sun Nov 08, 2020 4:38 pm
by Eskander88
Instructor
переформулирую вопрос: флаги из функций, вроде 10002, 1030, 0xE и т.п. Откуда брать их назначения?

Posted: Mon Nov 09, 2020 11:44 am
by opk44
Eskander88
...Откуда брать их назначения?
WinApi
Пример

Posted: Mon Nov 09, 2020 11:26 pm
by AZJIO
Eskander88
отсутствия некоторых конструкций кода или неправильные числовые значения могут повлиять на работу других запущенных программ?
на сколько будет неправильные это надо уточнить, если вместо окна AkelPad захватишь иное и вставишь в него текст, а этот текст был важен, то да, ты поломаешь в другой программе. Откуда известно на сколько ты можешь поломать.
переформулирую вопрос: флаги из функций, вроде 10002, 1030, 0xE и т.п. Откуда брать их назначения?
Для начала ищешь описание функции, в данном случае для элемента строки состояния, там много функций, добавить раздел, удалить раздел, добавить иконку и т.д. вот раздел "Строка состояния" описания AutoIt3, почитай что можно сделать с элементом строки состояния, основаны они на WinAPI, то есть функций в библиотеках DLL, остаётся научится их вызвать. Далее у функций есть флаги, это как пункты меню Command(4103), только в WinAPI флаг число может быть записан текстовой константой, в коде он так и пишется, чтобы было понятней действие, а интерпретатор подставляет число вместо текстовой константы, это число определяет в логическом условии разветвление действий, что хочет пользователь и выполняется код. В гугле вводишь "SB_GETTEXTW=" и ищешь чему оно равно, но не наоборот, нельзя искать =1030, так как это зависит от интерпретатора и в каком контексте используется константа она может совпадать с тучей таких же но для других целей. Число 10002 идектификатор строки состояния, он может назначаться принудительно, а может гененироваться следующий после последнего занятого, это зависит как автор программы написал программу. Можешь взять из дистрибутива AutoIt3 прогу Au3Info.exe и навести курсор на элемент, которого нужна инфа, он тебе выведет всё, ID (идентификатор, который будет 10002), дескриптор, координаты, текст, класс, заголовок окна, стили.
1030 /*SB_GETPARTS*/ видишь рядом расшифровка SB_GETPARTS, это пояснение SB_GETPARTS=1030, но в коде указано явно число, чтобы не создавать переменные в начале скрипта, а просто дописано комментарий имя константы, в описании функции читаешь что делает этот флаг, то есть "получить части", то есть количество частей, чтобы добавить новую часть и засунуть туда текст.
0xE /*WM_GETTEXTLENGTH*, расшифровываю WM = windows message (ссобщение винды) "GET TEXT LENGTH" = "ПОЛУЧИТЬ ДЛИНУ ТЕКСТА", то есть чтобы потом вывести это в строку состояния. Это применяется к дескриптору hWndEdit, то есть окна редактирования. Вот что можно сделать с RichEdit, осталось в гугле найти "константы RichEdit" и смотришь описание, это могут быть константы стиля, действия, события. Если элемент другой то и константы другие, точнее имена другие по действию. Для каждого элемента окна свои действия стили, события на реакцию/взаимодействие пользователя.
Ранее я выкладывал прогу для внешнего управления элементами окна AkelPad написанную на AutoIt3, там же есть захват данных из строки состояния. Возможно этот язык может быть для тебя легче как стартовый.

Image

Re:

Posted: Wed Oct 02, 2024 6:32 pm
by Infocatcher
Instructor wrote: Sun Jul 24, 2011 5:05 pmStatusUserFormat.js
Чудеса какие-то с памятью сегодня наблюдал.
Есть какая-то Windows 10 x64, есть winMergeTabs.js, иногда вместо запуска программы для сравнения падает AkelPad, условно на 10-й запуск (и что-то там насчет памяти пишет, сейчас не просмотреть, на другой Windows 10 x64 не падает).
Меняю на заглушку – падать будто бы перестает:

Code: Select all

function Statusbar() {
	this.get = this.set = this.save = this.restore = this.destroy = function() {};
	return; // <--
	…
}
Меняю способ возвращения изначального текста строки состояния – тоже падать перестает:

Code: Select all

	this.set = function(pStatusText) {
		_customStatus = pStatusText;
		//AkelPad.MemCopy(lpTextBuffer, pStatusText, _TSTR);
		//AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, lpTextBuffer);
		AkelPad.SendMessage(hWndStatus, _TSTR ? 1035 /*SB_SETTEXTW*/ : 1025 /*SB_SETTEXTA*/, nParts - 1, pStatusText); // <--
	};
Собственно, вопросов два:
1. Как давно заработали такие вызовы? Применительно к обратной совместимости. Я только нечто на тему про Scripts plugin v7.0 нашел.
2. Что будет на ANSI системах? А то мне негде проверить… И как обрабатывается память? Происходит просто получение указателя на область памяти, где хранится строка, без дополнительного копирования?

Re: Строка состояния

Posted: Fri Oct 04, 2024 10:37 am
by Instructor
Infocatcher
1. Похоже что место найдено верно :)
2. Строка преобразуется в однобайтовую на ANSI системах. Происходит копирование переданных переменных.

Re: Строка состояния

Posted: Sat Oct 05, 2024 4:48 pm
by Infocatcher
Instructor wrote: Fri Oct 04, 2024 10:37 am1. Похоже что место найдено верно :)
Спасибо!
Давненько я не запускал AkelPad 3.x, оказывается.
Раз никто не жаловался – или любителей ретро мало, или у скрипта мало пользователей: с подходящей версией Scripts плагина еще целая куча всего не работает.

Re: Строка состояния

Posted: Sun Oct 06, 2024 12:04 pm
by Instructor
Infocatcher
AkelPad 4.x работает на ANSI системах: Windows 95/98/Me. Тестировать AkelPad 3.x нет необходимости :)