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

Russian main discussion
  • Author
  • Message
Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Хотелось бы дополнительный параметр в строку состояния, показывающий количество вхождений выделенного текста (возможно подсвеченного) в файле. Не знаю, возможно это слишком.. но было бы очень удобно.
Идея такова: выделяю текст и наглядно вижу (в виде количества вхождений), встречается он в тексте или нет. При рефакторинге кода, а это бывает чуть менее, чем постоянно :), это было бы очень полезно.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

пока не узнал о "суррогатных" символах, которые в UTF-8 представляются 4 байтами
Китайские иероглифы как раз 4 байта в UTF8 )

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

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

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Возможно ли отображения размера файла в строке состояния?

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

Post 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);
      }
    }
  }
}

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

Post by VladSh »

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

Offline
Posts: 157
Joined: Thu Nov 26, 2015 8:03 pm
Location: Rostov-on-Don

Post by Eskander88 »

Интересный принцип работы скрипта. Для человека плохо знакомого с низкоуровневым программированием подскажите пожалуйста, - я так понимаю, - отсутствия некоторых конструкций кода или неправильные числовые значения могут повлиять на работу других запущенных программ?

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

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

Offline
Posts: 157
Joined: Thu Nov 26, 2015 8:03 pm
Location: Rostov-on-Don

Post by Eskander88 »

Instructor
переформулирую вопрос: флаги из функций, вроде 10002, 1030, 0xE и т.п. Откуда брать их назначения?

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Eskander88
...Откуда брать их назначения?
WinApi
Пример

Offline
Posts: 330
Joined: Mon Jun 03, 2019 2:33 am

Post 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
Post Reply