Нужно немодальное окно подсказки по параметрам вызова метода

tormozit Открыто Средний

В ИР есть свое окно подсказки по параметрам вызова метода
ПоказатьПараметрыМетода
и оно открывается модально из скрипта "ИР адаптер", но не позволяет при этом редактировать код и обновлять подсказку при перемещении каретки.
Родную форму Турбоконф такого же вида я попытаюсь сделать, но сначала нужно обеспечить приход в нее события ПриИзмененииПозиции(). Режим генерации этого события хотелось бы включать такими способами

  1. Программно. Например вызовом Турбоконф.УстановитьРежимПодсказкиПараметров(НовыйРежим:Булево)
  2. Автоматически при вводе символов: "(", ","

И он должен отключаться

  1. Программно. Например вызовом Турбоконф.УстановитьРежимПодсказкиПараметров(НовыйРежим:Булево)

Также это окно должно автоматически двигаться по вертикали вместе с кареткой (располагаться всегда под ней).

Реализуема ли такая схема?

Комментарии

tormozit
#1, ред. 29 декабря 2023 08:48

Очень не хватает этого режима. Он есть у всех аналогов и в самом ИР в обычном приложении. Если у метода 5+ параметров и штатный анализатор конфигуратора его не понимает, то сейчас приходится по несколько раз вызывать модальную подсказку параметров ИР.

В идеале бы конечно хотелось открывать родное окно ИР как сейчас, но чтобы

  1. скрипт сразу завершался после открытия окна
  2. окно ИР не влияло на работу окна конфигуратора
  3. я просто отправлял бы окну ИР новые координаты и позицию в тексте


tormozit изменил статус на Открыто


tormozit
#2, ред. 04 июня 2024 07:29

(1) Продумал еще другие варианты. Теперь кажется что эта схема будет к тому же самой простой в реализации с обеих сторон (Турбоконф и адаптер).

  1. По команде пользователя или автоматически после ввода "(", "," я открываю в невидимом главном окне приложения ИР немодально окно подсказки вызова метода. Управление возвращается в мой скрипт.
  2. Я вызываю новый метод Турбоконф.ПодчинитьОкно(Заголовок, ИДПроцесса). Туброконф в этом методе меняет родителя окна подсказки на окно конфигуратора и помещает его поверх окна конфигуратора, чтобы оно было видимым при фокусе в окне конфигуратора.
  3. Я вызываю новый метод Турбоконф.НачатьОтслеживаниеПоложенияКаретки(). Туброконф начинает генерировать новое событие ПриПеремещенииКаретки() (не чаще раз в 200мс и сразу при нажатии Вверх/Вниз) и ПриНажатииEscape() пока поле этого документа активно.
  4. В обработчике события ПриПеремещенииКаретки() я либо обновляю подсветку текущего параметра и позицию окна подсказки новым методом ТурбоКонф.ПереместитьОкноПодКаретку(), либо закрываю окно подсказки и вызываю новый метод Турбоконф.КончитьОтслеживаниеПоложенияКаретки().
  5. В обработчике события ПриНажатииEscape() я закрываю окно подсказки и вызываю Турбоконф.КончитьОтслеживаниеПоложенияКаретки()


tormozit
#3, ред. 04 июня 2024 07:31

@bolsun видишь в схеме (2) трудно реализуемые места?


bolsun
#4, 05 июня 2024 17:22

(3) tormozit, выглядит все костыльно. Нужна нормальная подсказка как например в T9.


tormozit
#5, ред. 05 июня 2024 18:01

(4) bolsun, хотелось бы понять конкретно что тебе не нравится в предлагаемом подходе. Кажется проверку концепции сделать будет несложно

  1. (чисто моя работа)
  2. Подчинение чужого окна ты уже вроде бы освоил. Поэтому думаю тут тебе недолго делать.
  3. Отслеживание положения каретки и отправку в скрипт события делать придется при любом подходе, т.к. в обработчике события будет сложный анализ текста, а у меня он уже готов
  4. Перемещение окна под каретку у нас тоже фактически уже сделано
  5. Закрытие можно пока ручное оставить для пробы


bolsun
#6, 05 июня 2024 19:28

(5) tormozit, как минимум выглядеть будет странно, но это ладно.
Основная проблема - ТурбоКонф приостанавливается на время вызова внешнего окна, поэтому при редактировании не будут работать ни хоткеи, ни T9, ни все остальные функции.


tormozit
#7, 05 июня 2024 20:40

(6) bolsun, основной проблемы нет, ведь я указал что окно открывается немодально, т.е. сразу после открытия окна управление возвращается потоку скрипта, а он сразу вернет управление Турбоконфу. Обновления окна будут происходить через событие ПриПеремещенииКаретки(), которое будет генерировать Турбоконф.


bolsun
#8, 05 июня 2024 21:57

(7) tormozit, подчинение окна конфигуратору, тоже может вызывать побочные эффекты. Сколько бы раз я ни пробовал эту реализацию, все время что-то возникало. Мы даже в свое время отказались от этой реализации в методе НачатьВызовВнешнегоОкна.


