Границы выделения перед вставкой текста через ТурбоКонф.ВставитьТекст() не запоминаются редактором модуля

tormozit Открыто Низкий

Нажатие CTRL+Z не позволяет увидеть какой текст был выделен перед вставкой текста. Достаточное большое неудобство для команды "ИР Выделить метод", которую иногда приходится выполнять по несколько раз подряд, немного меняя границы выделенной области. Пытался несколько раз сам найти решение, но до сих пор не удалось.

Тест:
Выделить в модуле любой фрагмент текста больше одного символа и выполнить код

	Пустышка = 0;
	ВыделенныйТекст = "";
	ТурбоКонф.ПолучитьТекстМодуля(ВыделенныйТекст, Пустышка);
	ТурбоКонф.ВставитьТекст(ВыделенныйТекст);

Затем нажать CTRL+Z

Ожидалось что выделится тот же фрагмент, который выделил пользователь. А фактически текст не выделяется.

Если вставлять текст через буфер обмена, то такой проблемы нет, но вставка выполняется с ощутимой задержкой.

	ТурбоКонф.УстановитьБуферОбмена(ВыделенныйТекст);
	ТурбоКонф.ВставитьТекстИзБуфера(); 

Комментарии

bolsun
#1, ред. 30 декабря 2023 17:19

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

Если изменить текст - то будет выполнятся вставка и отмена с выделением.

Пустышка = 0;
ВыделенныйТекст = "";
ТурбоКонф.ПолучитьТекстМодуля(ВыделенныйТекст, Пустышка);
ТурбоКонф.ВставитьТекст(ВыделенныйТекст + "_");

Как я полагают вставляться будет явно другой текст, чем изначальный так что проблем с этим не будет.


tormozit
#2, ред. 30 декабря 2023 17:23

Если вставлять другой текст то проблема будет такая же. Я с ней мучаюсь уже давно. Думал сам найду решение.


bolsun
#3, ред. 30 декабря 2023 17:26

(2) tormozit, делаю Ctrl+Z после вставки


tormozit
#4, ред. 30 декабря 2023 17:53

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

ВыделенныйТекст = "";
Начало = 0;
Конец = 0;
ТурбоКонф.ПолучитьТекстДокумента(ВыделенныйТекст, Пустышка, Начало, Конец);
ТурбоКонф.ВставитьТекст(ВыделенныйТекст + " ");
ТурбоКонф.ВыделитьТекст(Начало, Конец + 1);

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


bolsun
#5, 30 декабря 2023 17:53

(4) tormozit, зачем получать, а затем вставлять одинаковый текст?


tormozit
#6, ред. 30 декабря 2023 17:55

(5) bolsun, Вроде в первом сообщении подробно описал - чтобы сохранились границы выделения в истории отмены редактирования документа, т.е. откаты по CTRL+Z. Только не одинаковый текст, а с добавлением пробела.


bolsun
#7, 30 декабря 2023 17:55

(6) tormozit, так и я написал, что они сохраняются. Даже видео приложил.


tormozit
#8, ред. 30 декабря 2023 17:57

(7) bolsun, сохраняются только если ты вставляешь в те же границы выделения. В моем сценарии пользователь выделил один диапазон. А вставку я выполняю в диапазон, который его содержит. Поэтому раньше в истории сохранялся только внешний диапазон.


tormozit
#9, 30 декабря 2023 17:59

(4) tormozit, понял свою ошибку. Надо не в методе ВставитьТекст() это делать. А отдельный метод нужен - СохранитьГраницыВыделенияДляОтмены()


bolsun
#10, ред. 30 декабря 2023 18:48

(9) tormozit, как по мне, слишком специфический метод для API, мне ни разу такой не понадобился.
Я не понимаю его практического применения.
Сделай свой метод, тоже самое будет.


tormozit
#11, ред. 30 декабря 2023 19:46

Свой метод я сделал

// Просил добавить в API https://turboconf.ru/Tasks/9025
// Сохраним историю границ выделения таким замороченным способом
// Полезно когда вставляемая область содержит выделенную пользователем область
Процедура СохранитьГраницыВыделенияДляОтмены()
	
	ВыделенныйТекст = ""; 
	Пустышка = 0;
	Начало = 0;
	Конец = 0;
	ТурбоКонф.ПолучитьТекстДокумента(ВыделенныйТекст, Пустышка, Начало, Конец);
	ТурбоКонф.ВставитьТекст(ВыделенныйТекст + " ");
	ТурбоКонф.Клавиша(Клавиши.Back);
	//ТурбоКонф.ВыделитьТекст(Начало, Конец); // Почему то вызывает прокрутку окна чтобы выделенный диапазон стал в самый низ

КонецПроцедуры


bolsun
#12, ред. 03 января 2024 20:29

(11) tormozit, для запоминания выделения можно использовать Ctrl+C + Ctrl+V на выделенном фрагменте.
Тогда не будет задействована вставка через буфер.
bolsun изменил статус на Открыто


tormozit
#13, ред. 03 января 2024 20:33

Но после этого же мне все равно вызывать ВставитьТекст(), который опять же через буфер обмена будет вставлять. В чем разница между тем как ВставитьТекст() помещает и вставляет через буфер обмена и CTRL+C + CTRL+V?
Это я больше в контексте связанной проблемы спрашиваю.


bolsun
#14, 03 января 2024 20:33

(13) tormozit, в том, что другое приложение помещает текст в буфер программно. А тут все будет происходить внутри самой платформы, что должно уменьшить вероятность блокировки или неустановки буфера.


bolsun
#15, ред. 03 января 2024 20:37

CTRL+C + CTRL+V также отработает мгновенно, а не как достаточно сложный метод ВставитьТекст().


tormozit
#16, ред. 03 января 2024 20:43

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

Процедура СохранитьГраницыВыделенияДляОтмены()
	
	ВыделенныйТекст = ""; 
	Пустышка = 0;
	Начало = 0;
	Конец = 0;

	//ТурбоКонф.ПолучитьТекстДокумента(ВыделенныйТекст, Пустышка, Начало, Конец);
	//ТурбоКонф.ВставитьТекст(ВыделенныйТекст + " ");
	//ТурбоКонф.Клавиша(Клавиши.Back);

	//ТурбоКонф.ВыделитьТекст(Начало, Конец); // Почему то вызывает прокрутку окна чтобы выделенный диапазон стал в самый низ https://turboconf.ru/Tasks/8888

	ТурбоКонф.КонтролКлавиша(Клавиши.C);
	ТурбоКонф.КонтролКлавиша(Клавиши.V);

КонецПроцедуры

Ссылка скрыта


bolsun
#17, ред. 03 января 2024 20:42

(16) tormozit, после этого желательно добавить задержку 200 мс.И проверить еще раз, если проблема сохранится нужен скрипт и сценарий для воспроизведения.


tormozit
#18, ред. 03 января 2024 20:46

(17) bolsun, с задержкой 200мс проблема длительной вставки 1200мс сохранилась.


bolsun
#19, 04 января 2024 15:55

bolsun изменил статус на Закрыто


tormozit
#20, 25 февраля 2024 12:55

(16) tormozit, иногда вызывает длительную задержку вставки https://turboconf.ru/Tasks/9028
tormozit изменил статус на Открыто


bolsun
#21, ред. 25 февраля 2024 13:01

(20) tormozit, UIAutomation платформы не отвечает, во время операции с буфером. Нужно дождаться окончания операции копирования/вставки из буфера, например окном Поиск, тогда следующий запрос к UIAutomation не зависнет на 5 секунд.

ТурбоКонф.КонтролКлавиша(Keys.C);
ТурбоКонф.КонтролКлавиша(Keys.V);
ТурбоКонф.КонтролКлавиша(Keys.F);
ТурбоКонф.ОткрытьЗакрытьОкно(ОкноКонфигуратора, "Поиск", 5000);


tormozit
#22, 25 февраля 2024 21:02

(21) bolsun, в документации у метода ОткрытьЗакрытьОкно другие параметры:

Параметры

title: Заголовок окна. Строка

timeout: Время ожидания в миллисекундах. Число

containsText: Искать вхождение строки. По умолчанию Ложь. Булево


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

(21) bolsun, Как и в какой момент нужно готовить переменную ОкноКонфигуратора?
Пробовал непосредственно перед вызовом ОткрытьЗакрытьОкно() способы

  1. ТурбоКонф.ПолучитьАктивноеОкно()
  2. Конфигуратор.ОкноВызоваСкрипта
  3. Конфигуратор.ГлавноеОкно

Получаю ошибку:
Преобразование к типу 'Число' не поддерживается}
ТурбоКонф.ОткрытьЗакрытьОкно(АктивноеОкно, "Поиск", 2000);


tormozit
#24, 26 февраля 2024 09:40

(21) bolsun, похоже ты неправильный синтаксис показал. Я заменил на вариант соответствующий документации
ТурбоКонф.ОткрытьЗакрытьОкно("Поиск", 2000);
Теперь ошибки преобразования к типу число не возникает


bolsun
#25, 26 февраля 2024 10:45

(24) tormozit, да, там нет параметра ОкноКонфигуратора, работает с текущим окном конфигуратора.


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