Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Позиция в многострочной строке

Я
   MiracMC
 
11.09.18 - 14:02
Добрый день.

Есть элемент формы "Строка" с размером "Не ограничено" и галочкой "Многострочный".

При вводе\редактировании текста в этот элемент формы надо понимать позицию курсора. Иными словами точно знать в какой строке и на каком символе он установлен в текущий момент.

Есть решение такой задачи? Такое вообще возможно?

Заранее благодарен за оперативный ответ.

Спасибо.
 
 
   serpentt
 
1 - 11.09.18 - 14:13
"Зачем"?

Что потом хотите сделать, проанализировать и в какой момент.
   MiracMC
 
2 - 11.09.18 - 14:23
(1) Собственно цель в том что б потом, когда поставили курсов в нужное место, нажать на кнопку на форме и, к примеру, вставить что то заранее заготовленное в текст... спец сивлол, знак табуляции... да что угодно...

просто не всегда Ctr+V помогает...
   ADirks
 
3 - 11.09.18 - 14:28
(0) я нашёл единственный более-менее вразумительный вариант - вкрутить tiny MCE
например так: http://www.1cpp.ru/forum/YaBB.pl?num=1253809274

пробовал всякие Active-X'ы, так они либо слишком примитивные, либо за деньги
   Злопчинский
 
Ведущий
4 - 11.09.18 - 14:47
(2) Мутачное решение. Неограниченная строка это как правило НЕФОРМАЛИЗОВАННЫЕ данные. поэтому что куда ставить - похреню это все только для глазок, а не для автоматизированной обработки.
Как вариант В ЛЮБОЕ МЕСТО пишите типа "%Ключ=Значение%"
гже процент - знак-ограничитиель "формализованных" данных. Ключ - какоето предпределенной значение. Значение - содержимое по ключу.
   Peltik
 
5 - 11.09.18 - 14:48
(2) а почему Ctr+V не всегда помогает?
   vova1122
 
6 - 11.09.18 - 14:50
можно и штатно сделать, но через большую "Ж..". Имеется готовый теккст (многострочный, однострочный) неважно. Сохранить его во временный текст. Потом в нужном месте вставить например пробел. Потом проанализировать в каком месте текст изменился. И в этом месте заменить пробел на свой заготовленный текст
   uno-group
 
7 - 11.09.18 - 14:53
Делаете строку не ограниченной длины на форме. и при перемещении по таблице обновляете ее. редактируется соответственно тоже она при окончании редактирования обновляете нужный реквизит в табличной части.
   MiracMC
 
8 - 11.09.18 - 14:53
(3) Спасибо.. раскуриваю)
(5) как раз вариант с tiny MCE это, по идее, все то что и надо реализовать... задача, по сути, некая верстка текста... примитивная по идее но все же...
(6) тут все равно та же проблема возникнет. не понятно какая позиция поменялась... ну или не пробел а что то другое писать по тексту как "признак курсора"...
   vova1122
 
9 - 11.09.18 - 14:57
(8) почему непонятно? Имеете старый текст (до редактирования) и новый текст (после вставки пробела). Проблема сравнить посимвольно два текста и найти в какой позиции отличие?
   Злопчинский
 
Ведущий
10 - 11.09.18 - 14:58
 
 Рекламное место пустует
   ADirks
 
11 - 11.09.18 - 15:02
(10) это для восьмёрки, там проще
   Peltik
 
12 - 11.09.18 - 15:02
(8)  tiny MCE многабукаф, тут задача проще:

1. Залить в буфер обмена вставляемый текст
2. Имитировать нажатие Ctrl+V

и первое и второе, решается в две строки
   ADirks
 
13 - 11.09.18 - 15:04
(12) ты забыл п.3:  поставить курсор туда, где он был
речь идёт об интерактивном редактировании

а букаф много, тут не поспоришь
   uno-group
 
14 - 11.09.18 - 15:05
Вставлять тильду, ё, ** при окончании редактирования заменять их на нужное
   Peltik
 
15 - 11.09.18 - 15:07
(13) посчитать количество символов во вставляемом тексте и имитировать нажатие клавиши "вправо" N раз :)
   Peltik
 
16 - 11.09.18 - 15:08
(15) сори "влево", у меня эта, сено-солома :)
   MiracMC
 
17 - 11.09.18 - 15:28
(3) Вполне рабочее. И применимо для моих целей.
Единственное не удобно, или я пока не понял как... Автор этого чуда сохраняет и открывает html файлы... то есть передать на вход содержимое поля многострочного без превращения его в html не возможно. Ну и обратно только сохранив в html и потом считав его в поле можно хранить..
Но и это можно пережить.

Спасибо!
   ADirks
 
18 - 11.09.18 - 16:54
(17) немножко кода по этому поводу
в принципе, могу накинуть классов, которые всю эту шляпу обслуживают

