Как цивилизованно получить заголовок панели

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
HaRT
Moderator
Posts: 9689
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 124 times
Been thanked: 249 times

Как цивилизованно получить заголовок панели

Post by HaRT »

В некоторых скриптах требуется получать заголовок той или иной панели. Именно не путь директории, открытой в панели, а тот заголовок, который отображается на верхней рамке, например, C:\…al Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86. Сейчас в ClickToTitleDir это делается варварским способом через Screen Grabber и разбор полученной строки. Но такой путь не годится для условия срабатывания макроса.

Есть ли какой-то более стройный способ получить заголовок панели без повторения логики Фара по формированию такового? В идеале хотелось бы иметь в API скриптов ф-ю panel.GetPanelTitle, аналогичную panel.GetPanelDirectory, либо же чтобы таблица, возвращаемая из panel.GetPanelDirectory, содержала поле Title с требуемой строкой. В API плагинов это соответствовало бы добавлению команды FCTL_GETPANELTITLE либо добавлению в структуру FarPanelDirectory поля Title.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 5810
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 345 times

Как цивилизованно получить заголовок панели

Post by DrKnS »

lua:print(Object.Title)?
User avatar
HaRT
Moderator
Posts: 9689
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 124 times
Been thanked: 249 times

Как цивилизованно получить заголовок панели

Post by HaRT »

DrKnS wrote: Wed 23 Oct, 2019 23:13 lua:print(Object.Title)?
Пишет: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86
Похоже на ошибку.
Либо надо как-то различать полный и усечённый заголовок.
P.S. К тому же требуется заголовок и пассивный панели тоже.
Last edited by HaRT on Thu 24 Oct, 2019 03:29, edited 1 time in total.
Reason: Добавлен постскриптум про пассивную панель
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13067
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Как цивилизованно получить заголовок панели

Post by John Doe »

На мантисе есть несколько связанных тикетов
buniak_a_h
Posts: 2547
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 319 times
Contact:

Как цивилизованно получить заголовок панели

Post by buniak_a_h »

Извините, что вмешиваюсь в умный разгоовор...
HaRT wrote: Wed 23 Oct, 2019 23:08 Сейчас в ClickToTitleDir это делается варварским способом
Спасибо... :-(
HaRT wrote: Wed 23 Oct, 2019 23:16 К тому же требуется заголовок и пассивный панели тоже.
На самом деле в контексте ClickToTitleDir это обходимо: panel.SetActivePanel(nil,0); Object.Title; и обратно...
Важнее другое: где расположен заголовок. Т.е. для этого скрипта важно именно содержимое строки консоли.
John Doe wrote: Wed 09 Oct, 2019 06:51
buniak_a_h wrote: Wed 09 Oct, 2019 05:30 читать с экрана консоли
У консоли есть апи.
Вот это - интереснее...
User avatar
John Doe
Бюрократ
Posts: 13067
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Как цивилизованно получить заголовок панели

Post by John Doe »

buniak_a_h wrote: Thu 24 Oct, 2019 07:28 Вот это - интереснее...
Пример использования: http://forum.farmanager.com/viewtopic.php?f=60&t=8675
User avatar
HaRT
Moderator
Posts: 9689
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 124 times
Been thanked: 249 times

Как цивилизованно получить заголовок панели

Post by HaRT »

buniak_a_h wrote: Thu 24 Oct, 2019 07:28
HaRT wrote: Wed 23 Oct, 2019 23:08 Сейчас в ClickToTitleDir это делается варварским способом
Спасибо... :-(
Ничего личного, но я не могу охарактеризовать такой способ как-то иначе. И да, я понимаю, что в текущих реалиях менее варварский способ неизвестен.
buniak_a_h wrote: Thu 24 Oct, 2019 07:28
John Doe wrote: Wed 09 Oct, 2019 06:51
buniak_a_h wrote: Wed 09 Oct, 2019 05:30 читать с экрана консоли
У консоли есть апи.
Вот это - интереснее...
Читать прямо из консоли — это, на мой взгляд, ещё хуже, потому что нарушается абстракция Far API.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13067
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Как цивилизованно получить заголовок панели

Post by John Doe »

HaRT wrote: Thu 24 Oct, 2019 11:10 Читать прямо из консоли — это, на мой взгляд, ещё хуже, потому что нарушается абстракция Far API.
А есть (разумная) альтернатива?
C:\…al Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86
Скрипту нужна не только сама строка, но и её горизонтальное смещение.
User avatar
HaRT
Moderator
Posts: 9689
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 124 times
Been thanked: 249 times

Как цивилизованно получить заголовок панели

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS
buniak_a_h
Posts: 2547
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 319 times
Contact:

Как цивилизованно получить заголовок панели

Post by buniak_a_h »

HaRT, John Doe, я уже сделал чтение с экрана через C.ReadConsoleOutputCharacterW … Возможно, это что-то нарушает, но пока нет элементарного сервиса типа чтоб far.SaveScreen возращал не только один объект, а ещё и текст сохранённого экрана (ни или на выбор в зависимости от параметра), а лучше ввести far.GrabScreen(x1,y1,x2,y2) - целостность абстракции Far API не сохранить. Ну, если не использовать пер-анальные методы типа граббера.
HaRT wrote: Thu 24 Oct, 2019 11:10 Ничего личного, но я не могу охарактеризовать такой способ как-то иначе.
В медицине это называется пер-анально… По смыслу грубее, но звучит благородно... ;-)
HaRT wrote: Thu 24 Oct, 2019 11:58 Думаю, можно безопасно пользоваться фактом, что строка отцентрована в панели.
Там (в скрипте) иногда требуется получить точное знакоместо (например, для определения, что кликнули по слэшу). Нечётная ширина панели - и надо знать, как центрирует Фар. Короче, всё решается при помощи C.ReadConsoleOutputCharacterW .Читаешь ВСЮ строку - и оттуда всё будет видно. Правда на больших консолях (высота больше Far.Height) ещё не проверял...
User avatar
DrKnS
Posts: 5810
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 345 times

Как цивилизованно получить заголовок панели

Post by DrKnS »

HaRT wrote: Thu 24 Oct, 2019 11:58можно безопасно пользоваться фактом, что строка отцентрована в панели
...с учётом часов произвольной ширины.
Не делайте так.
User avatar
HaRT
Moderator
Posts: 9689
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 124 times
Been thanked: 249 times

Как цивилизованно получить заголовок панели

Post by HaRT »

DrKnS wrote: Thu 24 Oct, 2019 13:52Не делайте так.
Я понимаю, что способ неправильный, но правильного-то пока нет.
DrKnS wrote: Thu 24 Oct, 2019 13:52 ...с учётом часов произвольной ширины.
Да, опять вылезает необходимость повторения нетривиальной логики Фара (в данном случае логики размещения заголовка правой панели).

Т.е. в идеале хотелось бы иметь возможность получить для каждой панели Луа-таблицу, в которой был бы полный (неусечённый) заголовок панели, усечённый (отображаемый) заголовок панели и его местоположение в координатах окна/консоли.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13067
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 42 times
Been thanked: 319 times

Как цивилизованно получить заголовок панели

Post by John Doe »

HaRT wrote: Thu 24 Oct, 2019 14:03 в идеале хотелось бы иметь возможность получить для каждой панели Луа-таблицу[...]
Если каждую столь же частную потребность тащить в апи...
Post Reply

Return to “Нужна помощь”