bolsun
#9, ред. 05 июня 2024 21:59

В общем, это даже если поверхностно взглянуть на предложенный механизм. Что еще возникнет в процессе, никто не знает.


tormozit
#10, ред. 06 июня 2024 21:35

(8) bolsun, подчинение окна сделаю сам. Можешь сделать событие ПриПеремещенииКаретки? И желательно метод ПереместитьОкноПодКаретку(hWND)


tormozit
#11, ред. 07 июня 2024 09:20

Сделал проверку концепции на своих костылях. Для работы требуется установленный Autohotkey.
Вызывай команду "Показать параметры метода". Откроется немодально моя форма подсказки. Клавишами Вправо/Влево перемещай каретку. Текущий параметр будет обновляться. Клавиша Escape закрывает окно подсказки. Для этого пришлось добавить опасные команды перехвата клавиш Escape/Left/Right.

RDT.os

Не увидел серьезных недостатков в этой концепции.
Чего не хватает в первую очередь:

  • Нормальное оповещение скрипта о перемещении каретки, т.е. событие ПриПеремещенииКаретки(ТекстМодифицирован:Булево) без перехвата скриптом клавиш Left/Right и очень важно чтобы она соблюдало предельную частоту, т.е. вызывалось не чаще 1 раз в 200мс по принципу ПодключитьОбработчикОжидания()
  • Нормальное оповещение скрипта о нажатии Escape и смене активного поля в режиме слежения за перемещением каретки, т.е. событие ПриНажатииEscape

Ну и хорошо бы обойтись без Autohotkey, т.к. через него 2 простые функции WinAPI зовутся. Ты легко мог бы добавить такой метод в свое API. Его реализация выглядит так

Title := "Метод:"
hParent := WinExist("A")
WinGet, hChild,, %Title%
DllCall("SetParent", "Ptr", hChild, "Ptr", hParent)
WinMove, ahk_id %hChild%,, ХХ, YY


tormozit
#12, ред. 07 июня 2024 09:11

Кстати сегодня в процессе отладки этой функции не меньше 10 раз столкнулся с ошибкой https://turboconf.ru/Tasks/9510 . Если избавиться от запуска скрипт Autohotkey, то еще и не будет потребности ее исправлять.


bolsun
#13, 07 июня 2024 19:24

(11) tormozit,

Title := "Метод:"
hParent := WinExist("A")
WinGet, hChild,, %Title%
DllCall("SetParent", "Ptr", hChild, "Ptr", hParent)
WinMove, ahk_id %hChild%,, ХХ, YY

Да я знаю как это сделать и пробовал несколько раз использовать. Всегда были побочки (залипания клавиш, глюки каретки и т.д.).
Поэтому еще раз, я против такого подхода.


bolsun
#14, ред. 07 июня 2024 19:34

Я могу добавить эти методы, но завтра появится десять новых тикетов с непонятными глюками, на каждый нужно время, чтобы разобраться и выяснить что они вызваны этими модификациями.
Столько свободного времени у меня на это нет, проще сделать все через нормальную панель, которая будет работать предсказуемо и стабильно.


bolsun
#15, ред. 07 июня 2024 20:19

Задача и так не простая.
Панель должна будет:

  1. Не показываться, если появился штатный тултип по параметрам.
  2. Корректно обрабатывать все перемещения каретки, клики мышью.
  3. Обрабатывать смену фокуса из документа, туда/обратно в тултип и т.д.
  4. Правильное скрытие по Esc, при автовызове подсказки и т.д.
  5. Обработчики изменения позиции каретки и текущего текста.
  6. Прокрутку окна модуля
  7. Правильное расположение в окне документа, в зависимости от высоты снизу и сверху, справа и слева
  8. Прокрутка самой подсказки с выделением текста и копированием.
  9. HTML форматирование.
  10. Обработчик кликов по ссылкам.

Это на первый взгляд, даже без учета вычисления содержимого подсказки и текущего параметра (это будет в обработчиках).


tormozit
#16, ред. 08 июня 2024 08:08

(14) bolsun, тогда сделай хотя бы выполнение процедуры скрипта с задержкой, т.е. аналоги ПодключитьОбработчикОжидания и ОтключитьОбработчикОжидания. https://turboconf.ru/Tasks/9521


tormozit
#17, ред. 08 июня 2024 10:52

(11) tormozit, Обширно протестировал этот подход. Нашел проблему. Смена активного поля внутри такого окна 1С приводит к исчезновению этого окна. Предположительно в окне есть внутренняя связь с родительским окном, которое в этот момент невидимо, а при смене фокуса идет какое то общение с родительским окном и переустановка каких то атрибутов от него.
Чтобы сделать такое окно снова видимым, пока нашел только способ - переоткрывать его.
Для главного сценария - пассивного использования этого окна - эта проблема не играет роли. Предполагаю варианты обхода:

  • выяснить какие атрибуты окна изменяются и периодически восстанавливать их
  • сразу при получении фокуса ввода окном переоткрывать его в модальном режиме


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера