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

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, да, там нет параметра ОкноКонфигуратора, работает с текущим окном конфигуратора.


tormozit
#26, 28 февраля 2024 13:59

(24) tormozit, иногда почему то происходит очень долгое ожидание окна "Поиск", хотя я указал 2000мс. Но по факту секунд 20.

Dd0zE1khI3.mp4

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

Не удалось выполнить скрипт ИРАдаптер->ПереименоватьСлово
ScriptEngine.Machine.ExternalSystemException: {Модуль C:\turboconf\user_scripts\RDT.os / Ошибка в строке: 112 / Внешнее исключение (System.Exception): Время ожидания окна истекло}
ТурбоКонф.ОткрытьЗакрытьОкно("Поиск", 2000);
---> System.Exception: Время ожидания окна истекло
в TurboConf.Core.TurboAPI.TurboApi.WaitFor(IntPtr handle, String title, Int32 maxTime, Boolean containsText, Boolean sendEsc)
в TurboConf.HostApplication.Api.WaitFor(String title, Int32 timeout, Boolean containsText)
в lambda_method(Closure , Api , IValue[] )
в ScriptEngine.Machine.Contexts.AutoContext`1.CallAsProcedure(Int32 methodNumber, IValue[] arguments)
в ScriptEngine.Machine.MachineInstance.ResolveMethodProc(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
--- Конец трассировки внутреннего стека исключений ---
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, Int32 methodIndex, IValue[] arguments)
в ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters)


tormozit
#27, ред. 28 февраля 2024 19:24

(26) Забыл упомянуть, что при этом открывается окно "Поиск" и не закрывается. Сейчас опять это случилось при вставке текста.


bolsun
#28, 28 февраля 2024 19:48

Что-то не так со скриптом, нужно смотреть. Не должно быть подобных проблем.


tormozit
#29, ред. 29 февраля 2024 15:10

(21) bolsun, Даже с этой добавкой бывает 1000мс

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

После чего снова при открытии окна служебных сообщений 20 секунд подвисание.


bolsun
#30, 29 февраля 2024 16:26

И здесь опять закрытие окна DDE Server


tormozit
#31, ред. 29 февраля 2024 20:59

На новой версии с отключенным закрытием окна "DDE сервер" снова проблема (26-27)

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


bolsun
#32, 29 февраля 2024 21:28

(31) tormozit, DDE сервер, скорее всего не относится к проблеме с ожиданием окна Поиск.
Это разные проблемы.
С DDE связан вызов окна Процедуры и функции с задержкой 20 секунд.
Как я уже писал в (28), скорее всего что-то с логикой работы скрипта, я еще не смотрел.


bolsun
#33, ред. 29 февраля 2024 21:30

(31) tormozit, кстати окно DDE сервера также закрывается в этом логе
[29.02.24 20:55:46:131] Закрыто окно DDE Server Window
[29.02.24 20:55:46:131] Warning: TurboConf: Закрыто окно DDE Server Window

Точно отключена эта опция в настройках?


tormozit
#34, 29 февраля 2024 21:39

(33) bolsun, В окне настроек на этом рабочем месте почему то не было нового флажка. Возможно не все файлы заменились при ручном обновлении. Сейчас еще раз заменил все файлы. После перезапуска флажок появился.


tormozit
#35, 29 февраля 2024 23:26

Снова завис на 20 секунд при открытии окна "Служебные сообщения"
Ссылка скрыта


bolsun
#36, ред. 29 февраля 2024 23:46

(35) tormozit, поставь версию ТК, которая до этого долго работала без проблем. Больше пока ничего предложить не могу. Если и на ней будут возникать проблемы - вспомни, что правил в скрипте. Может что-то в системе устанавливал/менял.

Если бы у других пользователей были бы подобные зависания на 20 секунд, давно бы уже написали.


bolsun
#37, 29 февраля 2024 23:45

Причем у пользователей сейчас версия с закрытием DDE и никто не жалуется на зависания.


bolsun
#38, 29 февраля 2024 23:58

Но то что закрытие DDE может приводить к зависаниям - это я подтверждаю.


tormozit
#39, 01 марта 2024 00:04

(38) bolsun, Я его много раз закрывал вручную. Ни разу при этом зависало.


bolsun
#40, ред. 01 марта 2024 00:15

(39) tormozit, ты пробовал поработать на предыдущей версии, которая не обновлялась 2 недели?, я об этом просил еще здесь https://turboconf.ru/Tasks/9219#667b4c74979442f29c9ba51f30c3f9e8


bolsun
#41, 01 марта 2024 00:13

Скачать можно здесь https://turboconf.ru/Forum/Details/8740#751eee288b994d86a8ce4d0f5f6b2ee7

Версия 6.0.8805.32566 от 09.02.24


bolsun
#42, 01 марта 2024 13:26

Попробовал работать на предыдущей версии?


bolsun
#43, 01 марта 2024 13:47

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

  1. Закрытие DDE точно вызывает, но не из-за самого закрытия, а из-за показа уведомления (которое я думал отключил, но не отключил полностью). Причем оно в логе присутствует, но всплывашка не отображается. Т.к. ТК в это время подвисает. Когда я полностью убираю это "уведомление", то добиться подвисания больше не удается, ни разу на несколько десятков тестов. При включении обратно, на первом же тесте - подвисание.
  2. В новой версии, было добавлено логирование позиции каретки в некоторых случаях, что тоже может быть причиной подвисаний из второй группы.

Нашел еще подозрительное место, когда фокус возвращался в диалог клиентского приложения, даже после ЗавершенияВызоваВнешнегоОкна. Но это место и раньше было, но теоретически тоже иногда могло влиять.


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