///******************************** ADirks 23.12.2013 ************

Функция IsHTML(стр) Экспорт
    Если Найти(стр, "<br />") > 0 Тогда
        Возврат 1;
    ИначеЕсли Найти(стр, "<table") > 0 Тогда
        Возврат 1;
    ИначеЕсли Найти(стр, "<tbody>") > 0 Тогда
        Возврат 1;
    КонецЕсли;
    Возврат 0;
КонецФункции
///******************************** ADirks 23.12.2013 ************


///******************************** ADirks 20.02.2014 ************

Функция LineBreak(н = 1) Export
    стр = "";
    Пока н >= 1 Цикл
        стр = стр + "<br />";
        н = н - 1;
    КонецЦикла;
    Возврат стр;
КонецФункции

Функция HTML_LineBreaks(стр) Export
    Возврат СтрЗаменить(стр, РазделительСтрок, "<br />");
КонецФункции

Функция ToPlainText(Знач стр) Экспорт
    стр = СтрЗаменить(стр, "<br />", РазделительСтрок);
    стр = СтрЗаменить(стр, "&nbsp;", " ");
    стр = СтрЗаменить(стр, "<p>", "");
    стр = СтрЗаменить(стр, "</p>", РазделительСтрок);
    Возврат стр;
КонецФункции
///******************************** ADirks 20.02.2014 ************


///******************************** ADirks 22.11.2016 ************

Функция стрЭкранироватьСпецСимволы(стр) Экспорт
    ScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language = "jscript";
    ScrptCtrl.AddCode(
    "function quote(str)
    |{
    |    str = str.replace(/\r\n/g, '<br>');
    |    str = str.replace(/\n\r/g, '<br>');
    |    str = str.replace('\r', '<br>');
    |    str = str.replace('\n', '<br>');
    |    str = str.replace('\'', '\\\'');
    |    str = str.replace('\""', '\\\""');
    |    return str;
    |}
    |");

    Возврат ScrptCtrl.CodeObject.quote(стр);
КонецФункции
///******************************** ADirks 22.11.2016 ************


///******************************** ADirks 07.04.2016 ************

Функция AddHeaderAndFooter(стр) Экспорт
    Возврат "<html><head>
    |<META http-equiv=Content-Type content=""text/html; charset=windows-1251"">
    |<title></title>
    |</head>
    |<body>"+стр+"</body>
    |</html>";
КонецФункции
///******************************** ADirks 07.04.2016 ************
   Salimbek
 
19 - 11.09.18 - 19:51
(3) Я когда-то тоже сталкивался с такой проблемой. Решил стандартным АктивИкс-ом. Результат выкладывал тут: http://www.1cpp.ru/forum/YaBB.pl?num=1207118421/7#7
   ADirks
 
20 - 12.09.18 - 06:44
(19) вроде бы то что нужно, но в многострочном режиме ведёт себя крайне странно :(
   Peltik
 
21 - 12.09.18 - 08:10
(20) видимо внешние факторы влияют :)
   Salimbek
 
22 - 12.09.18 - 08:23
(20) Я попробовал сунуться в тот код, но он у меня отругался, что Forms.TextBox.1 не смог создать. Х.з. что там с тех пор поменялось уже...
   ADirks
 
23 - 12.09.18 - 08:29
(22) винда поменялась, наверное :)
MS Forms 2.0 (FM20.dll) отсутствует, либо не зарегано, либо версия не 2.0
   ADirks
 
24 - 12.09.18 - 08:33
(22) + но в твоём коде смотреть особо нечего - ActiveX создали, а дальше он сам. Я только добавил Флешка.MultiLine = -1;
И вот в таком режиме оно вроде как многострочное, но визуальное положение курсора вообще не совпадает с тем, куда текст пишется. И перевод строки по Ctrl-Enter - тоже не то что нужно (хотя это может и настраивается, там свойств много).
   ADirks
 
25 - 12.09.18 - 08:59
(24) мда... я же говорю, странные они все какие-то ...
фигушки он сам - вставлять буковки то он и не умеет. Удалять - пожалуйста, курсором возить - тоже может, а редактировать - нет. А принудительно в многострочном режиме получается фигня.
   Salimbek
 
26 - 12.09.18 - 10:04
(25) А... это... Я помню такой трабл. Там дело в том, что я тогда был молод и глуп :-) Т.е. АктивИкс создается на Кнопке - и поэтому события определенные туда просто не прилетают. На создавать на поле ввода и тогда будут и кнопки нажиматься, и буковки прилетать.
   Salimbek
 
27 - 12.09.18 - 10:09
(23) Ага, у меня с 7.7 где-то сервер с 2003-й стоит, на нем и балуюсь.



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует