Выполнение нескольких раз подряд команды без отпускания CTRL

tormozit Открыто

Сделал команду перехода по синтаксическим элементам встроенного языка. Назначил ей сочетание клавиш CTRL+B (анг.). Зажал CTRL. Нажал клавишу "B" (анг.). Команда сработала и вызвала функцию ТурбоКонф.ПерейтиВПозицию() и выделила в тексте нужный элемент.

Снова нажимаю клавишу "B" (анг.), чтобы выполнить переход к следующему элементу текста. Но вместо вызова моей команды выделенный текст заменяется на "и", т.к. Турбоконф виртуально отпустил клавишу "CTRL" и система просто приняла нажатие клавиши "B" (анг.).

Прошу придумать какое то решение проблемы. Хотя бы какую то защиту от порчи текста в этой ситуации.

Комментарии

bolsun
#1, 25 февраля 2024 19:34

Модификаторы обычно восстанавливаются после вызова скрипта. Это отключено при вызова внешнего окна, насколько я помню были какие-то проблемы с этим.
Можно попробовать вернуть стандартное поведение.


tormozit
#2, ред. 25 февраля 2024 19:41

Функция команды из интерактивных действий вызывает только Турбоконф.ПерейтиВПозицию(). Других окон она не открывает и не вызывает отправку нажатия клавиш.

Процедура ПерейтиВНачалоБлока()
	ПодключениеИР = ПодключениеИР(,, Ложь);
	ПолеТекстаПрограммы = ПолеТекстаПрограммыИР(ПодключениеИР, ТекстМодуля, ПозицияВТексте);
	Если Не ПолеТекстаПрограммы.ПерейтиВНачалоБлока() Тогда 
		Возврат;
	КонецЕсли;
	ПерейтиВПозицию(,, ПолеТекстаПрограммы);
КонецПроцедуры

Процедура ПерейтиВПозицию(Знач НомерКолонки = 0, Знач НомерСтроки = 0, Знач ПолеТекстаПрограммы = Неопределено)
	Если ТурбоКонф.ПолучитьВерсиюAPI() < 6 Или НомерКолонки = 1 Тогда
		ТурбоКонф.ПерейтиВПозицию(НомерКолонки, НомерСтроки);
	ИначеЕсли ПолеТекстаПрограммы <> Неопределено Тогда 
		ВыделениеДвумерное = ПолеТекстаПрограммы.ПолеТекста.ВыделениеДвумерное();
		ТурбоКонф.ПерейтиВПозицию(1, ВыделениеДвумерное.НачальнаяСтрока); // Нужно для запоминания позиции в истории переходов конфигуратора и для центриования по высоте
		ВыделениеОдномерное = ПолеТекстаПрограммы.ПолеТекста.ВыделениеОдномерное();
		РазвернутьБлокМодуля(ВыделениеОдномерное.Начало - 1, ВыделениеОдномерное.Конец - 1);
	Иначе 
		Позиция = 0; 
		Пустышка = 0;
		ТурбоКонф.ПолучитьТекстДокумента(Пустышка, Пустышка, Позиция, Позиция);
		ТурбоКонф.ПерейтиВПозицию(1, НомерСтроки);
		Позиция = Позиция + НомерКолонки - 1;
		ТурбоКонф.ВыделитьТекст(Позиция, Позиция); // Почему то делает текущую строку самой нижней в области просмотра
	КонецЕсли;
КонецПроцедуры


bolsun
#3, 25 февраля 2024 19:41

(2) tormozit, тогда нужен рабочий скрипт полностью, для теста


tormozit
#4, ред. 25 февраля 2024 19:45

(3) bolsun, в опубликованном скрипте уже есть похожая команда "Перейти к определению". Назначь ей это сочетание клавиш и будет та же проблема. С этой командой можно встать на любую переменную в тексте модуля и она выделит ее определение. Затем нужно снова ее вызывать, не отпуская CTRL. Тогда текст будет испорчен.


bolsun
#5, ред. 25 февраля 2024 20:23

Скрипт RDT сам принудительно запрещает восстановление модификаторов вызовом
ТурбоКонф.ОтжатьМодификаторы(); //Метод запрещает восстановление модификаторов. после выполнения скрипта

Эта метод - устаревший и используется только для совместимости со старыми версиями. Он был в свое время заменен на метод и свойство, с более понятными названиями.

ТурбоКонф.ОтжатьМодификаторыПослеЗавершенияСкрипта = Истина;  //Свойство устанавливает режим восстановления модификаторов Ctrl, Alt и Shift. после выполнения скрипта

ТурбоКонф.ОтжатьВсеМодификаторы(); // Выполняет принудительное отжатие клавиш Ctrl, Alt и Shift

Если нужно изменить текущее состояние модификаторов, нужно вызывать ТурбоКонф.ОтжатьВсеМодификаторы();


bolsun
#6, ред. 25 февраля 2024 20:25

После того, как я убрал все вызовы ТурбоКонф.ОтжатьМодификаторы() в скрипте RDT - состояние модификаторов после ПерейтиКОпределению по Ctrl+B восстанавливается.


tormozit
#7, 25 февраля 2024 20:40

Закомментировал все вызовы ТурбоКонф.ОтжатьМодификаторы(). У новой команды проблема тоже пропала. Видимо где то во вложенных вызовах вызывалась.
tormozit изменил статус на Закрыто


tormozit
#8, ред. 25 февраля 2024 20:51

Еще бы подобную проблему при вызове подсказки ввода Т9 после открытия штатного окна решить (CTRL зажал, нажал Space, нажал Space - вставляется пробел).


tormozit
#9, ред. 26 февраля 2024 09:45

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


tormozit
#10, 26 февраля 2024 09:01

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


bolsun
#11, 26 февраля 2024 10:29

(9) tormozit, используй ТурбоКонф.ОтжатьВсеМодификаторы(), а НЕ ТурбоКонф.ОтжатьМодификаторы()


tormozit
#12, 26 февраля 2024 17:54

(11) bolsun, а почему? В документации не вижу разницы:

ОтжатьМодификаторы / ReleaseModifiers()
Выполняет принудительное отжатие клавиш Ctrl, Alt и Shift

ОтжатьВсеМодификаторы / ReleaseAllModifiers()
Выполняет принудительное отжатие клавиш Ctrl, Alt и Shift


bolsun
#13, 26 февраля 2024 17:57

(12) tormozit,

В документации не вижу разницы:

Документация нуждается в обновлении.

тут (5) я подробно все расписал.


tormozit
#14, ред. 26 февраля 2024 18:02

(13) bolsun, понял. Я не внимательно прочитал вчера (5)


tormozit
#15, ред. 26 февраля 2024 21:32

(11) bolsun, после переключения на ОтжатьВсеМодификаторы() снова стал стабильно залипать CTRL.
После возвращения на ОтжатьМодификаторы() проблема снова исчезла. Поэтому оставил его. Может позже заменю на равнозначное ТурбоКонф.ОтжатьМодификаторыПослеЗавершенияСкрипта = Истина;


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